Hi,
das hier ist mein erster Post und ich bin noch relativ unerfahren.
Jetzt fragt ihr euch warum ich in der profi section posste, das ist weil
ich probleme mit einem php code habe der schon wesentlich mehr als
anfänger wissen braucht.
also es geht um text-captcha, das sind die sicherheits codes, die vor spambots schützen, ich hab da eine gute variante in reinem php gefunden und will sie verwenden,
Jetzt habe ich ein formular indem der benutzer alles eintippt und abschickt dann wird überprüft ob felder leer sind, die passwörter nicht übereinstimmer, oder eben der captcha code falsch ist :
geht alles bist auf "$code != $n->getNum()"
ohne das geht alles perfekt, nur wenn ich das einfüge nimmt er es nicht,
ich denke das "$n->getNum()" nicht die captcha zahl ist, oder so, und somit immer FALSE bei der if abfrage rauskommt.
Ich habe keinen plan wie ich diese abfrage sicher rein bekommt, wäre nett wenn einer helfen kann.
der ganze code des captcha scripts steht unten.
mfg der blade
das hier ist mein erster Post und ich bin noch relativ unerfahren.
Jetzt fragt ihr euch warum ich in der profi section posste, das ist weil
ich probleme mit einem php code habe der schon wesentlich mehr als
anfänger wissen braucht.
also es geht um text-captcha, das sind die sicherheits codes, die vor spambots schützen, ich hab da eine gute variante in reinem php gefunden und will sie verwenden,
Jetzt habe ich ein formular indem der benutzer alles eintippt und abschickt dann wird überprüft ob felder leer sind, die passwörter nicht übereinstimmer, oder eben der captcha code falsch ist :
PHP-Code:
$username = $_POST["username"];
$password = $_POST["password"];
$password2 = $_POST["password2"];
$code = $_POST["code"];
if($password != $password2 OR $code != $n->getNum() OR
$username == "" OR $password == "" OR $code == "")
ohne das geht alles perfekt, nur wenn ich das einfüge nimmt er es nicht,
ich denke das "$n->getNum()" nicht die captcha zahl ist, oder so, und somit immer FALSE bei der if abfrage rauskommt.
Ich habe keinen plan wie ich diese abfrage sicher rein bekommt, wäre nett wenn einer helfen kann.
der ganze code des captcha scripts steht unten.
mfg der blade
PHP-Code:
<?php
# Von Rene Schmidt (rene@reneschmidt.de) fuer DrWeb.de
// Diese Klasse erzeugt EINE Ziffer
class Digit {
// Die Zweierpotenzen sind hier schon berechnet notiert, damit sie nicht jedes Mal neu
// ausgerechnet werden muessen. Wir benoetigen fuer eine 5x3-Matrix, deren Zellen mit
// Zweierpotenzen maskiert sein sollen 15 Bits, also die Bitmasken 2^0 bis 2^14
var $bits = array(1,2,4,8,16,32,64,128,256,512,1024,2048,4096,8192,16384);
// Dieses Array enthaelt die Zeilen einer Ziffer, deren Zellen wiederum als Array dargestellt werden
// Siehe Konstruktor
var $matrix = array();
// Dies sind die fertig berechneten Bitmasken der Ziffern 0 bis 9 in Dezimaldarstellung
var $bitmasks = array(31599, 18740, 29607, 31143, 18921, 31183, 31695, 18855, 31727, 31215);
// Konstruktor; nimmt die darzustellende Ziffern entgegen; Matrix wird initialisiert
// setMatrix() wird mit der korrekten Bitmaske der darzustellenden Ziffer aufgeruefen
function digit( $dig ) {
$this->matrix[] = array(0, 0, 0); // 2^0, 2^1, 2^2 ... usw.
$this->matrix[] = array(0, 0, 0);
$this->matrix[] = array(0, 0, 0);
$this->matrix[] = array(0, 0, 0);
$this->matrix[] = array(0, 0, 0); // ..., ..., 2^14
((int)$dig >= 0 && (int)$dig <= 9) && $this->setMatrix( $this->bitmasks[(int)$dig] );
}
// Methode erzeugt anhand der Bitmaske die Matrix der Ziffer
// Vom Konstruktor erhaelt die Methode die Bitmaske der darzustellenden Ziffer
function setMatrix( $bitmask ) {
$bitsset = array();
// Jetzt wird jedes Bit daraufhin geprueft, ob es zur Bitmaske gehoert
// Wenn ja, wird es im Array $bitset gespeichert
for ($i=0; $i<count($this->bits); ++$i)
(($bitmask & $this->bits[$i]) != 0) && $bitsset[] = $this->bits[$i];
// Nun wird die initialisierte und leere Matrix hergenommen und Zeile fuer Zeile und Zelle fuer Zelle
// bestueckt. Zellen, die leer sein sollen, bleiben auf 0, aktivierte Zellen erhalten den Wert 1
// Beispiel aus dem Konstruktor - die Ziffer 1 wuerde als Matrix so aussehen:
// $this->matrix[] = array(0, 0, 1); // 2^0, 2^1, 2^2 ... usw.
// $this->matrix[] = array(0, 1, 1);
// $this->matrix[] = array(0, 0, 1);
// $this->matrix[] = array(0, 0, 1);
// $this->matrix[] = array(0, 0, 1); // ..., ..., 2^14
foreach($this->matrix AS $row=>$col)
foreach($col AS $cellnr => $bit)
in_array( pow(2,($row*3+$cellnr)), $bitsset) && $this->matrix[$row][$cellnr] = 1;
}
}
// Diese Klasse kuemmert sich um die korrekte Darstellung mehrerer Ziffern (also einer Zahl)
class Number {
var $num = 0; // Zahl, die dargestellt werden soll
var $digits = array(); // Enthaelt spaeter fuer jede Stelle ein Digit-Objekt
// Konstruktor; nimmt direkt die darzustellende Zahl entgegen.
function number( $num ) {
$this->num = (int)$num; // Zur Sicherheit in ganze Zahl umwandeln
$r = "{$this->num}"; // In Zeichenkette konvertieren
// Jetzt fuer jede Stelle der Zahl ein Digit-Objekt erzeugen
for( $i=0; $i<strlen($r); $i++ )
$this->digits[] = new Digit((int)$r[$i]);
}
// Liefert einfach die Zahl, die dargestellt wird.
function getNum() { return $this->num; }
// Gibt die Zeilen aller Ziffern nacheinander aus; also erst alle ersten, dann alle zweiten Zeilen usw.
function printNumber() {
for($row=0; $row<count($this->digits[0]->matrix); $row++) {
foreach( $this->digits AS $digit ) {
foreach($digit->matrix[$row] AS $cell)
if($cell === 1) // 1 bedeutet, die Zelle soll aktiv sein (=schwarz)
print("<span class=\"s\"> </span>");
else
print("<span class=\"w\"> </span>");
print("<span class=\"w\"> </span>"); // Leerraum zwischen den Ziffern
}
print("<br>"); // Naechste Zeile
}
}
}
?>
<html>
<head>
<style>
.s { color: black; background-color: black; }
.w { color: white; background-color: green; }
</style>
</head>
<body>
<h2>Beispiel</h2>
<div >
<?php
$n = new Number( rand(1000,9999) );
$n->printNumber();
printf( "<h2>Dargestellt wird die Zahl %d</h2>", $n->getNum() );
?>
</div>
</body>
</html>
Kommentar