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

特殊字符

"    %22

\    %5C

/    %2F

&   %26

%   %25

'      %27

;      %3B

[     %5B

]     %5D

^     %5E

<    %3C

>     %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%';

JSON.parse()——Uncaught SyntaxError: Unexpected token \ in JSON at position 1的更多相关文章

  1. Uncaught SyntaxError: Unexpected token ' in JSON at position 1

    听说js是一样很BT的语言,今天真是有点领教到了. 用python3.6+django2.0开发网站时,遇到了一个坑中之坑! 在异步数据提交Ajax的运用中,不免在回调函数中使用到JSON.parse ...

  2. uncaught syntaxerror unexpected token U JSON

    uncaught syntaxerror unexpected token U JSON The parameter for the JSON.parse may be returning nothi ...

  3. Unexpected token o in JSON at position 1 at JSON.parse (<anonymous>) SyntaxError: Unexpected token R in JSON at position 0 at JSON.parse (<anonymous>)

    这个问题在之前做项目时碰到过一次,当时按照网上的做法,去掉JSON.parse()这一层转换后就没有这个报错了,数据也能正常使用,就没多想,也没深究是什么原因.可是这次又碰到了,所以这次我必须要弄明白 ...

  4. 关于Uncaught SyntaxError: Unexpected token o in JSON at position 1,chrome持续报错的相关解析

    今天跟大家分享我前两天遇见的一个BUG,说出来很难受,因为这个BUG花了我一个多小时去找原因,后来莫名其妙的故障消失了,强迫症犯了的我,居然花了2个多小时去故意再制造这个BUG,只想弄明白WHY??? ...

  5. VM603:1 Uncaught SyntaxError: Unexpected token o in JSON at position 1

    再用JQuery解析json的时候出现了这样一个问题 VM603: Uncaught SyntaxError: Unexpected token o 通过查阅资料发现,是由于解析json文件的时候解析 ...

  6. json格式字符串用Uncaught SyntaxError: Unexpected token ' Uncaught SyntaxError: Unexpected number

    Unexpected number(index)的错误用的json字符串如 var jsonStr = "{1:'北京note备注信息',2:'上海note备注信息',3:'广东note备注 ...

  7. Atitit  Uncaught (in promise) SyntaxError Unexpected token < in JSON at position 0

    Atitit  Uncaught (in promise) SyntaxError  Unexpected token < in JSON at position 0  Uncaught (in ...

  8. SyntaxError: Unexpected token ' in JSON at position 2

    js中字符串转json对象时报错: Uncaught SyntaxError: Unexpected token s in JSON at position 2 解决方法: js中获取jsp的返回值 ...

  9. [Vue warn]: Error in render: "SyntaxError: Unexpected token ' in JSON at position 1"

    一,场景: 字符串转对象: var str = "{'bankRate':5,'YINGUO':0}" 二,操作: JSON.parse(str)时候,报错 [Vue warn]: ...

随机推荐

  1. Linq指令执行分析

    Linq指令执行分析 一.Linq中IEnumerable的结构 Linq在执行聚合操作和ToXxx系统方法之前,一直都是一个数据源和一串指令(下面的讨论都是基于未执行聚合操作和ToXxx系统方法之前 ...

  2. 使用PLSQL导出表

    前提是登录PLSQL的用户具有导出数据的权限 菜单Tools-->Export Tables

  3. python 编程

    1.一个str A,列表B的所有元素都在A中时返回True A = 'HeooWoldHomeUbuntuCentOSFedora'B = ['Ubuntu', 'CentOS', 'Home', ' ...

  4. linux系统ssh免密钥登录配置

    linux主机配置ssh免密钥登录,具体配置如下: 1.执行命令ssh-keygen -t rsa,生成公钥和私钥(具体步骤详见下图) 2.会在当前用户的家目录的.ssh/生成公钥和私钥, 3.执行s ...

  5. JS 通过 navigator获取判断浏览器信息

    获取浏览器信息需要使用navigator.userAgent 对象 根据获取到的内容判断浏览器信息 亲身测试 navigator.userAgent IE 11  Mozilla/5.0 (Windo ...

  6. C++ 深入理解 虚继承、多重继承和直接继承

    [摘要] 本文从5段代码实例出发,通过类中类的普通继承,类的虚继承,类的多重继承,多个虚函数类的普通继承.虚继承与多重继承,几个交叉概念,详细的阐释了继承.虚函数与虚继承的基本概念,深入剖析了继承于虚 ...

  7. 19-02【mac电脑操作】最小化应用程序

    最小化应用程序 windows下很简单,直接使用windows+M即可: mac电脑下,官方建议是:option+command+m+h.但实际使用的时候,这个快捷键并不好使: 解决方案:mac系统设 ...

  8. asp.net 下载视频 保存视屏

    第一张图片为html,第一站图片为js上传视频并播放,限定大小,第三张图片是将视频保存到以字节流的方式保存到数据中,或者是将视频保存到项目中 String filename=this.Filevide ...

  9. 内置函数-fliter

    def is_odd(x): return x % 2 == 1 ret = filter(is_odd, [1,4,6,7,9]) print(ret) for i in ret: print(i) ...

  10. 切面编程AOP之Castle.Core

    1.Nuget中搜索Castle.Core并install 2.创建一个普通的类(注意类中只有标记virtual才能实现拦截 ) public class TestInterceptor { publ ...