【问题标题】:How can I only allow request from my form我怎样才能只允许我的表格中的请求
【发布时间】:2012-08-13 18:30:10
【问题描述】:

我在服务器上有一个表单和处理它的 php,在另一台服务器上,此配置无法更改。 我收到了很多垃圾邮件,并试图修复它。由于跨域,SESSION 无法工作,因此没有令牌也没有验证码,$_SERVER["HTTP_REFERER"] 不可靠。我正在考虑实施一个每天更改一次的加密密钥,但我认为它是有限的。有更好的主意吗?

加密密钥示例:

$key = "string".date("d");

【问题讨论】:

  • 您是否收到大量来自机器人或血汗工厂的垃圾邮件?
  • 如果血汗店是性用品店,我都会收到
  • 你对两台服务器都有控制权吗?
  • 是的。顺便说一句,现在无法尝试解决方案,我会在星期一尝试

标签: php forms security cross-domain


【解决方案1】:

例如,您可以在服务器上添加一个新资源,该资源会生成一个密钥并将其存储在数据库中。加载网页后,您从服务器请求一个新密钥并将其插入到hidden 表单字段中。

然后,当发出请求时,您检查该字段的值并查看数据库中是否有相应的键。如果不是,则丢弃该请求。

当然,机器人仍然有可能绕过它(通过请求密钥),但会更难。

【讨论】:

    【解决方案2】:

    您不需要会话即可使用 CAPTCHA。 存在多种 CAPTCHA。 即使是以下内容也可能会阻止 99% 的垃圾邮件:

    <form action="...">
    <input type="hidden" name="thequestion1" value="23">
    <input type="hidden" name="thequestion2" value="-">
    <input type="hidden" name="thequestion3" value="5">
    How much is 23-5?
    <input type="text" name="theanswer">
    <input type="submit">
    </form>
    

    大多数垃圾邮件机器人看起来只是输入字段和提交按钮。

    我敢打赌,这种 CAPTCHA 可以阻止大多数垃圾邮件。

    PS:请务必在服务器上安全地评估问题 1、问题 2、问题 3 的值。

    【讨论】:

      【解决方案3】:

      很多机器人不运行 javascript,因此您可以在表单中注入任意字段:

      <form id="douchebag" action="http://yourotherserver.com/process.php" method="post">
      <input type="text" name="name" />
      .. bunch of other inputs
      </form>
      

      然后你的js:

      var bugSpray = document.createElement('input');
      bugSpray.setAttribute('type', 'hidden');
      bugSpray.setAttribute('name', 'aa');
      bugSpray.value = 'bb';
      document.getElementById('douchebag').appendChild(bugSpray);
      

      然后在你的process.php

      if(empty($_POST['aa']) || $_POST['aa'] != 'bb') // bot
      

      【讨论】:

        【解决方案4】:

        我之前使用过的一种技术类似于@SiGanteng 建议的技术,但您可以更改现有字段的名称属性,而不是添加新字段,以删除或添加前缀。

        <script>
        var inputs = document.getElementById('myform').getElementsByTagname('input');
        for(i=0; i<inputs.length; i++) {
            inputs[i].name = "antispam_" + inputs[i].name;
        }
        </script>
        

        【讨论】:

          【解决方案5】:

          另一种方法是使用简单的检查, 接受两个文本输入并将它们连接起来, 制作一个 md5 并通过 POST 发送。 在另一台服务器上检查这个,瞧。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2012-12-15
            • 1970-01-01
            • 1970-01-01
            • 2021-02-16
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2017-07-12
            相关资源
            最近更新 更多