最近找寻找json安全输出解决方案,方案基本上已经确定,发到博客给大家分享分享。
什么是json
JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。它基于JavaScript(Standard ECMA-262 3rd Edition - December 1999)的一个子集。 JSON采用完全独立于语言的文本格式。
官方网站:http://www.json.org/
JSON是一种数据交换格式,可用于机器之间的数据传送。它只是表达数据,所以它本身是与安全无关的。使用JSON的系统安全与否,取决于该系统自身设计的好坏。JSON本身并不会引入安全隐患。
json的应用场景
应用场景1:
userInfo.json内容: var userInfo ={"name":"123"}
userInfo.htm:
<script src="userInfo.json" ></script>
<script>
alert(userInfo.name);
alert(userInfo.length);
alert(userInfo.substr(0));
</script>
|
应用场景2:
userInfo.json内容:
{"name":"123"}
浏览器、flash等内置组建(如activeX、ajax)等请求获取json数据,如由XMLHttpRequest 得到的文本格式,可通过eval方法快速地转换成为有用的数据结构。
通过eval(json数据)解析成json对象,通过javascript 对象引用处理:
httpRequest = getHttpRequest()
var userInfo = eval(httpRequest.responseText)
alert(userInfo.name);
|
应用场景3:
userInfo.json内容: var userInfo ={"name":"123"}
userInfo.htm:
<script src="userInfo.json" ></script>
<script>
nameDiv.innerHTML=userInfo.name;
</script>
|
json攻击原理:
json 以http方式提供给外网访问,几乎人人都可以直接打开json地址,
如果用户自己写程序、工具或者使用获取http的命令(如wget) 请求获取json数据,那么json只是作为一个文本数据交换使用,不存在安全隐患.
如果使用浏览器打开,那么它就相当于一个普通的html页面, 如果有恶意脚步等就会存在xss攻击的隐患.(xss攻击原里在这里不细讲)
攻击原理场景1
step1
用户A通过修改会员信息,伪造攻击脚步,name:<img src=javascript:alert(1)>
提交至web服务器
step2
json数据格式(vm模板):
var userInfo = {"name":"$name"};
step3
用户A把json地址发给用户B,用户B在不知情的情况下(用浏览器)打开
var userInfo = {"name":="<img src=javascript:alert(1)>";
结果:用户A伪造的攻击脚步:alert(1) 在用户B的浏览器解析并执行
|
攻击原理场景2
step1
用户A通过修改会员信息,伪造攻击脚步,name:"};alert(2);{"
提交至web服务器
step2
json.vm 模板内容:
var userInfo = {"name":"$name"};
userinfo.vm 模板内容:
<script src="json.vm"></script>
<script>
dispalayName(userInfo.name);
</script>
step3
用户B打开userinfo.vm查看用户A的信息:userinfo.vm?userid=b
json.vm渲染结果:
var userInfo = {"name":""};alert(2);{""};
结果:用户A伪造的攻击脚步:alert(2) 被浏览者B的浏览器解析并执行
|
攻击原理场景3(html dom)
step1
用户A通过修改会员信息,伪造攻击脚步,name:<img src=vbscript:msgbox(0)>
提交至web服务器
step2
json.vm 模板内容:
var userInfo = {"name":"$name"};
userinfo.vm 模板内容:
<div id="divName"></div>
<script src="json.vm"></script>
<script>
.....
document.getElementById("divName").innerHTML=userInfo.name;
</script>
step3
用户B打开userinfo.vm查看用户A的信息:userinfo.vm?userid=a
json.vm渲染结果:
var userInfo = {"name":"<img src=vbscript:msgbox(0)>"};
结果:用户A伪造的攻击脚步:msgbox(0) 在执行innerHTML插入html的时候被执行
|
严格来讲,攻击原理场景3(html dom)不属于json安装输出范围
解决方案:
为了让用户伪造的脚步不被执行,有两种方案可以实现:
A、 过滤恶意脚步。 (我们不能确保所有的需求都允许过滤,因此不考虑这种方案)
B、对用户数据进行escape编码之后再输出,有两种escape方式,分别为javascript escape和html escape
1。通常情况下采用采用:javascript escape 之后输出
javasceipt escape:alert(2) 结果:alert\x282\x29
编码之后长度问题:
"alert(2)".length==8
"alert\x282\x29".length==8
"alert\x282\x29".length==8
"alert\x282\x29".substr(0,6)=="alert("
结果一样,编码之后不会对字符串长度、字符串截取产生影响.
2。对于html dom(应用场景3),采用html escape之后输出
需要指出,html escape之后,就不能作为javascript字符窜进行长度,截取部分字符等操作,你能作为html dom插入操作:*.innerHTML=?。
3。解析javascript方法eval()不太安全,使用yahoo yui:YAHOO.lang.JSON.parse 代替eval方法,具体请参见http://developer.yahoo.com/yui/json/
附
javascript escape:
public static String escapedJavaScript(String string) {
if (string == null || string.length() == 0) {
return string;
}
StringBuilder buffer = new StringBuilder(string.length() << 1);
String hex;
for (int i = 0; i < string.length(); i++) {
char c = string.charAt(i);
if (c < 127 && COMMON_ASCII[c]) {
buffer.append(c);
} else if (c <= 127) {
hex = Integer.toHexString(c).toUpperCase();
if (hex.length() < 2) {
buffer.append("\\x0");
} else {
buffer.append("\\x");
}
buffer.append(hex);
} else {
hex = Integer.toHexString(c).toUpperCase();
if (c < 0x100) {
buffer.append("\\u00");
} else if (c < 0x1000) {
buffer.append("\\u0");
} else {
buffer.append("\\u");
}
buffer.append(hex);
}
}
return buffer.toString();
}
|
Html escape:
function HTMLEscape(str)
{
var s = "";
if(str.length == 0) return "";
s = str.replace(/&/g,"&");
s = s.replace(/</g,"<");
s = s.replace(/>/g,">");
s = s.replace(/ /g," ");
s = s.replace(/\'/g,"'");
s = s.replace(/\"/g,""");
return s;
}
|
分享到:
相关推荐
1.1.2 解决方案 1 1.1.3 工作原理 3 1.2 配置Spring IoC容器中的Bean 4 1.2.1 问题 4 1.2.2 解决方案 4 1.2.3 工作原理 4 1.3 调用构造程序创建Bean 14 1.3.1 问题 14 1.3.2 解决方案 14 1.3.3 ...
1.1.2 解决方案 1 1.1.3 工作原理 3 1.2 配置Spring IoC容器中的Bean 4 1.2.1 问题 4 1.2.2 解决方案 4 1.2.3 工作原理 4 1.3 调用构造程序创建Bean 14 1.3.1 问题 14 1.3.2 解决方案 14 1.3.3 ...
JSONP全称是JSONwithPadding,是基于JSON格式的为解决跨域请求资源而产生的解决方案。它的基本原理是利用HTML的元素标签,远程调用JSON文件来实现数据传递。如果想在a.com域下获取b.com下的JSON数据(getUsers.JSON...
威胁者 Threatseer是适用于Linux的基于代理的轻量级安全遥测解决方案。尝试运行Threatseer特征代理功能该代理收集安全遥测,该遥测将卸载到服务器以进行行为分析和其余行为。 重要系统事件的事件驱动的结构化数据...
12网页静态化解决方案-Freemarker 13消息中间件解决方案JMS 14SpringBoot框架与短信解决方案 15单点登录解决方案CAS 16购物车解决方案 17跨域解决方案与提交订单 18微信扫码支付 19秒杀解决方案 20品优购...
《Web安全深度剖析》总结了当前流行的高危漏洞的形成原因、攻击手段及解决方案,并通过大量的示例代码复现漏洞原型,制作模拟环境,更好地帮助读者深入了解Web应用程序中存在的漏洞,防患于未然。 《Web安全深度剖析...
我们功能强大的本地备份/还原解决方案以及针对MongoDump,Oracle Data Pump和SQL Server Backup Utility的直观GUI,可指导您完成备份过程并减少潜在的错误。为可重复部署的过程设置自动化,例如在特定时间或日期执行...
快速强大的解决方案和通配符消除模块精心策划的被动源可最大程度地提高结果(截至目前已有35个源) 支持多种输出格式(Json,File,Stdout) 针对速度进行了优化,非常快速,轻便Stdin和stdout支持集成到工作流中...
该存储库已配置为可立即部署到您的AWS账户中,以为您提供最快的解决方案。 这是部署清单: 在计算机上安装和配置和 。 更新根package.json以将REPLACE_WITH_BUCKET_NAME变量替换为的 在终端窗口中,运行npm run ...
TC 采用MVC 设计模式实现业务逻辑与表现层的适当分离,使网页设计师能够轻松设计出理想的模板,框架式开发易用扩展,支持自定义内容模型,可面向中小型站点提供重量级网站建设方案。对于那些想要进行开发,但技术...
解决方案:通过用户点击查询按钮来获取用户的输入,将获取的输入传入到后台的控制类中,将获取的数据进行整理后传递给MyBatis-plus中相应的mapper,动态的创建SQL语句,之后使用MyBatis-plus的分页查询查件,到...
解决方案:通过用户点击查询按钮来获取用户的输入,将获取的输入传入到后台的控制类中,将获取的数据进行整理后传递给MyBatis-plus中相应的mapper,动态的创建SQL语句,之后使用MyBatis-plus的分页查询查件,到...
JSTUN 是另外一个用来解决穿越 NAT 进行通讯的 Java 解决方案,是 STUN 协议的 Java实现。 在浏览器上运行Java程序 Doppio DoppioVM 是一个可在浏览器上直接运行 Java 项目的系统,无需任何插件支持。目前它包含一...