如何保护跨域请求;允许第三个网站发布数据

时间:2014-05-10 00:42:32

标签: php ajax security csrf

我已经做过一些关于如何防止虚假的跨域请求的研究,并且已经找到了很多有用的信息。但是,它们似乎都没有直接解决我的问题,而且由于我的应用程序必须处理这种特定情况,我想完全理解它。

我有一个简单的php邮件网站:mailsite.com

此站点将允许其他预定义地址(例如user.com)向其发送POST数据,并处理包含tomesaage的信息;然后通过邮件to向他们发送电子邮件至mailsite.com至message

目前,我正在使用$_SERVER[ "HTTP_ORIGIN" ]$_SERVER[ "HTTP_REFERER" ]来检查请求的来源;如果它来自预定义的域,则处理它们。但是,我读过一些文章说:

  1. 在PHP文档中甚至没有索引HTTP_ORIGIN,因为它几乎是每个浏览器的类型,因此拒绝发送这些信息的浏览器将无法工作。 HTTP_REFERER很容易伪造。
  2. 令牌可以很好地防止CSRF。
  3. 但是,我允许的请求来自第三个预先定义的网站,令人如何在这种情况下工作?

    我的问题是:如果我允许特定域将数据发布到我的网站,我如何确保(或最安全的方式)这些请求来自我期望的网站? HTTP_ORIGIN甚至不够安全吗?我敢于考虑允许第三个网站将数据发布到我的网站,因为我已经看到Facebook允许人们访问他们的数据库。必须有一些可能的解决方案来检查请求的来源。

1 个答案:

答案 0 :(得分:1)

听起来你可能有多种解决方案:

  • 使用令牌权限系统。为user.com提供一个私有令牌,作为隐藏值添加到输入表单。提交此表单后,浏览器将为您的服务器提供令牌,用户不必知道该令牌。您根据自己的数据库检查令牌。如果找到令牌,请允许发送邮件。

  • 使用 CORS(跨源资源共享)。当从user.com向您的服务器发送Ajax请求时,应该有多个Access-Control标头。您可以检查这些是否存在以及它们的值使用$_SERVER['HTTP_ACCESS_CONTROL_header'],其中headerAccess-Control标题名称之一。如果这些值符合您的预期,请回复多个header('Access-Control-header: value');来电,以便浏览器知道您接受了预检请求,否则请勿添加任何额外的标头。浏览器将在预检后发送另一个请求,这是您实际发送邮件的时间。

  • 如果这是从user.com的服务器而不是user.com的访问者发送的,很可能服务器的IP地址不会改变(尽管它可能会也可能不会使用已定义的IP范围,所以请注意这一点。),这样您就可以验证$_SERVER['REMOTE_ADDR']是否与数据库中的值匹配。为此,您可以在数据库中保留一个已批准的IP地址表。如果您在表中找到IP地址,请允许发送邮件。

希望这有帮助。