针对GET请求的CSRF预防

时间:2014-03-14 18:29:43

标签: javascript web csrf

根据我的阅读,CSRF预防似乎侧重于(1)使GET请求无副作用,以及(2)仅使用带有CSRF令牌的POST请求来改变状态。但在我看来,这假设攻击者可能拥有的唯一目标是恶意更新受害者网站。如果攻击者只想要通过GET请求检索的信息怎么办?有人不能将受害者网站的敏感资源嵌入攻击网站并通过Javascript与其进行交互吗?

所以我的问题是(1)是可能的,(2)你如何防止它?

2 个答案:

答案 0 :(得分:2)

如果攻击者有办法接收服务器对受害者请求的响应(响应将被传输到受害者的浏览器,但不会传输给攻击者),则攻击者可能会受益于CSRF GET请求。 / p>

但是,在典型的CSRF方案中,攻击者无法访问响应,因为它是从服务器传输到受害者的Web浏览器(而不是传输给攻击者)。通常意图是导致某些状态更改,例如启动付款,发送电子邮件等,这通常由客户端使用PUT,POST,PATCH或DELETE等方法发出HTTP请求来启动。

答案 1 :(得分:2)

攻击者可以在其网页上包含以下脚本:

$.get('http://vulnerable.example.com/json')

但是,由于Same Origin Policy,攻击者域名上的JavaScript无法读取响应。相同的源策略检查域,协议和端口是否匹配 - 如果他们不想在尝试读取响应时JavaScript遇到安全性错误。例如,这是Chrome在尝试从其他域访问IFrame时提供的警告 - 这与保护JavaScript响应的机制完全相同。

Uncaught SecurityError: Failed to read the 'contentDocument' property from 'HTMLIFrameElement': blocked a frame with origin "http://evil.com" from accessing a frame with origin "http://vulnerable.example.com". Protocols, domains, and ports must match.

总而言之,POST请求必须使用CSRF令牌,因为即使无法读取响应,仍然会发出POST请求,并且GET请求通常不会引起关注,因为无法读取响应且它们是非破坏性的。 JSON Hijacking存在问题,但是你必须回到Firefox 3才能找到易受此攻击的浏览器。见Is JSON Hijacking still an issue in modern browsers?