2023年7月23日发(作者:)
Base64空格,加号问题缘由:在⼀个项⽬中,app请求tcpdump⽇志与记录的⽇志内容不⼀致请求%2B 识别成 +请求 + 识别成 空格这个在base64解密的时候会出现异常,base64需要的是加号,⽽不是空格造成的原因:在js中,对url的加密分别由三种⽅式:escape("aa+aa aa")"aa+aa%20aa"encodeURI("aa+aa aa")"aa+aa%20aa"encodeURIComponent("aa+aa aa")"aa%2Baa%20aa"第三种⽅式,+变成%2Bjava代码:n(("aa+aa aa","UTF-8"));aa%2Baa+aa特么加号变成%2B,空格变成加号如果是没经过加密,但是解密了n(("aa+aa aa","UTF-8"));aa aa aa好吧,从这⾥就可以看出,为什么base64解密报错了app端进⾏base64加密,内部含有+,然后并没有进⾏url加密,直接传给后端,后端对其先进⾏Url解密,+变成了空格,再进⾏base64解密,所以报错。规范:造成这种混乱局⾯的原因在于:W3C标准规定,当Content-Type为application/x-www-form-urlencoded时,URL中查询参数名和参数值中空格要⽤加号+替代,所以⼏乎所有使⽤该规范的浏览器在表单提交后,URL查询参数中空格都会被编成加号+。⽽在另⼀份规范(RFC 2396,定义URI)⾥, URI⾥的保留字符都需转义成%HH格式(Section 3.4 Query Component),因此空格会被编码成%20,加号+本⾝也作为保留字⽽被编成%2B,对于某些遵循RFC 2396标准的应⽤来说,它可能不接受查询字符串中出现加号+,认为它是⾮法字符。所以⼀个安全的举措是URL中统⼀使⽤%20来编码空格字符。Java中的URLEncoder本意是⽤来把字符串编码成application/x-www-form-urlencoded MIME格式字符串,也就是说仅仅适⽤于URL中的查询字符串部分,但是URLEncoder经常被⽤来对URL的其他部分编码,它的encode⽅法会把空格编成加号+,与之对应的是,URLDecoder的decode⽅法会把加号+和%20都解码为空格,这种违反直觉的做法造成了当初我对空格URL编码问题的困扰。因此后来我的做法都是,在调⽤对URL进⾏编码后(所有加号+已被编码成%2B),再调⽤replaceAll(“+”, “%20″),将所有加号+替换为%20。参考:
发布者:admin,转转请注明出处:http://www.yc00.com/xiaochengxu/1690106250a306289.html
评论列表(0条)