Jquery 注册表格上是否需要CSRF保护?
默认情况下,Rails通过向站点生成的所有表单添加Jquery 注册表格上是否需要CSRF保护?,jquery,ruby-on-rails,csrf,Jquery,Ruby On Rails,Csrf,默认情况下,Rails通过向站点生成的所有表单添加authentication\u令牌,自动向所有表单添加CSRF保护 我真的希望我的网站在首页上有一个简单的注册表单,当然是一个静态HTML页面。理想情况下,这将完全避免触及Rails堆栈,从而允许我向首页提供更多的请求 这样做的缺点是使CSRF保护更加困难 但考虑到CSRF攻击通常依赖于受害者登录,以便利用信任,我想知道是否真的有必要在注册表单上设置CSRF保护。如果正确验证,注册表单将让用户登录,但我认为这对攻击者没有任何用处 在CSRF上是
authentication\u令牌
,自动向所有表单添加CSRF保护
我真的希望我的网站在首页上有一个简单的注册表单,当然是一个静态HTML页面。理想情况下,这将完全避免触及Rails堆栈,从而允许我向首页提供更多的请求
这样做的缺点是使CSRF保护更加困难
但考虑到CSRF攻击通常依赖于受害者登录,以便利用信任,我想知道是否真的有必要在注册表单上设置CSRF保护。如果正确验证,注册表单将让用户登录,但我认为这对攻击者没有任何用处
在CSRF上是否有关于这方面的既定观点或使用Rails/jQuery的变通方法?
首先,我们必须弄清楚什么是CSRF
是一种恶意攻击网站的行为,通过这种行为,未经授权的命令从网站信任的用户处传输
考虑以下示例:黑客知道您在www.example.com上有一个帐户,假设您登录了一个网站,并且仍在运行有效的会话。现在,黑客可以引诱你打开另一个网站,比如trustme.com,他在该网站上发布了一张带有以下代码的图片:
<img src="http://www.example.com/users/delete"/>
如果www.example.com的程序员通过一个简单的GET请求就可以通过该URL删除你的帐户,而黑客知道,只要查看并加载带有有效cookie的图像,就可以删除你在example.com上的帐户,尽管你只是在trustme.com上冲浪,而这两个网站似乎互不相关
综上所述,CSRF利用了网站在用户浏览器中的信任,在本例中,即www.example.com在浏览器中的信任
在你的案例中使用这种类比意味着利用你的网站对用户浏览器的信任——但这种信任尚未建立,因为用户在看到你的表单时还没有登录但是,您必须确保用户在登录并尝试再次加载该表单的页面时被重定向,否则,可以利用已建立的信任
因此,根据经验,无论何时使用cookie和会话请求验证用户,即确认或建立对用户的信任,都应使用CSRF保护。由于您希望在用户注册时建立对他的信任,因此同样适用
不幸的是,CSRF攻击不仅限于此。我发现了另外两件可能发生的事情(当然不限于此):
1.以下是一个对您的帐户进行间谍活动的好例子,在登录表单上省略了CSRF保护:
由于CSRF保护使用会话将服务器端生成的令牌与表单提交的令牌进行比较,因此我想不出一种仅在客户端执行此操作的方法,即不命中Rails堆栈。关键是客户端只有在服务器端生成令牌后才会接收令牌。如果您想缓存首页,但仍然具有CSRF保护(正如Charles所说,这可能是个好主意),则可以在加载页面后通过Javascript注入适当的真实性令牌 在“CSRF和form_Authentity_token”标题下有一些关于此的信息。有关守则如下:
$("meta[name='csrf-token']").attr('content', '<% Rack::Utils.escape_html(request_forgery_protection_token) %>');
$("meta[name='csrf-param']").attr('content', '<% Rack::Utils.escape_html(form_authenticity_token) %>');
$(“meta[name='csrf-token']”)attr('content','');
$(“meta[name='csrf-param']”)attr('content','');
使用此技术,您可以缓存整个主页,而所有客户端都需要额外(但非常小且快速)请求获取此身份验证令牌。否,对于此特定情况,不需要。CSRF攻击允许攻击者利用受害者拥有的权利, e、 g.
bank.com/pay?amount=1000&to=34.67.978.246
攻击登录表单没有任何意义,因为如果攻击者拥有成功攻击登录字段所需的信息(用户名和密码),他可以自己登录
Rails在登录字段上使用CSRF保护的原因很简单:全局实现CSRF保护要比95%的字段简单得多;) 在我看来