一、JSONP为何物
JSONP 全称是 JSON with Padding ,是基于 JSON 格式的为解决跨域请求资源而产生的解决方案。他实现的基本原理是利用了 HTML 里 <script></script> 元素标签,远程调用 JSON 文件来实现数据传递。
细致的介绍可以看这:https://blog.csdn.net/hansexploration/article/details/80314948
沿用文章里的观点,jsonp就是使用动态的js调用来实现ajax的效果,却能实现跨域取数据的功能。
二、JSONP劫持
通过JSONP技术可以实现数据的跨域访问,必然会产生安全问题,如果网站B对网站A的JSONP请求没有进行安全检查直接返回数据,则网站B 便存在JSONP 漏洞,网站A 利用JSONP漏洞能够获取用户在网站B上的数据:
-
用户在网站B 注册并登录,网站B 包含了用户的id,name,email等信息;
-
用户通过浏览器向网站A发出URL请求;
-
网站A向用户返回响应页面,响应页面中注册了 JavaScript 的回调函数和向网站B请求的script标签;
-
用户收到响应,解析JS代码,将回调函数作为参数向网站B发出请求;
-
网站B接收到请求后,解析请求的URL,以 JSON 格式生成请求需要的数据,将封装的包含用户信息的JSON数据作为回调函数的参数返回给浏览器;
-
网站B数据返回后,浏览器则自动执行Callback函数对步骤4返回的JSON格式数据进行处理,数据回传到网站A的服务器,这样网站A利用网站B的JSONP漏洞便获取到了用户在网站B注册的信息。
三、防御
jsonp劫持最大的危害就是重要信息如cookie、隐私信息等的泄露,防御方法如下:
1、严格安全的实现 CSRF 方式调用 JSON 文件:限制 Referer 、部署一次性 Token 等。
2、严格安装 JSON 格式标准输出 Content-Type 及编码( Content-Type : application/json; charset=utf-8 )。
3、严格过滤 callback 函数名及 JSON 里数据的输出。
4、严格限制对 JSONP 输出 callback 函数名的长度(如防御上面 flash 输出的方法)。
5、其他一些比较小众的方法:如在 Callback 输出之前加入其他字符(如:/**/、回车换行)这样不影响 JSON 文件加载,又能一定程度预防其他文件格式的输出。还比如 Gmail 早起使用 AJAX 的方式获取 JSON ,听过在输出 JSON 之前加入 while(1) ;这样的代码来防止 JS 远程调用。