46356
29.08.2007, aktualisiert am 17.09.2007 um 21:25:07 Uhr
5521
12
0
Captcha PHP Problem
Hallo
Ich habe ein kleines Problem mit meinem Bot Schutz...
Alle Codes stimmen bis auf keinen und 1...
Ich glaube meine elseif abfrage ist falsch aber ich komme nicht weiter... Ich saß den ganzen Vormittag an diesem Problem, konnte es aber nicht lösen...
Hier der Code:
Falls ihr noch mehr Code braucht, sagt bescheid...
Danke Alex
P.S.: Mein Captcha ist eine Zeichenkette!
Ich habe ein kleines Problem mit meinem Bot Schutz...
Alle Codes stimmen bis auf keinen und 1...
Ich glaube meine elseif abfrage ist falsch aber ich komme nicht weiter... Ich saß den ganzen Vormittag an diesem Problem, konnte es aber nicht lösen...
Hier der Code:
<input type="text" name="captcha" size="7.5"> <img src="captcha.php" width="74" height="25" alt="" style="vertical-align: middle;" <?php if($_POST['code'] != "") { echo ' value="'.$_POST['code'].'"'; } ?> >
...
// Captcha überprüfen
}elseif(!isset($_POST['code']) == $_SESSION['code'])
{
echo "<font face='Verdana' size='2px'>Du hast die Sicherheitsprüfung nicht bestanden!! <a href=javascript:history.back(-1) onFocus=this.blur()>Zurück</a>";
// Session löschen
unset($_SESSION['captcha_code']);
}
Danke Alex
P.S.: Mein Captcha ist eine Zeichenkette!
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 67390
Url: https://administrator.de/contentid/67390
Ausgedruckt am: 22.11.2024 um 21:11 Uhr
12 Kommentare
Neuester Kommentar
Was willst Du denn damit
prüfen?
(!isset($_POST['code']) ergibt true oder false, je nachdem ob $_POST['code'] gesetzt wurde oder nicht.
Diese Ergebniss verlgeichst Du dann mit dem Inhalt von $_SESSION['code'] ...
Ich kenn den Rest vom Code nicht, aber sollte da nicht ein
ausreichen?
}elseif(!isset($_POST['code']) == $_SESSION['code'])
prüfen?
(!isset($_POST['code']) ergibt true oder false, je nachdem ob $_POST['code'] gesetzt wurde oder nicht.
Diese Ergebniss verlgeichst Du dann mit dem Inhalt von $_SESSION['code'] ...
Ich kenn den Rest vom Code nicht, aber sollte da nicht ein
... elseif($_POST['code'] != $_SESSION['code']) ...
ausreichen?
Sieht fast so aus, als wärst Du Dir nicht über den Namen der POST Variable einig:
<input type="text" name="captcha" size="7.5"> ...
$_POST['code']... $SESSION['code']...
... unset($_SESSION['captcha_code']);...
Und nochwas: Les Dir mal ein bischen was über sicheres Programmieren von PHP Scripts an.
Überleg Dir mal, was passiert wenn Dir hier:
jemand '; DELETE FROM users WHERE Nickname<>' in das Nickname Feld im Webformular rein schreibt
<input type="text" name="captcha" size="7.5"> ...
$_POST['code']... $SESSION['code']...
... unset($_SESSION['captcha_code']);...
Und nochwas: Les Dir mal ein bischen was über sicheres Programmieren von PHP Scripts an.
Überleg Dir mal, was passiert wenn Dir hier:
$nickname = $_POST['nickname'];
$pass = md5($_POST['password']);
$result = mysql_query("SELECT Nickname FROM users WHERE Nickname LIKE '$nickname'");
jemand '; DELETE FROM users WHERE Nickname<>' in das Nickname Feld im Webformular rein schreibt
so hab mich mal durch dein code gewühlt ^^
also
1.) sehe nirgendes das die $_SESSION['code'] gefüllt wird. mit was willst du die dann vergleichen ? ( vielleicht in captcha.php ? )
2.) ändere
}elseif(!isset($_POST['code']) == $_SESSION['code'])
in
3.)
wenn eine der Bedingungen wahr wird löschst du eine andere session
unset($_SESSION['captcha_code']);
müsst da nich $_SESSION['code'] in $_SESSION['captcha_code'] geändert werden ?
kannst nochmal die captcha.php posten ? wenn es noch nicht geht ?
also
1.) sehe nirgendes das die $_SESSION['code'] gefüllt wird. mit was willst du die dann vergleichen ? ( vielleicht in captcha.php ? )
2.) ändere
}elseif(!isset($_POST['code']) == $_SESSION['code'])
in
3.)
wenn eine der Bedingungen wahr wird löschst du eine andere session
unset($_SESSION['captcha_code']);
müsst da nich $_SESSION['code'] in $_SESSION['captcha_code'] geändert werden ?
kannst nochmal die captcha.php posten ? wenn es noch nicht geht ?
Ohh das solltest du aber so schnell wie möglich beheben! Stichwort SQL-Injection!
Verwende bevor du die Variablen an die DB schicks "mysql_real_escape_string". Ich habe dafür diese Funktion:
Verwende bevor du die Variablen an die DB schicks "mysql_real_escape_string". Ich habe dafür diese Funktion:
// esapen von input
function quotesqlvar($value)
{
// Stripslashes if quoted
if (get_magic_quotes_gpc()) {
$value = stripslashes($value);
}
// Quote if not integer
if (!is_numeric($value)) {
$value = mysql_real_escape_string($value);
}
return $value;
}
Hier die captcha.php:
// Code in der Session-Variablen übergeben
$_SESSION["captcha_code"] => $code;
Ok, nach meinem Dafürhalten sollte dann das elseif so aussehen:
...} elseif($_POST['captcha'] != $_SESSION['captcha_code']) {...
Und bereinige mit EvilMoe's Code alle Eingaben aus dem Formular!
/edit: Tippfehler beseitigt.
Selbst wenn die Captcha-Überprüfung funktionieren sollte,
würde das Skript nicht korrekt arbeiten.
Nach der Captcha-Überprüfung geht es nämlich munter weiter mit dem
Anlegen des neuen Users.
Daher auch die Ausgabe, siehe oben:
Denn woher soll der PHP-Interpreter wissen, dass das Skript gestoppt werden soll,
falls der übertragene Captcha-Code falsch ist? Der Interpreter überprüft nur die
Syntax, nicht aber die Logik des Skript.
Ich muß dem Interpreter also auch sagen, was er im negativem Fall machen soll:
Zum zweiten ist eine solche simple Überprüfung ...
... ziemlich sinnfrei, weil auch die Eingabe eines oder mehrerer Leerzeichen
eine korrekte Eingabe ist. Es würden also im Falle einer positiven
Captcha-Überprüfung einfach Datenfelder mit Leerzeichen in der
Datenbank angelegt!
Die Eingabe sollte also besser über einen regulären Ausdruck
auf erlaubte/nicht erlaubte Zeichen überprüft werden.
Ich habe das Skript oben mal ein wenig verkürzt(wg. Übersicht) und
einige Variablen meiner Umgebung angepasst, nur um die Funktionalität
zu überprüfen.
Grüße
Günni
würde das Skript nicht korrekt arbeiten.
Nach der Captcha-Überprüfung geht es nämlich munter weiter mit dem
Anlegen des neuen Users.
Daher auch die Ausgabe, siehe oben:
Funktioniert trotzdem noch nicht:
Du hast die Sicherheitsprüfung nicht bestanden!! Zurück
Benutzername alexbreuss wurde erstellt. Login
Benutzername alexbreuss wurde erstellt. Login
Denn woher soll der PHP-Interpreter wissen, dass das Skript gestoppt werden soll,
falls der übertragene Captcha-Code falsch ist? Der Interpreter überprüft nur die
Syntax, nicht aber die Logik des Skript.
Ich muß dem Interpreter also auch sagen, was er im negativem Fall machen soll:
…
if(trifft nicht zu){
...
exit;//Skript beenden
}
...
Zum zweiten ist eine solche simple Überprüfung ...
…
elseif(!isset($_POST['nickname']) || $_POST['nickname'] == ""){
…
... ziemlich sinnfrei, weil auch die Eingabe eines oder mehrerer Leerzeichen
eine korrekte Eingabe ist. Es würden also im Falle einer positiven
Captcha-Überprüfung einfach Datenfelder mit Leerzeichen in der
Datenbank angelegt!
Die Eingabe sollte also besser über einen regulären Ausdruck
auf erlaubte/nicht erlaubte Zeichen überprüft werden.
Ich habe das Skript oben mal ein wenig verkürzt(wg. Übersicht) und
einige Variablen meiner Umgebung angepasst, nur um die Funktionalität
zu überprüfen.
<?
session_start();
//Meine Datenbankverbindung und mehr...
include("net-comm/inc/session.inc.php");
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>Registrierung</title>
</head>
<body>
<?
$cmd=$_POST['cmd'];
if($cmd=="Eintragen"){
/*
trim entfernt Leerzeichen am Anfang und am Ende
*/
$nickname=trim($_POST['nickname']);
$vorname=trim($_POST['vorname']);
$captcha=trim($_POST['captcha']);
/*
Nur Buchstaben(klein,GROSS,ohne Umlaute),
Zahlen,Punkt und Bindestrich sind erlaubt. z.B.:
hans45, Katja-12, w.broesel, hans-peter,
*/
if(!ereg("^[a-zA-Z1-9\.\-]+$",$nickname)){
echo "Sie haben ihren Nickname nicht korrekt angegeben";
echo "<a href=javascript:history.back(-1)> Zurück</a>";
exit;// Skript beenden
}
/*
Nur Buchstaben(klein,GROSS,mit Umlaute) und Bindestrich
sind erlaubt. z.B:
Jürgen, Karl-Heinz, Paul, aber nicht Karl.Heinz
*/
if(!ereg("^[a-zA-ZäöüÄÖÜ\-]+$",$vorname)){
echo "Sie haben ihren Vornamen nicht korrekt angegeben";
echo "<a href=javascript:history.back(-1)> Zurück</a>";
exit;// Skript beenden
}
/*
Gibt es den Nickname schon?
*/
$result=mysql_query("select * from auth where UserName='$nickname'");
if ( mysql_num_rows($result)>0){
echo "Benutzername $nickname ist schon vergeben";
echo "<a href=javascript:history.back(-1)> Zurück</a>";
exit;// Skript beenden
}
/*
Captcha-Überprüfung
*/
if($_SESSION["captcha_code"]!=$captcha){
echo "Sie haben den Code nicht korrekt eingegeben!<br/>";
echo "Benutzer $nickname wird nicht angelegt!";
echo "<a href=javascript:history.back(-1)> Zurück</a>";
}else{
echo "Sie haben den Code <font color=\"#ff000\">$captcha</font> korrekt eingegeben.<br/>";
echo "Benutzer $nickname wird angelegt.";
/*
Datenbankeintrag vornehmen
*/
}
}else{?>
<form action="reg.php" method="post">
Nickname: <input type="text" name="nickname" /><br/>
Vorname: <input type="text" name="vorname" /><br><br>
<img src="captcha_pic.php"> CaptchaCode <input type="text" name="captcha" /><br/>
<input type="submit" name="cmd" value="Eintragen" />
</form>
<?}?>
</body>
</html>
Grüße
Günni