CSRF令牌 - 如何正确实施?

Ind*_*ial 12 php security csrf

我刚刚在我的应用程序中设置了一个简单的CSRF保护.它会创建一个独特的crumb,在提交表单时会根据会话值进行验证.

不幸的是,这意味着我不能同时打开我的应用程序的多个实例(浏览器中的选项卡),因为CSRF碎屑彼此冲突.

我应该为每个实际表单创建一个单独的令牌,还是为我的所有表单使用共同的共享面包屑?这里有什么常识?

Jas*_*ean 6

你也可以.这取决于您想要的安全级别.

OWASP Enterprise Security API(ESAPI)使用每个用户会话方法的单个令牌.假设您没有XSS漏洞并且会话时间相当短,那么这可能是一种非常有效的方法.如果您允许会话保持活动数天或数周,那么这不是一个好方法.

就个人而言,我觉得很难为每个表单的每个实例使用不同的标记.我使用键值对在用户会话中存储结构.每个项目的关键是表单的ID,值是包含令牌的另一个结构以及该令牌的到期日期.通常情况下,我只允许令牌存活10-20分钟,然后它就会过期.对于更长的表格,我可以给它一个很长的到期时间.

如果您希望能够在同一会话中的多个浏览器选项卡中支持相同的表单,那么我的方法会变得有点诡计,但仍然可以通过使用唯一的表单ID轻松完成.

  • 我认为每个会话只有一个令牌是合理的,只要你不通过http(仅https)提交它们.他们与会话ID共享许多安全问题.如果你有XSS,攻击者可以打开iframe,读取令牌,然后进行CSRF. (4认同)