c语言 time%3cnull%3e,JSON.parse()——Uncaught SyntaxError: Unexpected token \ in JSON at position 1...

背景:项目安全处理方面之一 ——对特殊字符进行编解码(后端编码,前端解码)

特殊字符:

"    %22

\    %5C

/    %2F

&   %26

%   %25

'      %27

;      %3B

[     %5B

]     %5D

^     %5E

>     %3E

Note:均为英文下,中文下不考虑

问题:使用JSON.parse(decodeURIComponent(JSON.stringify(body)))报错 ——Uncaught SyntaxError: Unexpected token / in JSON at position 150

原因:ECMA script注明json字符串中需要转义的字符: " / \ b f n r t

思路:

1、JSON.stringify()之后替换特殊字符

2、decodeURIComponent()之后替换特殊字符

解决:

经验证,特殊字符需要替换为“\特殊字符”,再使用JSON.parse()可以解决。

1、\必须最先替换,防止多余替换其他特殊字符之前的\;

2、"必须在JSON.stringify()之后替换,若在decodeURIComponent()之后替换,会将json结构属性,和属性名的"也替换;

3、\和b f n r t结合,JSON.parse()也会报错,但单独存在不会被编码。

JSON.parse(decodeURIComponent(

JSON.stringify(body).replace(/%5C/g,'%5C%5C')

.replace(/%22/g,"%5C%22")

.replace(/%2F/g,'%5C%2F')

.replace(/%08/g,'%5Cb')

.replace(/%0C/g,'%5Cf')

.replace(/%0A/g,'%5Cn')

.replace(/%0D/g,'%5Cr')

.replace(/%09/g,'%5Ct')));

注:

body =

{

"code": 0,

"message": "success",

"data": {

"offeringBasicList": [{

"offeringId": 2019000167,

"classifyId": 1000000009,

"classifyName": "IOT",

"offeringCode": "%3B%3C%3E%27%22%2F%5C%40%23%24%25%5E%26*%28%29%5B%5Dabcd",

"offeringName": "%3C%3E%27%22%2F%5C%40%23%24%25%5E%26*%28%29%5B%5Dabcd",

"offeringShortName": "%3C%3E%27%22%2F%5C%40%23%24%25%5E%26*%28%29%5B%5Dabcd",

"offeringDesc": "%3C%3E%27%22%2F%5C%40%23%24%25%5E%26*%28%29%5B%5Dabcd",

"isBundled": "N",

"ownerPartyRole": "CA",

"ownerPartyId": "0ff08435-aa1b-49d5-9780-5384d4989c9e",

"releasePartyRole": null,

"releasePartyId": null,

"isPrimary": "Y",

"maxNum": null,

"minNum": null,

"beId": "101",

"orgId": null,

"createdBy": "0ff08435-aa1b-49d5-9780-5384d4989c9e",

"createdTime": 1526623849854,

"updatedBy": "0ff08435-aa1b-49d5-9780-5384d4989c9e",

"updatedTime": 1526623849854,

"thumbnailName": null,

"thumbnailDesc": null,

"thumbnailUrl": null,

"busiModeType": null,

"status": {

"key": "DRA",

"value": "Draft"

},

"ownerType": {

"key": "S",

"value": "Subscriber"

}

}],

"pageInfo": {

"beginRowNumber": 0,

"sortField": "created_time",

"totalRecord": 1

}

}

}

扩展:

1、URI标准不允许使用保留字符,如/,解决:

encodeURIComponent()  编码

decodeURIComponent()  解码

既可编码保留字符,又可编码多字节字符

2、decodeURIComponent()解码包含'%'的字符串时,若%与之后的字符无法转义为正常字符串会报错,eg:'90%';

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值