2013-08-03 64 views
0

我是一个web应用程序的新手。我知道SO中已经提出了XSRF保护问题,但问题是针对特定语言(例如RoR/Python)或库(jQuery)的。我想知道如何在我的Web应用程序中实现XSRF保护。如何在Web应用程序中设置XSRF保护?

我的理解是,XSRF保护依赖于使用唯一的随机标记,在发出HTTP请求时必须进行身份验证。我有以下问题:

  1. 什么时候认证令牌被初始化?是否应该在页面加载时设置(即GET请求)?
  2. 令牌应该在哪里初始化?它们是否应该在输入字段,Cookie或请求标头中设置?这个随机值是如何产生的?我如何坚持这个价值以便用于比较?
  3. 验证令牌何时应验证?我如何比较认证令牌?我如何将这些令牌与我一直坚持的令牌进行比较?

在设置同步表单请求和AJAX请求方面有差异吗?

+2

尝试获得在OWASP网站https://www.owasp.org/index.php/Top_10_2013-A8-Cross-Site_Request_Forgery_(CSRF) – LRA

回答

2

什么时候认证令牌被初始化?

在会话期间,用户第一次到达包含任何您希望防止CSRF攻击的表单的页面。

是否应该在页面加载时设置(即GET请求)?

当生成HTML时,它应该嵌入到表单中。

它们是否应该在输入字段,Cookie或请求标头中设置?

隐藏输入。

使用cookie将会错过(它来自页面并且不会保留在浏览器中)。额外的标题只能在使用XHR时使用,使用一般方法。

这个随机值是如何产生的?

用随机数发生器

我怎样才能坚持这个值被用于比较?

会议

何时认证令牌验证?

作为授权步骤的一部分。

我如何比较认证令牌?我如何将这些令牌与我一直坚持的令牌进行比较?

if ($request->paramaters->{csrf} eq $session->data->{csrf}) 

是否有差异的设置为同步表单请求对一个AJAX请求?

不,你还有一个会话,你仍然有一段POST数据是令牌。

+0

更多信息“提供一个随机数生成器” - 确保该发生器随着一些语言基于可预测的种子(例如午夜过后的秒)提供随机数,所以是安全的随机数生成器。 – SilverlightFox

0

我不打算谈论一个特定的解决方案,你必须遵循的,因为有很多,我会谈论主要的想法,而不是你想要的实现它。

防止XSRF的关键思想是将一个随机令牌存储在其他域的代码无法访问的地方(例如cookie)。您可以在服务器端生成此令牌,并指示浏览器在整个会话中本地存储它。 (并不需要坚持在服务器端的任何东西)每当你执行一个请求

,发送:

  • 令牌在存储(如果您使用的cookie,浏览器会自动发送)。
  • 同样的道理在你的要求(取决于服务器的代码如何得到它使用隐藏字段无论是作为标题或正文)

在服务器端存储的一个,服务器将检查比赛。

jQuery的一个示例代码(使用jQuery的Cookie插件):

$.ajax({ 
    url:"someurl", 
    data:{token:$.cookie('token')} 
}); 

读取cookie中的能力证明,这是从你的域,而不是外部域 有实现这种不同的方式机制(不需要坚持一个具体的解决方案),只要他们坚持的主要思路:

  • 从其他领域中占有一席之地码存储在浏览器中一个秘密令牌不能读取它。
  • 将秘密令牌和从浏览器发送到您的服务器的同一标记。能够发送同样的标记证明这不是XSRF请求。

我该如何坚持这个值才能用于比较?

我们可以将其存储为cookie或会话变量。我个人更喜欢cookie,因为:

  • 减少服务器端的内存消耗。
  • 我们不需要在每个生成的HTML文件中包含该标记,以便浏览器将其发回。

是否有差异的设置为同步表单请求 对一个AJAX请求?

没有,只要你能证明这不是在请求发送同样一个XSRF请求。无论标记是什么(隐藏字段,自定义标题,..)。在Form的情况下,人们通常会将其作为隐藏字段发送。