2

PHPフォームのセキュリティに関するこの記事:

http://nedbatchelder.com/text/stopbots.html

...「スピナー」について次のように言及しています。

スピナーは、いくつかの目的で使用される非表示のフィールドです。改ざんや再生を防ぐためにいくつかの値をまとめてハッシュし、フィールド名を隠すために使用されます。スピナーは次のMD5ハッシュです。

* The timestamp,
* The client's IP address,
* The entry id of the blog entry being commented on, and
* A secret.

フォームのフィールド名はすべてランダム化されています。それらは、実際のフィールド名、スピナー、および秘密のハッシュです。スピナーは固定のフィールド名を取得しますが、送信ボタンを含むフォーム上の他のすべてのフィールドはハッシュ化されたフィールド名を使用します。

フォームと関連するphpフォーム送信スクリプトを含むphpページにこれを実装する方法のコードサンプルを持っている人はいますか?

私はAJAXを使いたくなく、PHPだけを使いたいです。

4

2 に答える 2

0

次のように実装できます。

  On Page Submit:
  <?php
    $spinnerKey = 'spin';
    $spinner = $_POST[$spinnerKey];
    $values = array();

    foreach ($_POST as $key=>$value)
    {
      if ($key !== $spinnerKey)
      {
        $values[deHash($key, $spinner)] = $value;
      }
    }
?>

A 'deHash' example:
<?php

    # You have to define deHash based on your hash but it 
    # would look something like this:
    var $_rainbowTable = array();
    var $_expectedKeys = array();

    function deHash($hashedkey, $spinner)
    {
        $rt = $this->getRainbowTable($spinner);

        return isset($rt[$hashedKey])
          ? $rt[$hashedKey])
          : NULL;
    }

    function getRainbowTable($spinner)
    { 
        if (count($this->_rainbowTable) > 0)
            return $this->_rainbowTable;

        foreach ($this->_expectedKeys as $key)
        {
            $this->_rainbowTable[hash($key, $spinner)] == $key;
        }

        return $this->_rainbowTable;
    }
  ?>

最終的には、ボットがページを送信するのをどのように停止するのかわかりませんが、人々の「電子メール/ユーザー/パス」の記憶ブラウザプラグインが機能しなくなるだけです。

于 2010-07-13T04:49:13.350 に答える
0

ページの読み込み時にランダムな値でセッションを作成するとどうなりますか。例えば $_SESSION['name_for_email'] = 'something_random';

次に、フィールドを入力します

<input type="text" 
name="<?php echo htmlspecialchars( $_SESSION['name_for_email'], ENT_QUOTES, "UTF-8");?>"
>

ajaxを使用する方が良いようです。訪問者は[送信]をクリックし、外部php呼び出しですべてのデータを外部phpに渡す$_SESSION['name_for_email']ので、電子メールフィールド名を知ることができます。

ajaxがない場合は、投稿とページのリロードが行われますが、ページの上部に新しく$_SESSION['name_for_email']作成されます。したがって、入力フォームを処理するphpコードは、定義する前に存在する必要があります$_SESSION['name_for_email']

多くの入力フィールドがある場合は、多くのセッションを使用する必要があります。いくつかの簡略化されたバージョンの方が良いかもしれません。

$_SESSION['name_for_email'] = 'something_random';

<input type="text" 
name="field1<?php echo htmlspecialchars( $_SESSION['name_for_email'], ENT_QUOTES, "UTF-8");?>"
>

覚えておく必要があります。それfield1はメールやfield2名前などです。

しかし...もう一度考えます。主な質問は、ボットが持っていない$_SESSION['name_for_email']か、ボットの値が正しくないということです。わかりました。ボットはメールを「確認」し、メールを「入力」します。

$_SESSION['name_for_email']入力を処理する前に隠しフィールドを定義すると、それ$_SESSION['name_for_email']が隠し入力フィールドと同じであるかどうかを確認します。同じ効果があると思います。ボットが正しいランダム値を知っている場合、入力フィールド名も正しいためです。

于 2015-02-22T06:34:04.627 に答える