【问题标题】:Prevent off site form posts?防止场外形式的帖子?
【发布时间】:2013-10-22 12:29:24
【问题描述】:

我正在寻找最安全的方法,以防止我使用 PHP 和 MySQL 的 Web 表单从站点外发布。我做了一些搜索,发现大多数人建议在表单中设置一个隐藏字段和一个带有 md5() 哈希值的会话变量,并在表单提交时检查它。但这似乎不是很安全,因为 md5() 哈希值可以在隐藏值的表单源中看到。

这是我不允许异地提交表单的想法。数据库调用会占用更多资源,但看起来更安全,因为代码哈希永远不会发送到客户端。

请查看它,看看您是否可以在此安全措施中戳出任何漏洞以防止异地表单发布。

// First time form loads
if (!$_POST) {

    session_start();

    $code_options = array('A','B','C','D','E','F','G','H','I','J','K','L','M','N','P','Q','R','S','T','U','V','W','X','Y','Z','1','2','3','4','5','6','7','8','9');
    for ($i=1; $i<=20; $i++) {
        $code .= array_rand(array_flip($code_options), 1);
    }

    // Insert new record
    $con = connect_to_db(); // connects to db
    $sql = "INSERT INTO security_table (form_code) values('$code')";
    $result = run_query($sql, $con); // runs the query

    $_SESSION['formcode'] = $code;
    $_SESSION['formid'] = mysql_insert_id();

}

// If form was posted to    
if ($_POST) {

    session_start();

    $con = connect_to_db();
    $form_code = mysql_real_escape_string($_SESSION['formcode']);
    $form_id = mysql_real_escape_string($_SESSION['formid']);

    $sql = "SELECT form_code FROM security_table WHERE form_code = '$form_code' AND form_id = '$form_id '";
    $result = run_query($sql, $con);

    if (mysql_num_rows($result) > 0) {

        // Process the form

        // If form processes successfully
        $_SESSION['formcode'] = "";
        $_SESSION['formid'] = "";

    }else{

        // Error

    }

}

【问题讨论】:

  • 我正在尝试不使用验证码
  • 如何防止脚本加载您的页面两次?您的 php 脚本第一次会很乐意为它创建一个安全令牌,并在第二次接受会话...
  • 为什么会有那么多奇思妙想?为什么不直接将表单令牌放入会话中并检查以确保它们匹配?

标签: php forms security


【解决方案1】:

您可以通过您的网络服务器配置来控制对您网站的访问,而不是在您的应用程序中执行此操作。如果您可以这样做,则可以很好地分离关注点——服务器处理请求,应用程序只处理逻辑。

假设您使用的是 Apache 并且您对 apache http.conf 或本地 .htaccess 具有读/写访问权限,您可以添加如下规则:

<Limit GET POST>
  order deny,allow
  deny from all
  allow from 199.166.210.
  allow from .golden.net
  allow from proxy.aol.com
  allow from fish.wiretap.net
</Limit>

所以,拒绝所有人,除了您选择允许的少数 IP 或网络地址。

See the Apache docs 了解细节。

【讨论】:

  • 只有当你可以限制你的用户的IP时才有效。
【解决方案2】:

But that doesn't seem very secure because the md5() hash value can be seen in the source of the form in the hidden value.

没关系。如果你加密得足够好,那么这个令牌对任何人来说都是希腊语,因此除非你知道 php 脚本中的密钥机制,否则不可能重新创建它。由于您在每次发布后都会重新生成令牌,因此查看它的外观对任何坏人都无济于事。

您保护表单的方式基本上是“如果您有会话,那就没问题”。因此,如果垃圾邮件机器访问过您的页面一次,则安全层已通过。您拥有客户端令牌的原因是垃圾邮件发送者必须提供只能以您的实际形式获得的东西。

在 stackoverflow 上有很多关于安全表单的讨论,例如,请查看 Good Form Security - no CAPTCHA

【讨论】:

    【解决方案3】:

    这是一篇很好的文章,解释了保护表单的不同方法。我已经使用了这些方法,效果很好。 http://www.campaignmonitor.com/blog/post/3817/stopping-spambots-with-two-simple-captcha-alternatives

    【讨论】:

      猜你喜欢
      • 2018-05-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多