这是关于生成CSRF令牌的问题。CSRF令牌生成
平时我想基于掀起了独特的作品与用户的会话相关的数据的一个令牌,散列,并用私钥咸。
我的问题是关于在没有唯一的用户数据使用时生成令牌。没有会话可用,Cookie不是一个选项,IP地址和这种性质的东西是不可靠的。
是否有任何理由,我可以不包括散列的以及请求的一部分字符串? 实施例的伪代码生成令牌并将其嵌入:
var $stringToHash = random()
var $csrfToken = hash($stringToHash + $mySecretKey)
<a href="http://foo.com?csrfToken={$csrfToken}&key={$stringToHash}">click me</a>
实施例的服务器端的跨站请求伪造的确认标记
var $stringToHash = request.get('key')
var $isValidToken = hash($stringToHash + $mySecrtKey) == request.get('csrfToken')
的字符串中的散列被用于将在每个请求不同。只要它包含在每个请求中,就可以继续进行CSRF令牌验证。由于每个请求都是新的,并且只嵌入在页面中,因此外部对令牌的访问将不可用。令牌的安全性然后落在我只知道的$ mySecretKey上。
这是一个天真的做法?我错过了某些原因,为什么这不起作用?
由于
所提出的解决方案是容易受到重放攻击。相同的标记和组合键将无限期地工作。 – Matthew 2012-01-24 06:56:05