11

わかりました、ここに問題があります。私が取り組んでいるプロジェクトでは、機能についてサーバー側のセッションに依存することはできません。

問題は、ロボットによる送信を防止する一般的なキャプチャ ソリューションでは、キャプチャと照合する文字列を保存するセッションが必要になることです。

問題は、セッションを使用せずに問題を解決する方法はありますか? 私の頭に浮かぶのは、ハッシュを含む非表示のフォームフィールドとキャプチャ入力フィールドを提供しているため、サーバーはこれら2つの値を一緒に一致させることができます. しかし、キャプチャを簡単に破ることができないように、この方法を安全​​にするにはどうすればよいでしょうか。

4

13 に答える 13

4

セッションまたはデータベースの必要性は、画像のGETをそれを含むhtmlページと調整する必要があるため、同じコードを使用してキャプチャ画像を埋め込むのはどうでしょうか。[img src ='data:image / jpeg; base64、 ...']、ランダムソルトを使用してテキストをハッシュし、ランダムソルトとハッシュを画像と一緒に1回のGETでクライアントに送信しますか?

ポストバックでは、ユーザーテキストをソルトに追加してからハッシュを比較します。これがどれほど安全か疑問に思っています...

于 2010-04-21T10:19:57.060 に答える
2

ハニーポット テクニックを使用します。貪欲な名前のテキスト フィールド (「email」など) を、CSS によって非表示のフィールド (表示: なし; 可視性: 非表示;) に配置します。

フォームをサニタイズする必要がある場合は、そのフィールドが空であるか、人間によって送信されているか (フィールドが見えないため入力できない)、スパマーから送信されているかどうかを確認するだけです。

そのため、スパマーは通常、フォームを送信する前にページ内のすべてのフィールドに事前定義された値を入力し、ユーザーがキャプチャを読むことを気にしません。

それ以外の場合は、「単語 "$word" の最初の $x 文字をフィールドに書きます:」のような人間の読み方に依存します。

次に、$x と $word を次のページに送信して確認するだけです (もちろん、フィールド名をランダム化してより正確にすることもできます)。

phpBB フォーラムのプラグインは、通常、スパム ボットがフィールドで利用可能な (値を持つ) 最初のオプションを選択するという事実に依存していることを覚えてい<select>ます。最初のオプションとして入れるだけ<option value="kickmeplease">Yes, im a bot.</option>

スパムボットから身を守る方法はたくさんありますが、ボットには絶対にない 1 つの要素である想像力を活用します。

于 2010-03-27T02:05:33.627 に答える
1

数学のキャプチャを作成してください ;) 2+90 = ? 方程式は画像と出来上がりに表示する必要があります;)

于 2013-11-03T22:43:02.330 に答える
1

CAPTCHA ジェネレーターに画像を返させ、回答にソルト ハッシュまたはカスタム ハッシュを使用します (ソルト/カスタムを強調)。ジェネレーターにそのハッシュを Cookie にプッシュさせます。その後、サーバーは Cookie の値に基づいて検証できます。これには JavaScript は必要ありませんが、Cookie が無効になっている場合は、別の手法にフォールバックする必要があります。

于 2011-09-12T18:45:33.870 に答える
1

POST でユーザーの回答とともに CAPTCHA の UUID を自動入力します。簡単です。

于 2012-12-10T20:33:15.057 に答える
1

一連のキャプチャ コードをデータベースに保存してみてください。あるいは、別のキャプチャ方法に関する素晴らしい議論がここにあります: Practical non-image based CAPTCHA approach?

いくつかの非常に興味深いテクニックは、実際に読んでください。

于 2009-09-23T12:37:40.190 に答える
0

これが私の見解です(複雑に思われる場合は申し訳ありません):

  1. ページリクエスト:

    • ランダムな文字列コード「abcdef」を生成します。
    • 定義済みのパスワードを使用してコードを暗号化します: $crypt = encrypt($captcha_code, 'password')
  2. 次の形式で:

    • 画像リンクがブラウザ「captcha.php?$crypt」に送信されます
    • 非表示の入力は $crypt の値で設定されます
  3. captcha.php ページは、暗号化されたテキストを復号化し、画像を生成します。

  4. ユーザーは、コード「abcdaa」(および隠し入力 $crypt) を含むフォームを送信します。

  5. サーバーは、encrypt('abcdaa') == $crypt かどうかを検証します

編集: キャプチャ イメージ ジェネレーターには元のコードが必要になるため、暗号化機能は可逆 (復号化) する必要があります。

于 2009-09-23T13:30:05.167 に答える
0

私自身の考え、それが良いかどうかはわかりません:

1) ユーザーがログインしている場合は、ログイン時にハッシュ関数を使用し、それを使用して CAPTCHA を生成します。

2)登録フォームなどの場合は、フォームフィールドからいくつかの値をハッシュし(たとえば、ユーザーが入力を終了したときにログイン)、ajaxによってログインからのハッシュでCAPTCHAを表示します。

理解できることを願っています。:)

編集: AJAX なし: 2 ステップの登録:

1.送信後、ログイン等を収集し、?login=new_login

2 では、CAPTCHA イメージで入力を非表示GET["login"]にし、それからハッシュします。送信後、すべての回答を確認する必要があります。

于 2009-09-23T12:48:32.803 に答える
0

この解決策はどうですか?Google でこの「Sessionless PHP Captcha」の記事を見つけ、自分のプロジェクトの 1 つで使用しました。これはシンプルで、セッションがなく、無料です。RC4 に関するセキュリティ上の懸念はありますか?

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

于 2010-03-27T00:36:45.827 に答える
0

バリデーションのあるフォーム:

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

他のキャプチャと同じように画像を生成します。

/* 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);

このリンクからデモ ファイルをダウンロードします: Create a Sessionless Captcha in PHP

于 2015-01-09T07:59:25.797 に答える