Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ajax/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ajax 传递CSRF令牌_Ajax_Csrf Protection - Fatal编程技术网

Ajax 传递CSRF令牌

Ajax 传递CSRF令牌,ajax,csrf-protection,Ajax,Csrf Protection,我试图以通过javascript而不是jQueryAjax函数提交的形式传递CSRF令牌。公认的智慧似乎是将代币作为实际形式的隐藏输入。在我看来,这样做的问题在于,使用浏览器检查工具可以很容易地看到隐藏输入的内容。那么,有没有更安全的方法来传递令牌呢?CSRF令牌在源代码中是可访问的,这不是问题,因为它并不意味着对客户端浏览器隐藏。当我在这里说隐藏时,我不是在谈论表单隐藏的HTML属性,而是通过分析真正隐藏的页面源、脚本执行或网络流量来公开令牌 您必须理解为什么CSRF令牌很有用。如果攻击者创建

我试图以通过javascript而不是jQueryAjax函数提交的形式传递CSRF令牌。公认的智慧似乎是将代币作为实际形式的隐藏输入。在我看来,这样做的问题在于,使用浏览器检查工具可以很容易地看到隐藏输入的内容。那么,有没有更安全的方法来传递令牌呢?

CSRF令牌在源代码中是可访问的,这不是问题,因为它并不意味着对客户端浏览器隐藏。当我在这里说隐藏时,我不是在谈论表单隐藏的HTML属性,而是通过分析真正隐藏的页面源、脚本执行或网络流量来公开令牌

您必须理解为什么CSRF令牌很有用。如果攻击者创建了一个托管在外部域下的恶意网页,并将其发布或访问您的网站,那么他可以期望经过身份验证的用户成为受害者,并在cookie中使用打开的会话和sesion ID来执行发布/获取:受害者的浏览器将检测到目标URL,将cookie/会话ID添加到GET/POST头中,并代表经过身份验证的用户执行操作,例如:销毁我的帐户

如果您在源中创建随机CSRF令牌,攻击者将无法读取该令牌,因为由于跨域内容隔离,他无法代表受害者的浏览器加载页面并读取其内容,因此无法构建将执行GET或POST的恶意页面


至于其他方法,其他网站使用会话初始化时每个用户生成的唯一静态CSRF令牌,该令牌保存在cookie中,并通过JS包含在网站的表单中。结果是相同的,令牌将是表单提交的一部分,因此可供客户端浏览器访问。您只需避免为每个表单生成CSRF令牌,服务器就可以轻松地将令牌与客户端的会话数据进行比较,而不是执行侧通道令牌管理

我正在构建的应用程序实际上有几个表单,每个表单都在自己的页面上。我设想在每次加载一个表单时生成一个新的CSRF令牌,而不是一个静态令牌。为了简单性和可维护性,我会选择另一种方式。我知道银行级平台将CSRF令牌存储在cookie中,并在所有表单上重复使用。如果CSRF每次都被更改,那么在安全方面就没有真正的附加值,因为如果它只泄漏一次,则意味着整个用户会话都被泄漏,这使得CSRF成为问题最小的问题。但最终,如果自动化程度足够高,两者都是可行的解决方案。