JSON必知必会笔记(2)--前五章 JSON中的安全问题

跨站伪造请求

跨站伪造请求(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字符进行解码,这样的话,诸如

这样的标签就会被转化为<div> 被插入页面,它们将不再是合法的html。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值