我读过这些网页:
具有Referer和的PHP表单安全性http://www.mustap.com/phpzone_post_62_how-to-bypass-the-referer-se
所以基本上我的问题是,我们如何确定请求是从我们自己的域发送的?或者根本没有办法?
(问题针对任何服务器端语言,包括但不限于PHP/JSP/ASP.Net等)
我的问题:我在http://me.com/login
有一个页面,在提交表单时,它会向自己发布登录详细信息。到目前为止还不错。直到其他人可以简单地完成
<form action="http://me.com/login">
<input name="password" value="p">
<input name="username" value="u">
</form>
他们可以通过他们的域发送登录我的应用程序的请求。我不想要这个。我需要一种方法来确保如果我的页面收到帖子,它来自我的域。否则我会拒绝它。
此外,当我读到这篇文章时,我有点震惊:There are plugins for Firefox that allow the user to specify whatever value they want to be supplied as the REFERER.
来源:http://www.phpbuilder.com/board/showthread.php?t=10324100
所以我们现在甚至不需要黑客来破解它。几乎任何人都能做到。
我需要一个解决方案来确保我拒绝所有不是来自我的域的请求。
所以基本上我的问题是,我们如何确定请求是从我们自己的域发送的?或者根本没有办法?
你在问不可能的事。无法确定域上页面上的提交按钮是否生成了请求。
你说这与CSRF无关,所以我不知道你为什么担心。但解决方案是一样的。
-
无论如何都要检查
HTTP_REFERER
标头。如果不是您的域,则拒绝该请求。不过,你可能需要接受丢失的标头,因为有些人会禁用它。不过,这并不能阻止那些破坏浏览器设置的人伪造该值。但它确实阻止了那些被诱骗从另一个网站提交表格的人(假设他们没有禁用HTTP_REFERER
)。 -
使用仅对一个请求有效的"nonce"或临时令牌。因此,提交请求的人每次请求必须至少访问您的网站一次。这与确保请求源自您的网站基本上是一样的。您还可以将nonce与IP地址或会话绑定,以防止人们查询您的网站并将该令牌与另一台计算机一起使用。
无法确定请求的来源。这就是HTTP无状态协议的本质。
在常见的情况下,Referrer
HTTP头被用作请求源,但它可以很容易地进行操作。
使用服务器上保存的带有加密密钥的隐藏输入,并使其频繁更改(在更改之前我会给出30秒!)。这不会阻止它,但会将风险降至最低,此外,记录每个IP的失败尝试,并在第四次失败尝试后阻止该IP/用户,直到通过电子邮件重新验证。如果第4次尝试失败的用户名与数据库不匹配,请屏蔽IP并发送电子邮件联系。