【问题标题】:How to know where a form came from?如何知道表格来自哪里?
【发布时间】:2009-05-16 05:49:09
【问题描述】:

我想知道 PHP 中有没有一种方法可以告诉您提交表单的位置,而无需使用隐藏字段或用户只需稍微篡改 html 的任何东西? 例如,我正在尝试确定提交的表单是否真的在我的网站上,或者该表单是否离线保存并以这种方式提交。

【问题讨论】:

    标签: php forms


    【解决方案1】:

    如果隐藏字段包含 UID,则不容易被欺骗(如果您加密时间戳,您将能够知道用户在页面上停留了多长时间)

    当然,用户可以在字段中输入他想要的任何内容,但是除非他可以生成有效的 UID,否则他不能让您的 php 脚本相信它来自其他地方。

    您还可以通过 $_SESSION 跟踪用户访问过的页面,并使用它而不是 HTTP 引荐来源网址(将每个访问过的页面存储在 $_SESSION 内的数组中,当您的脚本被调用时,您只需检查最后一页是否是您的? 可以根据您的需要进行更改)。

    【讨论】:

    【解决方案2】:

    您可以尝试在 HTTP 请求中使用引用标头集,但请注意,并非所有浏览器都正确设置了这些标头,或者用户已将其关闭,或者它们很容易被欺骗。

    如果没有包含唯一标识符的隐藏字段,该标识符用于识别单个提交的表单,就没有好的方法来识别表单是否是伪造的。

    【讨论】:

      【解决方案3】:

      我可能是错的,但引荐来源标题不会告诉您这一点吗?

      【讨论】:

      • 假设它已设置(并非总是如此)并且没有被欺骗。
      【解决方案4】:

      这会让你得到你想要的:

      $referer = ($SERVER["HTTP REFERER"] == null);
      

      这实际上是从 HTTP Header 中获取的,如下所示:

      ...
      Referer: http://foobar.com/page.php
      ...
      

      任何人都很容易欺骗这一点,但在大多数情况下这是合理的。

      琐事:Referer 实际上应该拼写为 referrer,这是正确的拼写,但拼写错误已进入 HTTP 规范并一直存在。

      【讨论】:

      • 正如上面其他人所指出的,我读过一些浏览器(我不知道是哪些浏览器)没有设置这个字段,或者设置不正确。因此,因为引用者不正确而拒绝请求可能会导致某些用户被锁定。另一方面,想要提交任意表单内容的人可能会考虑正确设置此字段...
      • @PhilLho,我不知道有任何浏览器错误地实现了这个。事实上,这很简单,所以我相当肯定你不会遇到浏览器实现的问题。无论哪种情况,我都以为您只是在要求 PHP 的代码 sn-p。更严格的实现将使用作为隐藏输入字段发送的“随机数键”。这些不能被操纵。
      【解决方案5】:

      你真的说不出来。为什么会很重要?如果您试图检测是否有人伪造了请求,则无法检测。

      修正:上面的绿色解决方案确实解决了一些问题,但它没有解决它是否来自您的站点或是否被修改的问题。

      【讨论】:

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