首页 > 其他分享 >Base64 空格,加号问题(oss)

Base64 空格,加号问题(oss)

时间:2024-03-28 09:57:46浏览次数:19  
标签:aa 编码 URL oss Base64 空格 加号 2B

缘由:

在一个项目中,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"

第三种方式,+变成%2B

java代码:

System.out.println(URLEncoder.encode("aa+aa aa","UTF-8"));
aa%2Baa+aa

特么加号变成%2B,空格变成加号

如果是没经过加密,但是解密了

System.out.println(URLDecoder.decode("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编码问题的困扰。

因此后来我的做法都是,在调用URLEncoder.encode对URL进行编码后(所有加号+已被编码成%2B),再调用replaceAll(“+”, “%20″),将所有加号+替换为%20。

标签:aa,编码,URL,oss,Base64,空格,加号,2B
From: https://www.cnblogs.com/hanby/p/18100813

相关文章

  • 论文解读(ACDNE)《Adversarial Deep Network Embedding for Cross-Network Node Classif
    Note:[wechat:Y466551|可加勿骚扰,付费咨询]论文信息论文标题:AdversarialDeepNetworkEmbeddingforCross-NetworkNodeClassification论文作者:XiaoShen、QuanyuDai、Fu-laiChung、WeiLu、Kup-SzeChoi论文来源:2020 AAAI论文地址:download 论文代码:download视屏讲解:c......
  • vue 如何将src是base64的图片转化成file对象
    vue如何将src是base64的图片转化成file对象在Vue中,你可以通过将base64字符串转换为Blob对象,然后使用Blob对象创建一个File对象。以下是一个简单的方法来实现这一转换:methods:{base64ToFile(base64Data,filename){//将base64的数据部分提取出来c......
  • 上传图片前端使用base64数据格式展示,后端数据库存储二进制文件
    添加时上传图片upload.render({elem:'#docImg',url:Feng.ctxPath+'/doctor/upload'//改成您自己的上传接口,before:function(obj){//预读本地文件示例,不支持ie8obj.preview(function(index,file,result){......
  • base64_encode都有哪些字符
    base64_encode函数会使用一组固定的64个字符来表示编码后的数据。这些字符包括:大写字母A-Z(共26个字符)小写字母a-z(共26个字符)数字0-9(共10个字符)加号(+)斜杠(/)此外,编码时还可能会使用一个或两个等号(=)作为填充字符,用于确保编码结果长度是4的倍数。因此......
  • Base64编解码及C++代码实现
    1.Base64是什么?        Base64是一种二进制到文本的编码方式。如果要更具体一点的话,可以认为它是一种将byte数组编码为字符串的方法,而且编码出的字符串只包含ASCII基础字符。        例如字符串mickey0380对应的Base64为bWlja2V5MDM4MA==。其中那个=......
  • Learning Imbalanced Datasets with Label-Distribution-Aware Margin Loss
    省去冗长的数学证明,直接看文章的贡献:提出了新的Loss函数以及延迟re-weighting的trick。并在多个数据集,包括情感分类、图像分类进行实验。Motivation&Methods:LDAM(Label-Distribution-AwareMargie)Losstailclasses的信息基本上较少,而且部署的模型通常很大,因此对tailclasse......
  • Loss Function: MSELoss, CrossEntropyLoss
    ......
  • 使用python登录boss 并自动投递简历打招呼
    使用的是selenium4的和3的版本语法有点出入但是大差不差暂时还没有完善会持续更新fromseleniumimportwebdriverimporttimefromselenium.webdriver.common.byimportByfromselenium.webdriver.support.uiimportWebDriverWaitfromselenium.webdriver.supp......
  • 字符串转base64或二进制
    /***字符串转base64*@paramstr*@returns*/functionmyEncode(str){////对字符串进行编码varencode=encodeURI(str.replace(/\+/g,'躞'));//+在后台转明文会丢////对编码的字符串转化base64varbase64=btoa(encode);......
  • CrossOver 23 用户可以免费升级到 CrossOver24吗?CrossOver用户如何升级呢?
    也就是上个月(2024年2月底)左右,CrossOver刚刚更新了24版本,CrossOver更新的内容有哪些,大家可以参考这篇文章:CrossOver24.0新功能介绍,这篇文章详细介绍了CrossOver24有哪些新特点,我想也满足了各位大佬的需求了吧,但是身为CrossOver23的用户,该怎么用上CrossOver24呢。难道我要重新......