我们可以确定请求是否是从其他域发送的吗?

时间:2011-06-03 03:50:14

标签: php asp.net web-services jsp

我读过这些网页:
PHP Form Security With Refererhttp://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

所以我们现在甚至不需要黑客来打破它。几乎任何人都可以做到。

我需要一个解决方案,以确保我拒绝所有来自我的域名的请求。

3 个答案:

答案 0 :(得分:1)

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

通常Referrer HTTP标头用作请求源,但可以轻松操作。

答案 1 :(得分:1)

  

所以基本上我的问题是我们如何确定请求是从我们自己的域发送的?或者根本没有办法吗?

你在问不可能。无法确定您域中网页上的提交按钮是否已生成请求。

你说这不是关于CSRF的,所以我不知道你为什么这么担心。但解决方案是一样的。

  1. 无论如何都要检查HTTP_REFERER标题。如果它不是您的域,则拒绝该请求。你可能需要接受丢失的标题,因为有些人禁用它。这并不妨碍使用浏览器设置的人欺骗价值。但它确实阻止那些被欺骗从其他网站提交表单的人(假设他们没有禁用HTTP_REFERER)。

  2. 使用仅对一个请求有效的“nonce”或临时令牌。因此,提交请求的人必须至少每次请求访问您的网站一次。这与确保请求来自您的网站基本相同。您还可以将随机数与IP地址或会话联系起来,以防止人们查询您的站点并将令牌依赖于另一台计算机。

答案 2 :(得分:0)

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