2014-01-21 33 views

回答

5

没有可靠的方法来告诉HTTP请求是为响应构建的。

你可以做的是实现对CSRF的防御。这并不能保证提交来自您自己的服务器上的表单,但它会阻止第三方(Mallory)欺骗您网站的用户(Alice)代表他们提交不良数据。

当爱丽丝到达您的站点时,生成随机令牌并将其提供给她(例如在会话中)。将该标记的副本放入表单中的隐藏输入中。如果在提交表单时,令牌不匹配,则请求来自Mallory。


如果问题是你不相信爱丽丝不自己编辑表格,那么你不能用它作为防御。

不要给你不信任她的Alice数据。在让他们访问站点的相关位之前,检查提出请求的用户的身份。

例如,如果表单是“删除消息”表单并且您的担心是“Alice可能更改要删除的消息的ID”,那么当您得到时,请检查Alice是否为该消息的拥有者请求删除它。

+0

怀疑:我们不能使用$ _SERVER [“SERVER_NAME”]或$ _SERVER ['HTTP_REFERER']?有任何疑问吗? – user1844933

+0

'SERVER_NAME'告诉你发送请求的服务器的名称*为*。 'HTTP_REFERER'是可选的,浏览器通常不会发送它。 – Quentin

3

你是有需要的CSRF token的。

当页面被请求字符串添加到窗体,像

<input type=hidden name=token value=$token> 

,并将其保存在数据库中也是如此。

令牌可以使用类似时间戳的散列来生成。

提交表单时,验证令牌是否由服务器本身生成。

相关问题