RESTful 站点对 CSRF 攻击是否安全?

信息安全 Web应用程序 csrf
2021-08-13 11:02:24

我正在与一位同事讨论我们的网站是否容易受到 CSRF 攻击。他说,由于我们对 CSRF 不可能的所有事情都使用 RESTful AJAX 请求。假设更新您的帐户信息的请求如下所示:

POST /ajax/account/savebasic HTTP/1.1
Host: www.mysite.com
Connection: keep-alive
Content-Length: 72
Accept: application/json, text/javascript, */*; q=0.01
Origin: https://www.mysite.com
X-Requested-With: XMLHttpRequest
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.65 Safari/537.36
Content-Type: application/json; charset=UTF-8
Referer: https://www.mysite.com/portal
Accept-Encoding: gzip,deflate,sdch
Accept-Language: en-US,en;q=0.8
Cookie: X-Mapping-fjhppofk=B8BFE26CD0B3A37348ECC6FFE3940306; sdemail_5228=tester%40test.com; sd_5228=%7B%7D; connect.sid=s%3AAQIPx7hyddXEYTOuyP857jEG.D002GI6%2FSEF0m5WTBUxRmbjpE48%2BMkPxEe9o2T9DH1Y; __utma=160595647.1524201255.1358783236.1379476052.1379533347.150; __utmb=160595647.1.10.1379533347; __utmc=160595647; __utmz=160595647.1376327581.102.3.utmcsr=google|utmccn=(organic)|utmcmd=organic|utmctr=http://mysite.com/

{"fname":"abe","lname":"m","company":"comp","email":"abe@test.com"}

我创建了一个测试 HTML 页面,testdomain.com如下所示:

<html>
<head>
    <title>Bad site</title>
    <script type="text/javascript" src="//ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script>
</head>
<body>
    <div id="main">Hey!</div>
    <script type="text/javascript">
$.ajax({
    type: "POST",
    url: "http://www.mysite.com/ajax/account/savebasic",
    data: { 
        "fname": "CSRF",
        "lname":"CSRF",
        "company":"CSRF",
        "email":"abe@test.com"
    },
    dataType: "jsonp"
 });
    </script>
</body>
</html>

认为它会覆盖所有内容,但它重定向了几次并最终引发 404 错误。我的同事说因为我们使用 AJAX/REST 而对 CSRF 是安全的,这是否正确?

2个回答

同源策略不允许 JavaScript 或类似接收主机外部发送请求的响应!

在计算中,同源策略是许多浏览器端编程语言(例如 JavaScript)的重要安全概念。该策略允许在源自同一站点的页面(方案、主机名和端口号1的组合)上运行的脚本无特定限制地访问彼此的方法和属性,但禁止跨不同站点的页面访问大多数方法和属性. 1同源策略也适用于 XMLHttpRequest 和 robots.txt。


您的应用程序是 Ajax,但它可能容易受到 CSRF 的攻击(如果您不检查内容类型或添加不安全的同源策略)。

如果你不检查内容类型,攻击者可以用正常的形式发送这个请求,像这样:

<form name="x" action="http://site/index" enctype="text/plain" method="post">
  <input type="hidden" name='{"fname":"abe","lname":"m","company":"comp","email":"abe@test.com","Junk":"' value='Noting"}'>
</form>
<script>document.x.submit();</script>

简单的答案是否定的,RESTful 站点对于 CSRF 攻击并不是“天生”安全的。RESTful 不会阻止 CSRF,因为 CSRF 不需要 REST 才能工作。想想会话固定,它可以是 CSRF 的一种形式。如果我可以修复您的会话 ID,那么我可以开始以您的身份执行请求,无论是否为 RESTful。此外,不要被 CSRF 和 XSS(跨站点)的第一部分混淆,因为攻击不需要从一个主域发生到另一个主域才能成为 CSRF 或 XSS。在试图防御这些类型的攻击时,这有点用词不当,会使人们感到困惑。仅仅因为您不依赖引用者或者您设置了严格的同域来源策略并不意味着您仍然不会受到 CSRF 的攻击。