【发布时间】:2009-05-16 05:49:09
【问题描述】:
我想知道 PHP 中有没有一种方法可以告诉您提交表单的位置,而无需使用隐藏字段或用户只需稍微篡改 html 的任何东西? 例如,我正在尝试确定提交的表单是否真的在我的网站上,或者该表单是否离线保存并以这种方式提交。
【问题讨论】:
我想知道 PHP 中有没有一种方法可以告诉您提交表单的位置,而无需使用隐藏字段或用户只需稍微篡改 html 的任何东西? 例如,我正在尝试确定提交的表单是否真的在我的网站上,或者该表单是否离线保存并以这种方式提交。
【问题讨论】:
如果隐藏字段包含 UID,则不容易被欺骗(如果您加密时间戳,您将能够知道用户在页面上停留了多长时间)
当然,用户可以在字段中输入他想要的任何内容,但是除非他可以生成有效的 UID,否则他不能让您的 php 脚本相信它来自其他地方。
您还可以通过 $_SESSION 跟踪用户访问过的页面,并使用它而不是 HTTP 引荐来源网址(将每个访问过的页面存储在 $_SESSION 内的数组中,当您的脚本被调用时,您只需检查最后一页是否是您的? 可以根据您的需要进行更改)。
【讨论】:
您可以尝试在 HTTP 请求中使用引用标头集,但请注意,并非所有浏览器都正确设置了这些标头,或者用户已将其关闭,或者它们很容易被欺骗。
如果没有包含唯一标识符的隐藏字段,该标识符用于识别单个提交的表单,就没有好的方法来识别表单是否是伪造的。
【讨论】:
我可能是错的,但引荐来源标题不会告诉您这一点吗?
【讨论】:
这会让你得到你想要的:
$referer = ($SERVER["HTTP REFERER"] == null);
这实际上是从 HTTP Header 中获取的,如下所示:
...
Referer: http://foobar.com/page.php
...
任何人都很容易欺骗这一点,但在大多数情况下这是合理的。
琐事:Referer 实际上应该拼写为 referrer,这是正确的拼写,但拼写错误已进入 HTTP 规范并一直存在。
【讨论】:
你真的说不出来。为什么会很重要?如果您试图检测是否有人伪造了请求,则无法检测。
修正:上面的绿色解决方案确实解决了一些问题,但它没有解决它是否来自您的站点或是否被修改的问题。
【讨论】: