我读过这些网页:
PHP Form Security With Referer和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
所以我们现在甚至不需要黑客来打破它。几乎任何人都可以做到。
我需要一个解决方案,以确保我拒绝所有来自我的域名的请求。
答案 0 :(得分:1)
无法确定请求的来源位置。这是HTTP无状态协议的本质。
通常Referrer
HTTP标头用作请求源,但可以轻松操作。
答案 1 :(得分:1)
所以基本上我的问题是我们如何确定请求是从我们自己的域发送的?或者根本没有办法吗?
你在问不可能。无法确定您域中网页上的提交按钮是否已生成请求。
你说这不是关于CSRF的,所以我不知道你为什么这么担心。但解决方案是一样的。
无论如何都要检查HTTP_REFERER
标题。如果它不是您的域,则拒绝该请求。你可能需要接受丢失的标题,因为有些人禁用它。这并不妨碍使用浏览器设置的人欺骗价值。但它确实阻止那些被欺骗从其他网站提交表单的人(假设他们没有禁用HTTP_REFERER
)。
使用仅对一个请求有效的“nonce”或临时令牌。因此,提交请求的人必须至少每次请求访问您的网站一次。这与确保请求来自您的网站基本相同。您还可以将随机数与IP地址或会话联系起来,以防止人们查询您的站点并将令牌依赖于另一台计算机。
答案 2 :(得分:0)
使用隐藏的输入和服务器上保存的加密密钥,并使其频繁更改(我在更改之前提供30秒!)。这不会阻止它,但会降低风险,同时,记录每个IP的失败尝试,并在第4次失败尝试后阻止该IP /用户,直到通过电子邮件重新验证。 如果失败尝试的用户名在第4次之后与数据库不匹配,请阻止IP并发送电子邮件给联系人。