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 :)
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
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]
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!";
}
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?
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 ;)
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
@crokked
Dein Code hat nen Fehler:
Meldung:
Quote
Die Grafik "http://localhost/captcha/1.php" kann nicht angezeigt werden, weil sie Fehler enthält.
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);
?>
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
nehm die erste und die letzte zeile (bei xyz-47s code) weg..
jetzt kommt kein fehler aber es wird auch nichts angezeigt...
hmm... also bei mir klappts einwandfrei
demo gibts hier
Hat das vielleicht was damit zu tun das ich es auf dem localhost teste?
öhm also bei mir klappts auch aufm localhost. aber probiers einfach mal auf php-space ;)
also besonders schwer zu knacken is das ja nich gerade
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*
An dieser Stelle möchte ich auf brb`s [url=http://www.nögel.de/mawcha/]mawcha[/url] hinweisen =)
ist schonmal drauf verwiesen worden von mir und Zero ;D
argh scheiße :D
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
Boah. Hammer. Du kannst doch nicht einfach das Bild in den HTML Code klatschen.. Ich sag nur <img>.
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
du musst $text auch irgendwo zwischenspeichern (session, db etc. nur nicht cookie oder hidden field!!). sonst kannste es ja nicht prüfen
was dat denn?if(!($_POST['eingabe'] == $text)){
dat muss so: if($_POST['eingabe'] != $text){
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... :(
> mit sessions habe ich mich nie richtig beschäftigt... :(
xyz-48n tu das jetz: http://de.php.net/manual/de/ref.session.php
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
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 :(
In der captcha.php speicherst du den Kontrollwert in der Session, den du in der eintragen.php dann
überprüfen kannst.
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">
register_globals!
Du musst statt $eingegebenerCaptcha $_POST['eingegebenerCaptcha'] benutzen.
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
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
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
Außerdem heißt es doch $_SESSION Oo
hab jetzt in der eintragen.php folgendes hinzugefügt:
session_start();
nun klappt es aber immer noch net
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
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();
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
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ä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\">
";
?>
Weg mit dem whitespace außerhalb der PHP tags!
mhh... whitespace ???
noch nie gehört was meinst du damit??
leerzeichen
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?
$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;
}
?>
wird aber gefüllt mit Zeichen aus dem $string
$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.
ok, auch wenn es nicht nötig ist lasse ich es zur sicherheit.
Aber trotzdem passiert nweiterhin nichts.
Du hast meinen Edit gelesen, nehm ich an..? :D
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);
?>
ersetzgetstring();
durch
$getstring = getstring();
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..
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
> 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
Und wie kann ich die Variable $getstring zu einer $_GET machen??
Also ich verstehe das nicht ganz was da steht..
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
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??
session oder db
mit db will ich nicht da es mir dan zu unübersichtlich wird und mit sessions kenne ich mich nicht aus.
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?
> 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.
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??
> 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
wie einen hash den kann man dan janicht mehr entschlüsseln, oder?
Und was soll ich dan hashen was ist der Kontrollwert??