跨站伪造请求
跨站伪造请求(cross-site request forgery)是一种利用站点对用户浏览器信任而发起攻击的方式。CSRF漏洞已经存在了很长时间,远比json出现得早。
下面我们来看一个利用json进行CSRF攻击的例子。
你登陆了一个银行的网站,这个网站有一个关于你的敏感信息的JSON URL
[
{
'user':'bobnarker'
},
{
'phone':'555-555-555'
}
]
你可能会说,“嘿,你的json最外面没有加花括号!”其实这里的json风格是合法的,不过有些合法的json十分危险,因为它们也是可执行的js脚本。本例这种情况被称为顶层json数组。
本例子中的站点使用会话cookie验证,确保信息是传送给像你一样的已经注册并且处于登陆状态的用户。
当示例中的黑客在发现银行网站上保存的敏感信息的json的url以后,会把它放到自己站点的
<script src = 'https://www.yourspecialbank.com/user.json'></script>
这样的攻击能够实现,很关键的一点就是利用了你和网站之间的凭证,没有你的凭证,
跨站脚本攻击
跨站脚本攻击(cross-site scripting,XSS)是注入攻击的一种。在使用json时常见的安全漏洞通常发生在js从服务器获取到一段json字符串并将其转化为js对象时。
要知道,json本身仅仅是文本。在编程中,如果想要对代表对象的文本进行操作,首先要将它转换为对象并且装入内存中。这样,它才能被操作、观察,并且在程序逻辑中使用。
在js中,我们可以使用eval()函数 来进行这一个操作。该函数可以获取一段字符串,并且对其进行编译与处理。
下面的示例使用eval()函数来将animal/cat对象放入内存中,之后就可以在代码中使用该对象的属性了。代码第三行的alert函数会在浏览器端弹出内容为”cat”的框。
示例获取对象的属性
var jsonString = '{"animal":"cat"}';
var myObject = eval("("+jsonString+")");
alert(myObject.animal);
这段代码相对来说没有什么危险,因为json是直接位于代码中的。不过在一些情况下,我们的json是从别的服务器上获取的。该服务器是你无权控制的第三方的服务器。
如果服务器本身发来的json数据被人劫持,那么很可能就会运行恶意代码。
eval()函数的问题就是,它会将传入的字符串无差别地编译执行。如果从第三方服务器中获取的json被替换成了恶意脚本,那么我的站点就会无辜蒙冤,在被访问者的浏览器中执行恶意代码。
举个被劫持攻击的例子:
var jsonString = "alert('this is bad')";
var myObject = eval("("+jsonString+")");
alert(myObject.animal);
JSON.parse()函数
该函数会解析JSON,但是不会执行脚本。
举例子:使用JSON.parse()代替eval()
var jsonString = '{"animal":"cat"}';
var myObject = json.parse(jsonString)
alert(myObject.animal);
安全漏洞:决策上的失误
流程:我的网站允许一个用户向另外一个用户发送包含任何内容的消息。在消息界面,我从服务端请求JSON格式的消息并在客户端使用eval()函数来将json转化为可以直接使用的js对象,然后我将该js对象的message属性的值直接显示在HTML中。
但是有一种不太规矩的json
{
"message":"<div onmouseover=\"alert('gotcha!')\">hover here.</div>>"
}
当它在用户的消息页面输出的时候,会在用户每次将鼠标移动至屏幕上的消息时弹出内容为“gotcha!”的警告框。
这个问题可能不仅仅是弹出警告框那么简单,黑客可以通过脚本获取你在这一页面上的所有私人信息,并发送到他自己的网站上保存。
如何阻止这种情况呢?
一方面,可以采取一些手段使得消息中不包含html,可以在客户端和服务器端都加上这一认证。此外,还可以将消息中的所有的html字符进行解码,这样的话,诸如