Ruby on rails Rails默认CSRF保护是否不安全?

Ruby on rails Rails默认CSRF保护是否不安全?,ruby-on-rails,security,xss,csrf,Ruby On Rails,Security,Xss,Csrf,默认情况下,Rails中的form post CSRF protection为用户创建一个真实性令牌,该令牌仅在用户会话更改时更改。我们的一位客户对我们的网站进行了安全审计,并将其标记为问题 审核员的声明是,如果我们还存在XSS漏洞,攻击者可以获取另一个用户的真实性令牌,并利用它进行CSRF攻击,直到用户的会话过期 但在我看来,如果我们有这样一个XSS漏洞,攻击者就可以像直接登录那个用户一样轻松地抓取另一个用户的会话cookie并登录。甚至当用户受到攻击时,从脚本调用RESTAPI。在这种情况下

默认情况下,Rails中的form post CSRF protection为用户创建一个真实性令牌,该令牌仅在用户会话更改时更改。我们的一位客户对我们的网站进行了安全审计,并将其标记为问题

审核员的声明是,如果我们还存在XSS漏洞,攻击者可以获取另一个用户的真实性令牌,并利用它进行CSRF攻击,直到用户的会话过期

但在我看来,如果我们有这样一个XSS漏洞,攻击者就可以像直接登录那个用户一样轻松地抓取另一个用户的会话cookie并登录。甚至当用户受到攻击时,从脚本调用RESTAPI。在这种情况下,能够发动CSRF攻击似乎并没有更糟。。。问题在于XSS漏洞


我错过什么了吗?Rails中默认的CSRF保护真的有问题吗?

你完全正确。基于令牌的CSRF保护是最常见的,只要您对应用程序进行XSS测试,就应该可以了

在某些情况下,无论XSS如何,CSRF仍然可以停止。例如,对于您的密码更改论坛,要求他们知道当前密码。黑客将无法伪造此请求,除非他知道当前密码,这一点毫无意义


另一种方法是要求为该请求求解验证码。我建议使用reCapthca

从技术上讲,如果您有一个表单,除了需要其他数据外,还需要用户输入密码,那么您不是在保护CSRF或XSS,而是在防止会话被盗。CSRF攻击是指能够使用当前浏览器会话的凭据在另一个站点上执行命令。请注意,如果您存在XSS漏洞,并且表单要求用户输入非OTP密码,则攻击者只获得了用户的密码@Mikko Rantalainen这将是网络钓鱼,而不是CSRF。您可以使用xss将页面主体重写为接受密码的论坛。但是,如果有表单要求在其他页面上输入密码,则XSS不能用于读取该密码,因为XHR无法读取该密码。您是对的,要求输入用户密码的页面上的XSS漏洞是在没有网络钓鱼的情况下获取密码所必需的。此外,如果您在站点的每个页面上都嵌入了登录表单(就像现在一样),任何XSS漏洞都可能导致暴露用户密码(使用XSS使用XHR在其他地方以静默方式提交被盗的登录/密码)@Mikko Rantalainen重写onsubmit处理程序以将用户名/密码传输到攻击者的服务器。请注意,在CSRF for Rails中发现了一个漏洞,该漏洞存在于Rails版本3.0.3及以下版本中。看见升级到3.0.4以确保解决此问题。作为补充说明,会话cookie应设置为
HttpOnly
,以便XSS不会窃取它们。