php - 我们能否确定请求是否是从另一个域发送的?

标签 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>

他们可以发送请求通过他们的域登录我的应用程序。我不想要这个。我需要一种方法来确保我的页面收到的帖子来 self 的域。否则我会拒绝它。

此外,当我读到此内容时,我有点震惊:Firefox 的插件允许用户指定他们想要作为 REFERER 提供的任何值。 来源:http://www.phpbuilder.com/board/showthread.php?t=10324100

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

我需要一个解决方案来确保拒绝所有不是来 self 的域的请求。

最佳答案

So basically my question is how do we determine for certain that the request was sent from our own domain? Or is there no way at all?

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

你说这与 CSRF 无关,所以我不知道你为什么担心。但解决方案是相同的。

  1. 无论如何都要检查 HTTP_REFERER header 。如果这不是您的域,则拒绝该请求。不过,您可能需要接受缺少的 header ,因为有些人禁用了它。但这并不能阻止那些搞乱浏览器设置的人欺骗该值。但它确实可以防止人们被诱骗从其他网站提交表单(假设他们没有禁用 HTTP_REFERER)。

  2. 使用仅对一个请求有效的“nonce”或临时 token 。因此,提交请求的人对于每个请求必须至少访问您的网站一次。这基本上与确保请求源自您的网站相同。您还可以将随机数与 IP 地址或 session 绑定(bind),以防止人们查询您的网站并依赖该 token 访问另一台计算机。

关于php - 我们能否确定请求是否是从另一个域发送的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6222785/

相关文章:

web-services - Controller 中的 Grails 2.4 服务调用但服务为空?

php - CodeIgniter 数据库连接未关闭

php - 是否可以直接使用 ajax 发送 php session 变量?

asp.net - Web 环境中线程的注意事项

c# - SQL Server 添加字符串值时列名无效

java - EntityManagerFactory 关闭,Hibernate

javascript - 当我选择同一标签的新复选框时,第二个标签的复选框不会取消选择选项

javascript - Highcharts ,类型错误: obj is null

asp.net - 处理单数和复数 Controller /路由

c# - .ascx 中的 javascript 函数