2016-11-18 140 views
1

在同步标记模式,我总是看到在一个隐藏字段或URL的CSRF令牌。将它附加到ajax post请求的末尾并让服务器决定是否需要使用它是否安全?如果这是为什么人们不这样做?CSRF同步令牌

回答

0

简短的回答是,它并没有多么您在同步标记模式发送令牌,只要它是不会自动发送浏览器请求是否被另一个原点(即制造。它不是在一个cookie )。因此,将它附加到ajax post请求的末尾是很好的(虽然我不太清楚你的意思:))。

在谈到没有Ajax调用传统的表单应用程序,一个隐藏的表单字段是最便捷的方式。您只需将标记放置在每个表单的隐藏字段中,并且客户端上没有任何其他操作可以轻松完成。

阿贾克斯改变了风景,AJAX调用不会自动发送令牌,你要自动照顾它。例如,对于jQuery,您可以使用$.ajaxSetup中的beforeSend钩子自动将令牌添加到请求。当请求内容类型为x-www-form-urlencoded时,您可以将其添加为另一个表单变量,当它是一个带有application/json的json请求时,可以将其添加为json值。这将是安全的,但我可以看到两个问题。

之一是,令牌是一种“元数据”的要求,你的业务逻辑和业务数据的不部分。它也是跨数据结构的一个交叉问题,并不针对查询。所以最好不要使用数据结构。

另一个问题是,在加入beforeSend令牌到已经请求池莉构建数据是乏味的。您必须深入研究数据结构,找到/创建令牌的变量等。

将它作为标记发送会更容易,这是人们在将标记添加到ajax请求时主要执行的操作。添加像X-CSRF-Token或类似的自定义请求标头非常常见,然后服务器端可以从那里验证令牌。

+0

非常好的解释!我有一个非传统的方式来在PHP中完成它。这不是常识,因为它是我为我的应用程序专门设计的。我只是想知道是否有任何安全问题,我没有太多的知识来纠正应用程序的安全问题,以及哪些是明显或不明显的缺陷。 –