我们可以确定请求是否是从另一个域发送的吗


Can we ever determine if the request was sent from another domain?

我读过这些网页:
具有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无关,所以我不知道你为什么担心。但解决方案是一样的。

  1. 无论如何都要检查HTTP_REFERER标头。如果不是您的域,则拒绝该请求。不过,你可能需要接受丢失的标头,因为有些人会禁用它。不过,这并不能阻止那些破坏浏览器设置的人伪造该值。但它确实阻止了那些被诱骗从另一个网站提交表格的人(假设他们没有禁用HTTP_REFERER)。

  2. 使用仅对一个请求有效的"nonce"或临时令牌。因此,提交请求的人每次请求必须至少访问您的网站一次。这与确保请求源自您的网站基本上是一样的。您还可以将nonce与IP地址或会话绑定,以防止人们查询您的网站并将该令牌与另一台计算机一起使用。

无法确定请求的来源。这就是HTTP无状态协议的本质。

在常见的情况下,Referrer HTTP头被用作请求源,但它可以很容易地进行操作。

使用服务器上保存的带有加密密钥的隐藏输入,并使其频繁更改(在更改之前我会给出30秒!)。这不会阻止它,但会将风险降至最低,此外,记录每个IP的失败尝试,并在第四次失败尝试后阻止该IP/用户,直到通过电子邮件重新验证。如果第4次尝试失败的用户名与数据库不匹配,请屏蔽IP并发送电子邮件联系。

相关文章: