Jquery 注册表格上是否需要CSRF保护?

Jquery 注册表格上是否需要CSRF保护?,jquery,ruby-on-rails,csrf,Jquery,Ruby On Rails,Csrf,默认情况下,Rails通过向站点生成的所有表单添加authentication\u令牌,自动向所有表单添加CSRF保护 我真的希望我的网站在首页上有一个简单的注册表单,当然是一个静态HTML页面。理想情况下,这将完全避免触及Rails堆栈,从而允许我向首页提供更多的请求 这样做的缺点是使CSRF保护更加困难 但考虑到CSRF攻击通常依赖于受害者登录,以便利用信任,我想知道是否真的有必要在注册表单上设置CSRF保护。如果正确验证,注册表单将让用户登录,但我认为这对攻击者没有任何用处 在CSRF上是

默认情况下,Rails通过向站点生成的所有表单添加
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保护:

  • 黑客在你真正信任的网站上创建了一个帐户(youtrustthis.com)
  • 他用自己的凭证伪造你浏览器的登录请求,并欺骗你使用他的帐户
  • 如果你没有注意到你实际上是以另一个用户的身份在youtrusthis.com上冲浪,攻击者会在稍后看到你“代表他”所做的事情,这相当于在监视你
  • 2.:如果没有CSRF保护,黑客可以在自己的html文档中模拟您的登录或注册表单,并方便地一次又一次地提交(或仅从终端进行提交),而受信任的站点不会注意到请求实际上并非来自自身-即。,受信任域上的实际登录表单从未显示在浏览器中,也没有从浏览器提交。这使他更容易执行暴力攻击。如果恶意用户成功尝试查找凭据,您的服务器将使用有效的会话cookie进行响应,并信任该用户,从而窃取您的身份。如果这是一个注册表格,他将能够注册大量的帐户,从而垃圾邮件你的数据库

    总结一下:使用CSRF保护。恶意用户很可能使用不安全的登录和注册表单滥用您的网站,监视您的用户或窃取他们的身份

    有关更多信息,请参阅和。后者在第3页有一个关于登录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%的字段简单得多;)

    在我看来