JSON

JSON 知识量:10 - 17 - 48

5.1 主要的攻击方式><

跨站请求伪造- 5.1.1 -

跨站请求伪造称为CSRF,是一种利用(网站)站点对用户浏览器信任而发起攻击的方式。

站点经常使用会话cookie来验证用户是否合法,以进行信息的传递和交互,例如网站登录等操作。浏览器对于不同域名的站点之间进行资源分享有一定的限制,例如在浏览器中同时打开两个不同的网站,这两个网站的页面之间通常是不能进行信息通信的。但是黑客可以使用<script>标签绕开形如会话cookie验证等验证规则,来访问本无权访问的内容。例如:有个银行网站通过user.json文件保存了用户的基本信息。

[
    {
        "userName": "James",
        "code": 88888888,
        "phone": 18866666666
    }
]

以上是一个顶层JSON数组,这里的JSON格式也是合法的。这时黑客给你发送了一个重要“提醒”的email,说你的银行账号存在危险,并给了你一个指向详细内容页面的链接。而且,黑客在这个所谓详细内容页面的代码中加入了以下<script>脚本。

<script src="https://www.yourBank.com/user.json"></script>

你看到黑客的通知很迷惑,马上通过浏览器登录了自己的银行查看,没发现什么问题。但你还是不放心,于是点击了黑客的详细内容页面链接,那么这时你的信息就泄露给了黑客。因为同时打开了银行网站和黑客网页,银行网站认为与你的连接是安全的,而黑客的<script>脚本可以绕过访问限制,利用银行网站对你的信任访问user.json文件。

如何防范跨站请求攻击呢?

  • 首先,银行应当将数组作为一个值存入JSON对象,这样数组将不再是合法的JavaScript。

    {
        "info": [
            {
                "userName": "James",
                "code": 88888888,
                "phone": 18866666666
            }
        ]  
    }
  • 其次,银行应当仅允许POST请求,禁止使用GET请求,这样黑客便无法使用他自己的URL中的链接了。

    GET和POST是HTTP协议提供的用于与服务器交换数据的两种方法。GET用于请求数据,得到响应。POST用于提交数据,得到响应。如果允许使用GET请求,就可以直接通过浏览器或<script>标签链接到网站,而POST则不可以直接被链接到。一旦不能使用<script>标签,黑客会受到资源共享策略的限制,从而无法利用银行对客户浏览器的信任进行欺骗。

跨站脚本攻击- 5.1.2 -

跨站脚本攻击称为XSS,是注入攻击的一种。

JSON本身是文本,在编程中,如果要对表示对象的文本进行操作,首先就需要将JSON转换成真正的对象并装入内存中。而常见的安全漏洞就发生在转换过程中。

在JavaScript中,可以使用eval()函数来将JSON转换成对象。例如:

var jsonString = '{"car":"BMW"}';
var carObject = eval("(" + jsonString + ")");
alert(carObject.car);

上面的代码相对来说没有什么危险,因为JSON直接位于代码中。但是如果是从其他网站上获得的JSON,如果其含有恶意代码,就会存在很大风险。eval()函数的最大问题在于,它会将传入的字符串无差别的编译并执行。例如将以上代码改为:

var jsonString = 'alert("wrong!")';
var carObject = eval("(" + jsonString + ")");
alert(carObject.car);

当代码运行时,eval()函数会执行alert()函数,浏览器会弹出“wrong!”,如果不只是“wrong”,而是窃取你的关键信息等操作,那就真的糟了。

为了避免这类威胁,可以使用JSON.parse()函数来取代eval()函数。JOSN.parse()函数仅会解析JSON,但不会执行脚本。

var jsonString = '{"car":"BMW"}';
var carObject = JSON.parse(jsonString);
alert(carObject.car);