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姓名等。

但是……再想想。主要问题是 bot 要么没有,$_SESSION['name_for_email']要么对于 bot 值不正确。好的,机器人“看到”电子邮件,“类型”电子邮件。

$_SESSION['name_for_email']如果在处理输入之前定义一些隐藏字段,检查是否$_SESSION['name_for_email']与隐藏输入字段中的相同,我想会产生相同的效果。因为,如果机器人知道正确的随机值,那么输入字段名称也是正确的。

于 2015-02-22T06:34:04.627 回答