Willkommen in der Webstatt Zum Webstatt Blog und Stories
beme 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?
nuit nuit 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

Zeronet Zeronet am 22.06.06 11:29

Quote
Original von nuit
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]

crooked 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!";
}

beme 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?

nuit nuit 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 ;)

Snake am 22.06.06 14:31

Quote
Original von nuit
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

BNightSpeeder 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.

crooked 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);
?>

beme 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 

Franky Franky am 23.06.06 15:09

nehm die erste und die letzte zeile (bei crookeds code) weg..

beme am 23.06.06 15:42

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

crooked am 23.06.06 15:55

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

BNightSpeeder am 23.06.06 17:23

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

crooked am 23.06.06 17:37

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

Snake am 23.06.06 17:40

also besonders schwer zu knacken is das ja nich gerade

nuit nuit 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*

Franky Franky 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 =)

nuit nuit am 24.06.06 00:08

ist schonmal drauf verwiesen worden von mir und Zero ;D

Franky Franky am 24.06.06 00:09

argh scheiße :D

beme 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

milahu milahu am 24.06.06 23:41

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

beme 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

Snake 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

Franky Franky am 25.06.06 01:44

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

beme am 25.06.06 13:06

Quote
Original von Snake
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... :(

milahu milahu am 25.06.06 13:13

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

Al3x0r Al3x0r 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

beme 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 :(

milahu milahu 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.

beme 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">

Sven Sven am 26.06.06 00:26

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

beme 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

nuit nuit 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

crooked 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

Sven Sven am 26.06.06 13:21

Außerdem heißt es doch $_SESSION Oo

beme am 26.06.06 14:38

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

Al3x0r Al3x0r am 26.06.06 14:43

Quote
Original von Sven
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

beme 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();

brainnrg 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

beme 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 Dank für deinen Eintrag. Du wirst Weitergeleitet</font>";
echo "<meta http-equiv=\"refresh\" content=\"1; URL=index.php?s=gb\">
";
?>


milahu milahu am 26.06.06 17:34

Weg mit dem whitespace außerhalb der PHP tags!

beme am 26.06.06 19:09

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

Snake am 26.06.06 19:10

leerzeichen

BNightSpeeder 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?

milahu milahu 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;
}
?>

BNightSpeeder am 08.07.06 23:32

wird aber gefüllt mit Zeichen aus dem $string

Wasili 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.

BNightSpeeder am 08.07.06 23:44

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

Aber trotzdem passiert nweiterhin nichts.

Wasili am 08.07.06 23:55

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

BNightSpeeder 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);
?>

Snake am 09.07.06 00:08

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

BNightSpeeder 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..

beme 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

milahu milahu 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

BNightSpeeder 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..

Snake 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

BNightSpeeder 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??

Snake am 09.07.06 11:29

session oder db

BNightSpeeder 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.

BNightSpeeder am 09.07.06 12:33

Noch eine Frage zu:

Quote
Original von crooked
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?

milahu milahu 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.

BNightSpeeder 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??

milahu milahu 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

BNightSpeeder 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