12 Stimmen

PHP Captcha ohne Sitzung

Ok, hier ist ein Problem: in dem Projekt, an dem ich arbeite, können wir nicht auf Server-seitige Sitzungen für jede Funktionalität verlassen.

Das Problem besteht darin, dass gängige Captcha-Lösungen zur Verhinderung von Roboterübermittlungen eine Sitzung erfordern, um die Zeichenfolge zu speichern, mit der das Captcha verglichen werden soll.

Die Frage ist: Gibt es eine Möglichkeit, das Problem zu lösen, ohne Sitzungen zu verwenden? Was mir in den Sinn kommt, ist ein verstecktes Formularfeld, das einen Hash enthält, zusammen mit einem Captcha-Eingabefeld zu verwenden, so dass der Server diese beiden Werte miteinander abgleichen kann. Aber wie können wir diese Methode sicher machen, so dass es nicht verwendet werden könnte, um Captcha leicht zu brechen.

0voto

J.C. Inacio Punkte 4332

Hier ist meine Sicht der Dinge (sry, wenn es kompliziert erscheint):

  1. auf Seite anfordern:

    • Sie erzeugen eine zufällige Zeichenfolge mit dem Code 'abcdef';
    • Sie verschlüsseln den Code mit einem vordefinierten Passwort: $crypt = encrypt($captcha_code, 'password')
  2. in der Form:

    • ein Bildlink wird an den Browser gesendet 'captcha.php?$crypt'
    • eine versteckte Eingabe mit dem Wert von $crypt gesetzt wird
  3. Die Seite captcha.php entschlüsselt den verschlüsselten Text und erzeugt das Bild.

  4. der Benutzer sendet ein Formular mit dem Code 'abcdaa' (und der versteckten Eingabe $crypt)

  5. der Server prüft, ob encrypt('abcdaa') == $crypt

bearbeiten: die Verschlüsselungsfunktion muss umkehrbar sein (entschlüsseln), da der Captcha-Bildgenerator den Originalcode benötigt.

0voto

userb00 Punkte 559

Wie wäre es mit dieser Lösung? Ich fand diese "Sessionless PHP Captcha" Artikel auf Google und ich auf eines meiner Projekte verwendet, es ist einfach, keine Sitzung und es ist kostenlos. Irgendwelche Sicherheitsbedenken bezüglich RC4?

http://www.mythos-rini.com/blog/archives/732

0voto

Carl Punkte 785

Formular mit Validierung:

$errorsucc = '';

if (isset($_POST["captcha_check"])) {

    $code = str_decrypt($_POST["captcha_check"]);   

    if (empty($_POST['captcha_code'])) { 
        $errorsucc = '<p style="color:red">Please Enter the security code.</p>';

    } elseif(!( $code == $_POST['captcha_code'] && !empty($code) )) {
        $errorsucc = '<p style="color:red">Incorrect Code Entered.</p>';

    } else {
        $errorsucc = '<p style = "green">Nice, you entered the correct code.</p>';  
    }
}

$captcha = new CaptchaCode();
$code = str_encrypt($captcha->generateCode(6));
?>

<html>
    <title>Sessionless Captcha</title>
    <div style = "background: #e2e2e2; padding: 20px; width: 20%; box-shadow: 5px 5px #ccc;">
        <?php echo $errorsucc; ?>
        <form name="captchaform" method="post">
            <table border="0" cellpadding="4" cellspacing="0">
                <tr><td valign="middle" align="left">Security Code:</td>
                    <td valign="middle" align="left"><img src="captcha_images.php?width=150&height=50&code=<?php echo $code?>" /></td>
                </tr>
                <tr><td valign="middle" align="left">Enter Code:</td>
                    <td valign="middle" align="left"><input id="captcha_code" name="captcha_code" style="width:150px" type="text" /></td>
                </tr>

                <tr><td valign="top" align="left">
                    </td>
                    <td valign="top" align="left">
                        <input border="0" type="submit" value="Submit" />   
                    </td>
                </tr>
            </table>
            <input type="hidden" name="captcha_check" value="<?php echo $code?>" />
        </form>
    </div>
</html>

Erzeugen Sie Bilder wie jedes andere Captcha:

/* font size will be 75% of the image height */
    $font_size = $height * 0.75;
    $image = @imagecreate($width, $height) or die('Cannot initialize new GD image stream');
    /* set the colours */
    $background_color = imagecolorallocate($image, 255, 255, 255);
    $text_color = imagecolorallocate($image, 0, 26, 26);
    $noise_color = imagecolorallocate($image, 25, 89, 89);
    /* generate random dots in background */
    for( $i=0; $i<($width*$height)/3; $i++ ) {
        imagefilledellipse($image, mt_rand(0,$width), mt_rand(0,$height), 1, 1, $noise_color);
    }
    /* generate random lines in background */
    for( $i=0; $i<($width*$height)/150; $i++ ) {
        imageline($image, mt_rand(0,$width), mt_rand(0,$height), mt_rand(0,$width), mt_rand(0,$height), $noise_color);
    }
    /* create textbox and add text */
    $textbox = imagettfbbox($font_size, 0, $this->font, $code) or die('Error in imagettfbbox function');
    $x = ($width - $textbox[4])/2;
    $y = ($height - $textbox[5])/2;
    imagettftext($image, $font_size, 0, $x, $y, $text_color, $this->font , $code) or die('Error in imagettftext function');
    /* output captcha image to browser */
    header('Content-Type: image/jpeg');
    imagejpeg($image);
    imagedestroy($image);

Laden Sie die Demodateien über diesen Link herunter: Ein sitzungsloses Captcha in PHP erstellen

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X