代码之家  ›  专栏  ›  技术社区  ›  MatthewMartin muthu

这个想法中有没有逻辑循环漏洞来防止跨站点请求伪造?

  •  1
  • MatthewMartin muthu  · 技术社区  · 15 年前

    我已经阅读了一些XSRF解决方案,它们依赖于向响应中添加更多的令牌,这有助于保护只在POST上运行的代码。

    也就是说,这将是依赖于响应HTTP GET的页面的一步攻击

    <img src="http://amazon.com/buybook/anarchistscookbook/mailto/me/execute.php">
    

    但是有了jquery这样更好的库,编写恶意的javascript xmlhttpRequest脚本变得更加容易,可以进行两步攻击(一个get,解析anti-xsrf viewstate/query-string/extra-cookie等),然后提交一篇文章。(还是?我不担心AES很快就会被破解,我是否应该担心针对HTTP Post操作的两步XSRF攻击会像上面显示的img标签攻击一样容易呢?)

    我想一步攻击可以通过在get上不做任何敏感的事情来表示,这两种攻击都可以通过要求网站用户解决captcha来表示,然后该captcha会生成一个查询字符串令牌,这对于会话的其余部分的所有URL都是必需的吗?

    到目前为止,它似乎只有在captcha失败时才会失败,比如OCR软件是否可以读取文本,或者是否有一个机械的Turk组件。

    编辑:特别的攻击是一封带有xhr javascript或图像标签的电子邮件。因此,代码将在电子邮件客户端的浏览器中执行,或者从本地文件系统加载的HTML页面执行。为了简单起见,我想象站点没有XSS漏洞(即恶意用户没有机会将HTML注入到站点作为响应发送的HTML中)

    3 回复  |  直到 15 年前
        1
  •  1
  •   EricLaw    15 年前

    重点是javascript不能从跨域上下文中读取反xsrf令牌,而xmlhttpRequest只具有相同的来源,因此不能用于窃取令牌。

    如果您的站点已经存在XSS漏洞,那么您已经拥有主机,而反XSRF令牌将不会帮助您。

        2
  •  1
  •   Coding With Style    15 年前

    现在XMLHttpRequests和JavaScript帧操作都不能跨域工作,这完全是疯狂的。现在的CSRF攻击通常由你提到的图像标签或者自动生成一个发布到另一个站点的表单组成。但是,检索一个反XSRF令牌(可能是基于每个会话生成的加密nonce)几乎是不可能的。只有当它是一个非常糟糕的令牌而不检查用户会话和IP地址时,服务器端语言才可能被用来检索它,然后将其与客户端CSRF结合起来。除了令牌,很多人通过检查引用者和阻塞所有远程域来停止CSRF。由于域限制,使用xmlhttpRequests提交CSRF实际上是不可能的。

    无论如何,您不必担心XMLHttpRequest能够访问远程域。这样的事情唯一可能发生的时间就是如果你有一个XSS漏洞,在这种情况下,正如埃里克洛所说,你已经被托管了。

        3
  •  1
  •   Cheekysoft Moz Morris    15 年前

    我认为你对同一原产地的政策感到困惑。请求本地文件中的HTML页不会绕过此策略。实际上,我认为更严格的规则适用于文件资源。您将在本地HTML文件中发现javascript将 能够成功请求检索非本地资源。

    现代浏览器不允许使用javascript 在本地HTML文件中访问远程 HTTP资源。

    在哪个浏览器中,您能够成功地从文件:///资源执行跨域XHR?

    我在ie6、ie7、ie8、firefox 3、firefox 3.5以及Windows上最新版本的chrome、opera和safari中对此进行了测试;它们都拒绝跨域HTTP请求。

    <html>
    <head>
    <script 
      type="text/javascript" 
      src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js"></script>
    <script type="text/javascript">
      $(document).ready(function() {
        $( '#xhr' ).append( 'replace me with remote xhr' );
        $( '#xhr' ).load( 'http://stackoverflow.com/', function() {
          $( '#xhr' ).append( 'xhr load complete' );        
        });
      });
    </script>
    </head>
    <body>
      test
      <div id="xhr">original</div>
    </body>
    </html>
    

    一些老得多的浏览器可能限制较少。