Willkommen in der Webstatt
User-1 am 22.06.06 01:18

Hi Leute,
möchte gerne in meinem gbook ein sicherheitscode machen...
reicht es da nicht aus wenn ich ein bild drin lasse mit z.B. "1234" und das jeder 1234 eintippen muss? die bots können die bilder ja eh nicht auslesen... oder?
und wenn ja wie mach ich das, dass überprüft wird das wenn man im textfeld "1234"
eingetippt hat, dass es überprüft wird????
bitte um hilfe :)

danke euch im vorraus :)

netcup.de Warum gibt es hier Werbung?
User-2 am 22.06.06 11:22

diese Teile nennen sich captcha bilder: http://de.wikipedia.org/wiki/Captcha

da unten steht auch ein recht guter link um diese Bilder zu generieren
http://www.deruwe.de/captcha.html

steht eigentlich alles wichtige drin


aber brb hat auch was gutes entworfen gehabt...da musste man in ein kreuz klicken..vielleicht finde ich das noch

User-3 am 22.06.06 11:29

Quote
Original von xyz-161
aber brb hat auch was gutes entworfen gehabt...da musste man in ein kreuz klicken..vielleicht finde ich das noch

Das war das hier: [URL]http://www.nögel.de/mawcha/index.php[/URL]

User-4 am 22.06.06 12:26

machs doch so:
<?php
header("Content-type: image/png");
$text = rand(10000, 99999);
$im = imagecreatetruecolor(70,30);
$bg_color = ImageColorAllocate($im, 0, 0, 0);
$font_color = ImageColorAllocate($im, 255, 255, 255);
imagestring ($im, 5, 5, 7, $text, $font_color);
imagepng($im);
?>


und dann prüfste per if-bedingung, ob die eingabe mit $text übereinstimmt.
if(!($_POST['eingabe'] == $text)){
echo "Der Sicherheitscode stimmt nicht!";
}

User-1 am 22.06.06 12:26

danke schonmal, damit kann ich leider nicht viel anfangen weil ich davon nichts verstehe (php) aber es muss möglich sein wenn es nu ein bild ist wo z.B. immer nur "1234" drinsteht oder?

User-2 am 22.06.06 13:54

wenn immer nur eine Zahlenfolge drinsteht...dann ist das ja blöd...dann bringt das System wieder überhaupt nichts...dann kannste gleich ein bild herstellen wo 1234 draufsteht und ne normale formulareingabe machen ;) diese Captchas basieren ja dadrauf, dass sie zufällig sind ;)

User-5 am 22.06.06 14:31

Quote
Original von xyz-161
wenn immer nur eine Zahlenfolge drinsteht...dann ist das ja blöd...dann bringt das System wieder überhaupt nichts...dann kannste gleich ein bild herstellen wo 1234 draufsteht und ne normale formulareingabe machen ;) diese Captchas basieren ja dadrauf, dass sie zufällig sind ;)

das hat er doch vor :D

User-6 am 22.06.06 18:02

@crokked

Dein Code hat nen Fehler:

Meldung:

Quote
Die Grafik "http://localhost/captcha/1.php" kann nicht angezeigt werden, weil sie Fehler enthält.

User-4 am 22.06.06 19:14

BNS das kann net sein.
auf jeden fall klappt bei mir der code einwandfrei.
hier nochmal (habs n bisschen erweitert):
<?php
header("Content-type: image/png");
$text = rand(10000, 99999);
$im = imagecreatetruecolor(70,30);
$bg_color = ImageColorAllocate($im, 0, 0, 0);
$font_color = ImageColorAllocate($im, 255, 255, 255);
imagestring ($im, 5, 20, 7, $text, $font_color);
imageline($im, 0, 0, 30, 30, $font_color);
imageline($im, 60, 0, 0, 60, $font_color);

imagepng($im);
?>

User-1 am 23.06.06 14:48

bei mir kommt nun folgender fehler:
Warning: Cannot modify header information - headers already sent by (output started at /home/www/nch901/html/blog/index.php:10) in /home/www/nch901/html/blog/gb.php on line 70
‰PNG 

User-7 am 23.06.06 15:09

nehm die erste und die letzte zeile (bei xyz-47s code) weg..

User-1 am 23.06.06 15:42

jetzt kommt kein fehler aber es wird auch nichts angezeigt...

User-4 am 23.06.06 15:55

hmm... also bei mir klappts einwandfrei
demo gibts hier

User-6 am 23.06.06 17:23

Hat das vielleicht was damit zu tun das ich es auf dem localhost teste?

User-4 am 23.06.06 17:37

öhm also bei mir klappts auch aufm localhost. aber probiers einfach mal auf php-space ;)

User-5 am 23.06.06 17:40

also besonders schwer zu knacken is das ja nich gerade

User-2 am 23.06.06 19:30

das ist ja sooo easy zu knacken ;) aber gut...es hilft gegen ein paar bots *fg*besser als keins :D

verzerr die Buchstaben noch ein bisschen...setze schatten hinter die Buchstaben (das hilft auch schon), bau einen körnigen Hintergrund ein...das sind so sachen, die du noch machen musst *fg*

User-7 am 24.06.06 00:00

An dieser Stelle möchte ich auf brb`s [url=http://www.nögel.de/mawcha/]mawcha[/url] hinweisen =)

User-2 am 24.06.06 00:08

ist schonmal drauf verwiesen worden von mir und Zero ;D

User-7 am 24.06.06 00:09

argh scheiße :D

User-1 am 24.06.06 23:05

immer noch der fehler:

Warning: Cannot modify header information - headers already sent by (output started at /home/www/nch901/html/blog/index.php:10) in /home/www/nch901/html/blog/captcha.php on line 2
‰PNG 

aber wenn ich die datei aufrufe (klick)
momentan habe ich die Datei includet dort kommt der fehler..

link zum fehler:

http://www.m1Ro.de

User-8 am 24.06.06 23:41

Boah. Hammer. Du kannst doch nicht einfach das Bild in den HTML Code klatschen.. Ich sag nur <img>.

User-1 am 24.06.06 23:46

ne, habe die datei captcha.php includet..

danke übrigends nun klappt es :P

nun folgendes:
habe in der datei wo alles in die tabelle geschrieben wird folgendes eingefügt:

if(!($_POST['eingabe'] == $text)){
die(" Der Sicherheitscode stimmt nicht!");
}


nur es klappt nicht, es wird einfach eingetragen

User-5 am 25.06.06 00:17

du musst $text auch irgendwo zwischenspeichern (session, db etc. nur nicht cookie oder hidden field!!). sonst kannste es ja nicht prüfen

User-7 am 25.06.06 01:44

was dat denn?if(!($_POST['eingabe'] == $text)){
dat muss so: if($_POST['eingabe'] != $text){

User-1 am 25.06.06 13:06

Quote
Original von xyz-193
du musst $text auch irgendwo zwischenspeichern (session, db etc. nur nicht cookie oder hidden field!!). sonst kannste es ja nicht prüfen


wie mach ich das? mit sessions habe ich mich nie richtig beschäftigt... :(

User-8 am 25.06.06 13:13

> mit sessions habe ich mich nie richtig beschäftigt... :(
xyz-48n tu das jetz: http://de.php.net/manual/de/ref.session.php

User-9 am 25.06.06 13:14

session_start();
$_SESSION['text'] = $text; // Text entspricht dem generierten , nicht dem eingebenen Captcha


auslesen tust du den Wert für 'text' in der Session dann einfach mit

$_SESSION['text'];

und benutzt es für den abgleich mit dem eingegeben Captcha

if ($eingegebenerCaptcha != $_SESSION['text']) {
echo "Falscher oder kein Captcha.";
}


Müsste hinhauen, oder ?

mfg Alex

User-1 am 25.06.06 13:38

irgendwie verstehe ich nicht wo ich was einfügen muss...
habe drei dateien
- gb.php
- eintragen.php
- captcha.php

weiss net wo was rein soll :(

User-8 am 25.06.06 14:04

In der captcha.php speicherst du den Kontrollwert in der Session, den du in der eintragen.php dann
überprüfen kannst.

User-1 am 25.06.06 20:14

seltsam, irgendwie klappt das nicht...
so sieht meine captcha.php aus:
<?php
$text = rand(10000, 99999);
session_start();
$SESSION['text'] = $text;

header("Content-type: image/png");

$im = imagecreatetruecolor(70,25);
$bg_color = ImageColorAllocate($im, 0, 0, 0);
$font_color = ImageColorAllocate($im, 255, 255, 255);
imagestring ($im, 5, 20, 7, $text, $font_color);
imageline($im, 0, 0, 30, 30, $font_color);
imageline($im, 60, 0, 0, 60, $font_color);

imagepng($im);
?>


und in der eintragen.php
if ($eingegebenerCaptcha != $SESSION['text']) {
echo "Falscher oder kein Captcha.";
}


so habe ich es im gb:

<img src="captcha.php" />
input type="text" name="eingegebenerCaptcha" size="5" maxlength="25">

User-10 am 26.06.06 00:26

register_globals!
Du musst statt $eingegebenerCaptcha $_POST['eingegebenerCaptcha'] benutzen.

User-1 am 26.06.06 01:58

nun habe ich es in der eintragen.php geändert
so:
if ($_POST['eingegebenerCaptcha'] != $SESSION['text']) {
echo "Falscher oder kein Captcha.";
}


nur es klappt immer noch nicht wenn man kein code angibt trägt er immer noch ein...

EDIT: wenn ich nun alles ausfülle und auch captcha(einen falschen code) angebe gibt er aus
"Falscher oder kein Captcha." aber trägt trotzdem ein

User-2 am 26.06.06 09:00

ja weil Session[text] wahrshceinlich leer ist;D wie sieht es mit einem session_start am anfang der datei aus ?
wenn du den Captcha leer lässt..dann sollte er nichts ausgeben ;D

imm wenn du Session Variablen verwenden willst muss du die Session in der Datei serialisieren ;) und dass geht nunmal über session_start

User-4 am 26.06.06 12:43

und ich glaube, du gibts einfach nur ein echo aus, wenn der code nicht stimmt. versuchs mal mit if ($eingegebenerCaptcha != $SESSION['text']) {
die('Der Sicherheitscode ist nicht richtig');
}

weil da wird das script automatisch gestoppt, also dann kann kein eintrag mehr hinzugefügt werden :D
die - PHP.net Manual

User-10 am 26.06.06 13:21

Außerdem heißt es doch $_SESSION Oo

User-1 am 26.06.06 14:38

hab jetzt in der eintragen.php folgendes hinzugefügt:
session_start();
nun klappt es aber immer noch net

User-9 am 26.06.06 14:43

Quote
Original von xyz-207
Außerdem heißt es doch $_SESSION Oo


Ich wusste, dass eine Woche Klassenfahrt ohne Programmieren selbiges leiden lässt. Ich habe dummerweise den '_' vergessen. Tschuldigung.

mfg Alex

User-1 am 26.06.06 14:45

wird immer noch eingetragen nun kommt folgender fehler:
Warning: session_start(): Cannot send session cache limiter - headers already sent (output started at /home/www/nch901/html/blog/index.php:10) in /home/www/nch901/html/blog/eintragen.php on line 2

Zeile2:
session_start();

User-11 am 26.06.06 14:47

Nur mal zur info weil ein paar diese fehlermeldung hatten

Warning: Cannot modify header information - headers already sent by ([COLOR=orangered]output started at [/COLOR]/home/www/nch901/html/blog/index.php:10) in /home/www/nch901/html/blog/captcha.php on line 2


Es darf vorher keine Ausgabe erfolgt sein sonst kann man keinen Header mehr senden. Das wurde in den neueren PHP Version unterbunden.
Also ganz oben vor jedem Code ausführen bevor ein echo oder dergleichen erfolgt.

Nur zur Info weil keiner drauf eingegangen ist.

PS: Selbiges gilt für Sessions
Warning: session_start(): Cannot send session cache limiter - headers already sent ([COLOR=orangered]output started at[/COLOR] /home/www/nch901/html/blog/index.php:10) in /home/www/nch901/html/blog/eintragen.php on line 2



MFG

User-1 am 26.06.06 14:51

so sieht nun meine eintragen.php aus:
<?php session_start();
include("cfg.php");
if (!isset($action)) { $action=""; }
if ( !$name)
{
die(" Bitte geben Sie einen Namen an. <a href=\"javascript:back()\">zurück</a>");
}
if (!isset($action)) { $action=""; }
if ( !$eintrag)
{
die(" Bitte geben Sie ein Text an. <a href=\"javascript:back()\">zurück</a>");
}
if ($eingegebenerCaptcha != $_SESSION['text']) {
die('Der Sicherheitscode ist nicht richtig');
}
$q = "SELECT * FROM `guestbook`";
$s = mysql_query($q);
if (!$s) { echo "Error in your query:" .mysql_error(); };
?>
<?
$q = mysql_query("select * from guestbook where ip = '".$_SERVER['REMOTE_ADDR']."' and timestamp - now() < 300") or die(mysql_error());
if(mysql_num_rows($q) > 0) die("<font color=\"#000000\">Spam Filter Aktiv, Versuch es sp&auml;ter nochmal!</font>");

$q = mysql_query("INSERT INTO `guestbook` (name, email, eintrag, www, ip, date) VALUES ('".htmlentities($_POST['name'])." ', '".htmlentities($_POST['email'])."', '".htmlentities($_POST['eintrag'])."', '".htmlentities($_POST['www'])."', '".($_POST['ip'])."', '".time()."') ") or print mysql_error();
echo "<font color=\"#000000\">Vielen xyz-48k für deinen Eintrag. Du wirst Weitergeleitet</font>";
echo "<meta http-equiv=\"refresh\" content=\"1; URL=index.php?s=gb\">
";
?>


User-8 am 26.06.06 17:34

Weg mit dem whitespace außerhalb der PHP tags!

User-1 am 26.06.06 19:09

mhh... whitespace ???
noch nie gehört was meinst du damit??

User-5 am 26.06.06 19:10

leerzeichen

User-6 am 08.07.06 23:20

Hab selber ma versucht was zu machen:

<?php
Header("Content-Type: image/png");

##################################################
function getstring() {
$getstring = " ";
$laenge=5;
$string="ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";

mt_srand((double)microtime()*1000000);

for ($i=1; $i <= $laenge; $i++) {
$getstring .= substr($string, mt_rand(0,strlen($string)-1), 1);
}

return $getstring;
}
##################################################

##################################################
$width = 80;
$height = 22;
$img = ImageCreate($width, $height);
##################################################


##################################################
$black = ImageColorAllocate($img, 0, 0, 0);
$white = ImageColorAllocate($img, 255, 255, 255);
##################################################


##################################################
ImageFill($img, 0, 0, $white);
ImageString($img, 5, 10, 3, $getstring, $black);
##################################################

ImagePNG($img);
ImageDestroy($img);
?>


Doch leider wird nichts angezeigt nur ein weißes Bild, wiso?

User-8 am 08.07.06 23:28

$getstring ist leer.

Hier meine Referenzimplementierung zur Erzeugung eines Zufalls-Strings :P
<?php
randstr($len, $min = 65, $max = 90){
for ($i = 0; $i < $len; $i++)
$res .= char(mt_rand($min, $max));
return $res;
}
?>

User-6 am 08.07.06 23:32

wird aber gefüllt mit Zeichen aus dem $string

User-12 am 08.07.06 23:40

$getstring .= substr($string, mt_rand(0,strlen($string)-1), 1);
Lässt sich übrigens Kürzer schreiben:
$getstring .=$string{mt_rand(0,strlen($string)-1)};

Das Manual schreibt zu mt_srand:

Quote
Anmerkung: Seit PHP 4.2.0 ist es nicht mehr nötig, den Zufallszahlengenerator zu initialisieren, bevor man ihn benutzt.


EDIT: Dein Fehler: Du rufst die Funktion, die du definierst, überhaupt nicht auf, wenn ich es nicht übersehen habe. Logisch dass die Variable leer ist, wie Milahu sagt.

User-6 am 08.07.06 23:44

ok, auch wenn es nicht nötig ist lasse ich es zur sicherheit.

Aber trotzdem passiert nweiterhin nichts.

User-12 am 08.07.06 23:55

Du hast meinen Edit gelesen, nehm ich an..? :D

User-6 am 09.07.06 00:03

Hab den EDIT nicht gesehen, aber so müsste es gehen, geht aber nicht:

<?php
Header("Content-Type: image/png");

##################################################
function getstring() {
$getstring = " ";
$laenge=5;
$string="ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";

mt_srand((double)microtime()*1000000);

for ($i=1; $i <= $laenge; $i++) {
$getstring .=$string{mt_rand(0,strlen($string)-1)};
}

return $getstring;
}
##################################################
getstring();
##################################################
$width = 80;
$height = 22;
$img = ImageCreate($width, $height);
##################################################


##################################################
$black = ImageColorAllocate($img, 0, 0, 0);
$white = ImageColorAllocate($img, 255, 255, 255);
##################################################


##################################################
ImageFill($img, 0, 0, $white);
ImageString($img, 5, 10, 3, $getstring, $black);
##################################################

ImagePNG($img);
ImageDestroy($img);
?>

User-5 am 09.07.06 00:08

ersetzgetstring();
durch
$getstring = getstring();

User-6 am 09.07.06 00:11

thx.

Aber noch eine Frage wenn ich da Bild einbinnde will ich auch noch die Variable $getstring übergeben, wie mache ich das?

Ich dachte das geht einfach so, geht es aber nicht..

User-1 am 09.07.06 00:41

ich weiss nicht ob es was bringt aber ich würde es so machen:

$string="AbCdEfGhIjKlMnOpQrStUvWxYZ0123456789";

dann sind es nicht alles grosse buchstaben ist ein bisschen anspruchsvoller :P

User-8 am 09.07.06 08:39

> Aber noch eine Frage wenn ich da Bild einbinnde will ich auch noch die Variable $getstring übergeben, wie mache ich das?

http://de3.php.net/manual/de/reserved.variables.php#reserved.variables.get

User-6 am 09.07.06 11:24

Und wie kann ich die Variable $getstring zu einer $_GET machen??

Also ich verstehe das nicht ganz was da steht..

User-5 am 09.07.06 11:26

lol...also wenn du das per get übergiebst, bringt dir das gar nix mehr...

dann braucht der bot ja nichtmal das bild lesen, sondern du hast es ihn ja plain vorgesetzt

User-6 am 09.07.06 11:28

http://de3.php.net/manual/de/reserved.va...d.variables.get

Da steht das ja das man das mit GET machen soll - aber wenn es unsicher ist (Hätte ich ja auch sofort drauf können), also wie soll ich das dan am besten übergeben??

User-5 am 09.07.06 11:29

session oder db

User-6 am 09.07.06 11:36

mit db will ich nicht da es mir dan zu unübersichtlich wird und mit sessions kenne ich mich nicht aus.

User-6 am 09.07.06 12:33

Noch eine Frage zu:

Quote
Original von xyz-47
machs doch so:
<?php
header("Content-type: image/png");
$text = rand(10000, 99999);
$im = imagecreatetruecolor(70,30);
$bg_color = ImageColorAllocate($im, 0, 0, 0);
$font_color = ImageColorAllocate($im, 255, 255, 255);
imagestring ($im, 5, 5, 7, $text, $font_color);
imagepng($im);
?>


und dann prüfste per if-bedingung, ob die eingabe mit $text übereinstimmt.
if(!($_POST['eingabe'] == $text)){
echo "Der Sicherheitscode stimmt nicht!";
}



Hier wird ja was aus dem Bild übergeben nähmlich $text dan muss das doch auch mit $getsring gehen, oder?

User-8 am 09.07.06 14:17

> Hier wird ja was aus dem Bild übergeben nähmlich $text

Das halte ich für ein Gerücht. ;)

Den string musst du entweder per session oder manuell irgendwo speichern.

User-6 am 09.07.06 14:21

Man könnte es ja mit Cookies machenaber das ist nicht so gut oder???
Oder kann mir jemand erklären wie ich das mit sessions am besten machen kann??

User-8 am 09.07.06 14:25

> Man könnte es ja mit Cookies machenaber das ist nicht so gut oder???

Man könnte einen Hash des Kontrollwerts im Cookie speichern. Warum auch nicht?

> Oder kann mir jemand erklären wie ich das mit sessions am besten machen kann??

Wer lesen kann ist klar im Vorteil. http://tut.php-q.net/sessions.html

User-6 am 09.07.06 14:31

wie einen hash den kann man dan janicht mehr entschlüsseln, oder?
Und was soll ich dan hashen was ist der Kontrollwert??

Creative Commons Lizenzvertrag
Alle Inhalte des Webstatt-Archivs stehen unter einer Creative Commons Namensnennung - Weitergabe unter gleichen Bedingungen 3.0 Unported Lizenz.

Impressum & Kontakt