JSONP安全防范解决方案新思路
jsonp安全性防范,分为以下几点:
1、 防止callback参数意外截断js代码,特殊字符单引号双引号,换行符均存在风险
2、 防止callback参数恶意添加标签(如script),造成XSS漏洞
3、 防止跨域请求滥用,阻止非法站点恶意调用
针对第三点,我们可以通过来源refer白名单匹配,以及cookieToken机制来限制
而前两点,传统的做法分为以下几种:
1、 纯手工过滤特殊字符,引号尖括号等,一旦发现潜在恶意字符则服务端拒绝,返回错误。此种方式较为严格,但是随之而来的问题是失败率会有所提升,尤其对于对外开发者。而且JS中恶意字符的变形十分多,此方式需要枚举所有非法字符,可能存在疏漏。我们不应该将潜在的恶意字符都一概屏蔽,因为确实有些需求需要传入并存储这些字符。
2、 对于callback参数作严整的格式检查,或强制约定指定格式。基本可以彻底解决安全问题,但同样是对调用端不是完全透明,使用者需要额外去知晓相关限制和约定,可能会造成不必要的沟通成本。
3、 返回包体添加header头部,强制指定MIME类型,避免按HTML方式解析,防止XSS漏洞。这似乎是个很完美的解决方案。但是十分诡异的是,在某些版本的火狐浏览器下,直接访问MIME类型为JAVASCRIPT的请求时,浏览器仍然会按照HTML解析。或许是该浏览器设计的缺陷,但它忽略了我们设置的header。无法保证所有浏览器严格按照MIME类型解析。
我们的关注点一直在于如何限制用户输入,但是请从另外一个层面去考虑该问题,或许就会豁然开朗。
我们先了解一下JS本身的特性。
JSONP的本质是构造全局回调函数,之后加载script标签触发回调函数。
通常我们使用函数可以这么写
function test(){}
test();
而在全局的函数也就默认是window的成员。也可以显示书写为
window.test = function(){};
window.test();
而JS中对象的成员是可以使用字符串索引的方式访问的,故进一步改造为
window['test']=function(){};
window['test']();
现在有注意到么,如此一来我们已经把函数名已经完全限制在了字符串上下文,理论上只要做好了防注入工作,callback参数是不可能跳出字符串上下文意外执行代码的。以PHP为例,单字符串防止注入甚至可以直接使用json_encode该字符串实现。
window['alert("123");abc']();
上面的callback参数虽然有注入的风险,可以由于callback参数严格限制在字符串内部,仅会作为文本,不会意外执行
但仍然存在xss漏洞问题
看下面例子
window['<script>alert(123);</script>']();
我们虽然已经保证了<script>严格限制在引号内部,不会造成js注入,但是直接在浏览器中输入该jsonp请求仍会按照HTML解析,产生XSS漏洞,即便设置了header也很难防范。
在进一步,我们只需要保证浏览器内不会明文出现<>标签,那么问题便可彻底解决。
基本思路是在服务端做一次urlencode。而在output输出decodeURIComponent(‘#####’)来规避显示尖括号。Urlencode过的字符串,只可能包含字母数字%,也顺便解决了注入的问题
最终附上一段简短的代码。根本解决jsonp的安全问题
<?php
header('Content-type: text/javascript'); //加上此句可以消除chrome的警告
$callback = urlencode($_GET['callback']);
echo "window[decodeURIComponent('{$callback}')]({ret:0,msg:’OK’});"
请求1:http://www.test.com/a.php?callback=alert(123);abc
响应1:window[decodeURIComponent('alert(123)%3Babc')]({ret:0,msg:'OK'});
请求2:http://www.test.com/a.php?callback=<script>alert(123);</script>
响应2:window[decodeURIComponent('%3Cscript%3Ealert(123)%3B%3C%2Fscript%3E')]({ret:0,msg:'OK'});
上述几个例子都可以证明jsonp安全漏洞已被彻底规避,即便存在尝试注入的恶意参数,仍能最大限度保证程序完全正常工作触发回调。
JSONP安全防范解决方案新思路的更多相关文章
- 解决Ajax同源政策的方法【JSONP + CORS + 服务器端解决方案】
解决Ajax同源政策的方法 使用JSONP解决同源限制问题 jsonp是json with padding的缩写,它不属于Ajax请求,但它可以模以Ajax请求.\ 步骤 1.将不同源的服务器端请求地 ...
- 使用Httpclient来替代客户端的jsonp跨域解决方案
最近接手一个项目,新项目需要调用老项目的接口,但是老项目和新项目不再同一个域名下,所以必须进行跨域调用了,但是老项目又不能进行任何修改,所以jsonp也无法解决了,于是想到了使用了Httpclient ...
- 解决 jsonP 安全问题
jsonp安全性防范,分为以下几点: 1.防止callback参数意外截断js代码,特殊字符单引号双引号,换行符均存在风险 2.防止callback参数恶意添加标签(如script),造成XSS漏洞 ...
- jQuery(三) javascript跨域问题(JSONP解决)
加油~ --WH 一.什么是javascript跨域问题? 域:服务器域名,唯一标识(协议,域名,端口)必须保证一致,说明域相同 跨域:在一个服务器上,去访问另一个服务器上,并且得到另一个服务器返回回 ...
- 关于jQuery.ajax()的jsonp碰上post详解
前言 以前一直以为当$.ajax()的 dataType设置为jsonp时,其method(请求方法)无论怎么设置,都会变成get,直到前两天遇到了一个坑. 下面来一起看看详细的介绍: 关于跨域请求与 ...
- 一些图像识别初创公司产品及API搜集ing...
一些公司的产品路线可以很好地给我们启示,欢迎看客补充. 一.微软认知服务API 1.年龄.性别检测 2.物体分类.识别 3.识别名人 全新的名人识别模块可以识别20万来自全球各地涉及商界.政界.体育界 ...
- JSONP和CORS两种跨域方式的简单介绍和解决方案实例
随着软件开发分工趋于精细,前后端开发分离成为趋势,前端同事负责前端页面的展示及页面逻辑处理,服务端同事负责业务逻辑处理同时通过API为前端提供数据也为前端提供数据的持久化能力,考虑到前后端同事开发工具 ...
- 跨域访问解决方案:JSONP
关于什么是跨域请求,可以参见我之前的博文:http://www.cnblogs.com/LiuChunfu/p/5240145.html 上述博文最后有提到解决方案,一直说补充,但是工作忙忘了,直到朋 ...
- 跨域问题解决方案(HttpClient安全跨域 & jsonp跨域)
1 错误场景 今天要把项目部署到外网的时候,出现了这样的问题, 我把两个项目放到自己本机的tomcat下, 进行代码调试, 运行 都没有问题的, 一旦把我需要调用接口的项目B放到其他的服务器上, 就会 ...
随机推荐
- Linux命令 &与&&的作用
1.ls &表示后台服务 2.ls && ll 表示前者执行成功,执行后台命令
- IIS日志分析
发现一个强大的图形化IIS日志分析工具——Log Parser Studio,下面分享一个实际操作案例. 1. 安装Log Parser Studio a) 需要先安装Log Parser,下载地址: ...
- 【转】centOS中mysql一些常用操作
安装mysql yum -y install mysql-server 修改mysql配置vi /etc/my.cnf 这里会有很多需要注意的配置项,后面会有专门的笔记暂时修改一下编码(添加在密码下方 ...
- m个苹果放在n个筐里,每个筐至少一个,所有的筐都一样,有多少种放法
package com.study; import java.io.BufferedReader; import java.io.IOException; import java.io.InputSt ...
- Android用户界面 UI组件--TextView及其子类(四) Chronometer计时器
Chronometer是一个简单的定时器,你可以给它一个开始时间,并以此定时,或者如果你不给它一个开始时间,它将会使用你的时间通话开始.默认情况下它会显示在当前定时器的值的形式“分:秒”或“H:MM: ...
- Linux搭建SVN 服务器
Linux搭建SVN 服务器 1 安装SVN 2 使用客户端连接 2.1 使用windows的客户端 2.2 使用Linux下的命令行 3 ...
- redis key expire
EXPIRE key seconds 为给定 key 设置生存时间,当 key 过期时(生存时间为 0 ),它会被自动删除. 在 Redis 中,带有生存时间的 key 被称为『易失的』(volati ...
- 转:三十二、Java图形化界面设计——布局管理器之CardLayout(卡片布局)
转:http://blog.csdn.net/liujun13579/article/details/7773945 卡片布局能够让多个组件共享同一个显示空间,共享空间的组件之间的关系就像一叠牌,组件 ...
- 使用SQL Server 2014内存数据库时需要注意的地方
作者 王枫发布于2014年7月4日 本文从产品设计和架构角度分享了Microsoft内存数据库方面的使用经验,希望你在阅读本文之后能够了解这些新的对象.概念,从而更好地设计你的架构. 内存数据库,指的 ...
- 微软开放技术发布开源 Jenkins 插件以将 Windows Azure Blob 服务用的开作存储库
发布于 2014-02-10 作者 陈 忠岳 持续集成 (CI) 的历史源远流长, 其宗旨在于软件团队在敏捷环境中不断将他们的工作整合为持续构建.管理 CI 进程的工具已存在一段时间.过去几年中 ...