赞
踩
本系列文章主旨在于介绍一些漏洞类型产生的基本原理,探索最基础的解决问题的措施,不排除有些语言或者系统提供的安全的API可以更好地更直接地解决问题,也不排除可以严格地输入验证来解决。
JSON(JavaScript Object Notation)是一种轻量级的数据交换格式。它基于JavaScript(Standard ECMA-262 3rd Edition - December 1999)的一个子集。JSON采用完全独立于语言的文本格式。JSON 可以表示比“名称/值对”更复杂的结构。例如,可以表示数组和复杂的对象,而不仅仅是键和值的简单列表。
按照最简单的形式,可以用下面这样的JSON表示“名称/值对”:
{ "name": "admin" }
复杂一点的可以表示对象数组,如下:
- { "user":
- [
- { "name": "admin", "email": "admin@example.com" },
- { "name": "test1", "email": "test1@example.com"},
- { "name": "test2", "email": "test2@example.com" }
- ]
- }
JSON虽好,但是在处理数据时也要注意,JSON是根据引号(")、冒号(:)、以及逗号(,)和大括号({})来区分值的,如果一个用户输入的内容里还有引号这样的特殊字符,会破坏本身的数据结构,如果精心构造一些数据,可以导致额外的数据注入。所以,对于这些特殊字符必须在转换成JSON之前进行处理,特别是引号(")。
例如,一个登录请求提交的数据为{"name":"user","password":"Test@123","role":"normal"},如果,输入的password的数据为:Test@123","role":"admin,直接组装成JSON数据,结果为:{"name":"user","password":"Test@123","role":"admin","role":"normal"},就会篡改JSON的数据结构,当然,一般的登录请求不会这么写,这里只是做一个例子说明JSON注入的过程以及结果。
处理的方法有两种:
第一种方法,是最简单的,也是最直接的,直接将双引号使用反斜杠\转义,例如:Test " Test1 =》Test \" Test1,组装成JSON就是:{ "name": "Test \" Test1" },而反斜杠\本身也要转义,转义为两个反斜杠\\。
第二种方法,就是使用XSS文章所说的JavaScript编码,编码方法如下:
特殊字符 | JavaScript编码值 |
" | \x22 |
\ | \x5c |
无论采用哪一种方法,再组装JSON时,只要采用统一的方法,就可以避免JSON注入问题。
一般现在的Javascript框架都会自动避免JSON注入,不过,如果能够理了解JSON注入的原理,也可以在自己写JSON组装的代码时或者使用别人的代码时,可以关注是否存在JSON注入的情况,提前预防,以防有注入的情况在产品上线后被利用。
如果有不妥之处,希望可以留言指出。谢谢!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。