2012-09-11 80 views
4

我需要将CSRF保护添加到Web应用程序。CSRF保护GET链接

问题在于,应用程序严重依赖链接(GET请求)来更改数据库。

链接是使用类生成的,所以我可以轻松地为每个链接添加一个额外的CSRF令牌参数。

但是,我知道GET请求中的CSRF令牌可能不是一个足够好的保护。

请注意,应用程序只能通过HTTPS使用,因此GET参数无法在客户端/服务器通信期间暴露/被盗(但仍存在历史盗取问题)。

可以在此设置中将GET CSRF令牌参数视为“足够安全”吗?

如果不是,解决此问题的最佳方法是什么?唯一让我想到的是将每个链接都包装到一个表单中(以太,或者使用JavaScript创建表单onSubmit)。

回答

4

为了能够读取对CSRF攻击请求的响应,攻击者需要让受害者执行他的JavaScript代码。所以,对于“GET”请求的CSRF几乎没有用处。这是假设你已经按照标准的“GET”请求不应修改任何数据和任何修改需要使用“POST”

  1. 使用基于Cookie的身份验证和SSL应该让你从一个人客场仅做谁试图改变参数
  2. 您可能要推出基于时间戳一些签约,以避免重放攻击

也就是说,如果您有任何POST请求,你应该考虑的CSRF保护。

+3

GET请求*被*用于修改数据,这是我的问题。重构停止使用GET请求进行数据修改不是一种选择,所以我的问题是GET + csrf token + https是否“足够安全”,或者我应该(以及如何)正确地将GET请求更改为POST请求“ 。 – h9lpq0u

+0

在您重构具有该级别的保护之前,它可能没有问题。但它并不完全安全。您会发现,cookie中的csrf标记可以使用JavaScript代码进行抽取,并且可以在用户会话中用于错误执行。我不是100%自信这个..但检查这两个链接来决定 - http://stackoverflow.com/questions/2769992/replay-attacks-for-https-requests和https://www.owasp.org/的index.php /交叉Site_Request_Forgery_(CSRF)_Prevention_Cheat_Sheet#Disclosure_of_Token_in_URL。我不知道任何将GET转换为POST的方式。 – ddb

+0

感谢您的评论。关于将GET转换为POST,因为我使用class Link创建链接,所以我可以在一个地方更改所有链接的格式。我脑海中有两种方法。例如,我可以添加onclick javascript代码,它可以创建表单,从GET链接添加所有参数,并提交表单。或者我可以将链接包装在表单元素中,添加隐藏的参数并更改链接行为,以便它只提交该表单。 – h9lpq0u