我想使用令牌。
很多操作都是用AJAX完成的,所以我必须在Javascript中传递令牌。
如果我想为每个会话或每页加载生成1个令牌,它很简单 – 我生成新的令牌,把它放在一个DOM的某个地方,然后用Javascript找到它,并发送到处理端。
但是如果我想对每个操作使用新的令牌呢?
我在想一个ajax调用来重新生成令牌,然后将结果传递到处理页面。
这是否会增加安全风险?
我正在考虑诱使用户到页面与脚本,这将请求令牌,然后使用它提出请求,但再次跨域Javascript被禁止。
可以用闪光灯做吗?
谢谢!
唯一令牌
单个特定于会话的令牌对于大多数应用程序都是足够好的。只要确保你的网站没有任何XSS漏洞,否则你使用的任何令牌技术是一种浪费。
AJAX调用重新生成令牌是一个坏主意。谁会守卫守卫?如果AJAX调用本身易受CSRF攻击,那么它就会失败的目的。使用AJAX的多个令牌通常是不好的主意。它强制您序列化您的请求,即一次只允许一个AJAX请求。如果你愿意忍受这个限制,你可以为第二个AJAX调用捎带令牌响应第一个请求。
就个人而言,我认为最好对关键事务重新验证用户,并使用会话专用令牌保护剩余的事务。
自定义HTTP标头
您可以为每个请求添加自定义HTTP标头,并检查其在服务器端的存在。实际的密钥/值不需要是秘密的,服务器只需要确保它存在于传入请求中。
这种方法足以在较新版本的浏览器中保护CSRF,但是如果您的用户使用较旧版本的Flash Player,则可能会过度工作。
检查推荐人
检查引荐来源头是否也是好的保护在较新的浏览器中的CSRF。它不可能欺骗这个头,虽然它可能在旧版本的Flash。所以,虽然它不是万无一失,它仍然增加了一些保护。
解决验证码
强制用户解决验证码对于CSRF也是有效的。它不方便,地狱,但相当有效。这也许是唯一的CSRF保护工作,即使你有XSS漏洞。
概要
>使用基于会话的令牌,但重新验证高价值事务>添加自定义http标头,并检查引荐来源网址。两者本身都不是万无一失,但不要伤害