我已经做过一些关于如何防止虚假的跨域请求的研究,并且已经找到了很多有用的信息。但是,它们似乎都没有直接解决我的问题,而且由于我的应用程序必须处理这种特定情况,我想完全理解它。
我有一个简单的php邮件网站:mailsite.com
此站点将允许其他预定义地址(例如user.com)向其发送POST数据,并处理包含to
和mesaage
的信息;然后通过邮件to
向他们发送电子邮件至mailsite.com至message
。
目前,我正在使用$_SERVER[ "HTTP_ORIGIN" ]
和$_SERVER[ "HTTP_REFERER" ]
来检查请求的来源;如果它来自预定义的域,则处理它们。但是,我读过一些文章说:
但是,我允许的请求来自第三个预先定义的网站,令人如何在这种情况下工作?
我的问题是:如果我允许特定域将数据发布到我的网站,我如何确保(或最安全的方式)这些请求来自我期望的网站? HTTP_ORIGIN甚至不够安全吗?我敢于考虑允许第三个网站将数据发布到我的网站,因为我已经看到Facebook允许人们访问他们的数据库。必须有一些可能的解决方案来检查请求的来源。
答案 0 :(得分:1)
听起来你可能有多种解决方案:
使用令牌权限系统。为user.com提供一个私有令牌,作为隐藏值添加到输入表单。提交此表单后,浏览器将为您的服务器提供令牌,用户不必知道该令牌。您根据自己的数据库检查令牌。如果找到令牌,请允许发送邮件。
使用 CORS(跨源资源共享)。当从user.com向您的服务器发送Ajax请求时,应该有多个Access-Control
标头。您可以检查这些是否存在以及它们的值使用$_SERVER['HTTP_ACCESS_CONTROL_header']
,其中header
是Access-Control
标题名称之一。如果这些值符合您的预期,请回复多个header('Access-Control-header: value');
来电,以便浏览器知道您接受了预检请求,否则请勿添加任何额外的标头。浏览器将在预检后发送另一个请求,这是您实际发送邮件的时间。
如果这是从user.com的服务器而不是user.com的访问者发送的,很可能服务器的IP地址不会改变(尽管它可能会也可能不会使用已定义的IP范围,所以请注意这一点。),这样您就可以验证$_SERVER['REMOTE_ADDR']
是否与数据库中的值匹配。为此,您可以在数据库中保留一个已批准的IP地址表。如果您在表中找到IP地址,请允许发送邮件。
希望这有帮助。