我最近一直在努力通过使用令牌来阻止发生CSRF攻击。根据我的理解:
1)用户登录,设置会话cookie以登录并生成CSRF令牌并将其保存到会话
2)用户提交表单(带令牌),它应与会话中的令牌匹配
假设我说我有page1.php,它有一个sql SELECT
来获取所有用户帐户信息,然后在同一页面中我还有一个ajax按钮来更改帐户信息。显然我保护page2.php不受CSRF的影响(因为这是一个帖子请求)但是如何防止page1.php?如果要通过ajax从远程源调用此页面或在攻击者网站上放置iframe,那么这肯定会打印所有受害者帐户信息吗?
如果是这样的话,为什么我似乎无法找到保护所有页面免受CSRF攻击的事情,我只能找到资源来防止ajax中的CSRF攻击?
答案 0 :(得分:1)
假设您在http://application.com/mypage处有一个页面,其中包含一些数据和生成的CSRF令牌。攻击者创建http://attacker.com/attack,当application.com的有效用户访问时,向application.com发出请求(通过ajax或在iframe中,并不重要)以获取应用程序数据。标准csrf。
这对攻击者不起作用的原因是同源策略。当受害者用户在attacker.com上时,对application.com的请求将是跨域的。如果它是iframe,则会显示数据,但是attacker.com将无法访问它,它只会显示给无论如何都可以在application.com上查看的用户。如果它是一个ajax调用,同样适用,则attacker.com上的javascript将无法访问响应,由浏览器确保。
对于ajax调用,可以通过application.com在响应中发送的access-control-allow-origin和相关响应头(CORS)显式启用对跨域响应的访问。
请注意,尽管是跨域的,但仍会进行调用(预检请求在某些情况下会发挥作用,但现在不要进入)。它只是攻击者无法访问的响应,这足以阻止csrf。
(另外作为旁注,application.com应该通过例如发送x-frame-options: sameorigin
标题以防止点击劫持和类似攻击来阻止显示在iframe中,但这不是问题。)
答案 1 :(得分:0)
我不确定我是否明白了,但CSRF的令牌应该是一个nonce,它会在每次调用时发生变化。
对于来自其他地方的来电,ajax请求还应该检查该呼叫来自具有正确权利的有效用户,就像使用任何"常规"打电话到网站。
如果是这种情况,我怎么能找到任何东西 保护所有页面免受CSRF攻击,我只找到资源 防止ajax中的CSRF攻击?
你通常做的是在你使用的表格的隐藏输入中设置一个随机数"常规"页。
答案 2 :(得分:0)
假设让页面上有一个sql select而不是 请求发布。现在,如果要从远程源调用此页面 通过ajax或在他们的网站上放置一个iframe,肯定会打印出来 所有的受害者数据?
确保发出的所有请求"机密"信息(作为网页或ajax调用的数据(或将来的任何内容)确实确认有效的会话是活动的。如果不是,请确保服务器端部分没有发布任何机密信息但是抛出错误并确保你的ajax客户端理解它并为正常用户做正确的事情(比如告诉他们他们没有登录并提供他们来修复它)。
如果是这种情况,我怎么能找到任何东西 保护所有页面免受CSRF攻击,我只找到资源 防止ajax中的CSRF攻击?
对于常规的帖子请求,通常使用隐藏输入字段输出表单,该字段包含CSRF令牌。这就是全部。
但请确保处理请求的代码验证隐藏字段是否存在并使用正确的值填充。
还要确保修改内容的任何请求都受CSRF保护。例如。应该通过发送和验证CSRF令牌来保护非ajax上下文中的删除按钮(因此该按钮最终会成为具有CSRF隐藏字段的表单。