据我所知, CSRF
是HTTP(S)的应用程序的一大安全隐患。
从外观上来看,大多数的框架发送CSRF
令牌作为请求主体的一部分。 然而,在我的情况是有几个原因有些不雅; 最重要的是我不想与可能发送传输层混乱POST
请求在许多不同的格式,不一定都是JSON
或x-www-form-urlencoded
。
作为一个解决方案,我想一个更侵入替代的; 具体地讲,我生成随机头:随机标题名称(公共前缀),含有随机CSRF
令牌。
是否有任何安全(或其他种类)的风险是什么?
你可以只设置X-Requested-With
头,然后检查此服务器端。 许多框架,如jQuery,自动添加这AJAX请求。
X-Requested-With
为指示该请求经由AJAX由事实上的标准。
因为它是不可能的这头被发送跨域没有服务器通过CORS选择加入你并不需要一个随机令牌。
因此,设置和检查非标准头是为了防止CSRF的一种有效方式。
在OWASP CSRF预防小抄并没有提到它,但是它确实提到检查Origin
头。 然而, 这种逻辑并不简单因为许多浏览器不发送Origin
于同一产地的请求。
另外这仅适用于AJAX请求。 与正常的表单POST,不可能添加额外的头。 此外,在过去曾有与像Flash插件,允许任何头被设置使攻击者能够使用Flash做跨域请求的错误。 然而,像这样的问题早已被修补。
如果你想有一个令牌,以及在深度防御策略的一部分,您能适应X-Requested-With
包括随机令牌,然后检查。 例如X-Requested-With: XMLHttpRequest;0123456789ABCDEF
。
然后令牌可以简单地只是为了CSRF预防目的而创建cookie的值(当然,一个密码安全算法和熵源产生)。
是否有任何安全(或其他种类)的风险是什么?
没有:只要你可以从客户端传递,并检查服务器上 - 你没事
另外,我应该多久刷新CSRF令牌? 我需要每个网站的访问和一天一个新的为每一个请求,或每隔几个请求,或一次,还是......?
一般来说,你不应该刷新它。 如果它使用强加密随机数生成器生成的 - 你可以有每个会话之一。 什么重要的是,这是不可能的猜测,所以它不应该由任何已知的数据导出。