关于2B的转义问题
最近碰到了一个中文乱码问题,话说是这样的:模块A调模块B的1接口,B把A带过来的用户ID加密后返回一个链接,当用户点击该链接时,A解密该用户ID后再调B的2接口。简而言之,我们用流程看下:模块A ->(1,加密userID) 模块B -> 链接 -> 模块A ->(2,解密userID) -> 模块B。问题出在链接上,模块B返回的链接里userID刚好加密完了有一个+号,经过转义+号变成了%2B,但是模块A没有按B提供的转义后的链接给用户,而是自己提供给未转义的链接(%2B又变回了+号),这时A模块从浏览器获取userID后,再解密就变成了一串乱码:d[pk 161
我们先看模块B的加密:
public static void main(String[] args) throws Exception
{
String value = "XXXXXXX";
String msisdn = "53003443161";
byte[] middleString = encrypt(msisdn, value);
byte[] arr = Base64.encodeBase64(middleString, true);
value = new String(arr, "UTF-8");
value = value.replaceAll("[\\s*\t\n\r]", "");
System.out.println(value);
//转义
value = URLEncoder.encode(value, "utf-8");
System.out.println(value);
}
秘钥我就不贴了,这里我把没转义的和转义过的都打印出来了:
thgrhWmM0+EasSHO5Ld2GQ==
thgrhWmM0%2BEasSHO5Ld2GQ%3D%3D
从上面我们可以看到+转义为%2B,=转义为%3D。我们返回出去的链接是:http://wlf.com/p/wlf.jsp?userID=thgrhWmM0%2BEasSHO5Ld2GQ%3D%3D,经过浏览器%2B会变成+,再解密userID是ok的。但人工提供的未转义链接却是长这样的:http://wlf.com/p/wlf.jsp?userID=thgrhWmM0+EasSHO5Ld2GQ%3D%3D。通过浏览器用get方式访问时,+号会被浏览器处理为空,所以userID就变成了
thgrhWmM0 EasSHO5Ld2GQ%3D%3D,中间的+号被吃了,变成了空格,再去解密自然成乱码了。
解决办法就是提供转义后的userID。
关于2B的转义问题的更多相关文章
- URL特殊字符的转义
+ 转义符为 %2B 空格 转义符为 + 或 %20 / 转义符为 %2F ? 转义符为 %3F % 转义符为 %25 # 转义符为 %23 & 转义符为 %26 = 转义符为 %3D
- SQL注入攻击和防御
部分整理... 什么是SQL注入? 简单的例子, 对于一个购物网站,可以允许搜索,price小于某值的商品 这个值用户是可以输入的,比如,100 但是对于用户,如果输入,100' OR '1'=' ...
- URL转义
在处理一些url的时候常常会出现一些让人意想不到的情况,比如:当图片的链接中有空格的时候, this.src='http://img.cits-sh.com/UploadImgs/beihaidao2 ...
- JS转义 escape()、encodeURI()、encodeURIComponent()区别详解
JavaScript中有三个可以对字符串编码的函数,分别是: escape,encodeURI,encodeURIComponent,相应3个解码函数:unescape,decodeURI,decod ...
- html特殊字符转义问题(转!)
html.javascript.url特殊字符转义在实际编程中都是有用到的,有的人对特殊字符转义的使用不是很清楚,下面就对html,javascript,url特殊字符的转义做一下说明和归纳. htm ...
- URL地址中的转义符
如果在XML里面存储URL地址可能涉及到转义符的问题 WEB开发中通过问号(?)方式在浏览器地址栏中传值时.浏览器是通过“&”来区分问号后的参数个数的. 如果出现传值参数中带有“&”时 ...
- javascript进行url转义方法比较escape、encodeURI和encodeURIComponent
escape会将除了 ASCII 字母.数字和特定的符号(* @ - _ + . /)以外的字符全部进行转义编码,因此如果想对URL编码,最好不要使用此方法,因为它会让你的URL变的不可读. 提示:E ...
- URL特殊字符需转义
URL特殊字符需转义 1.空格换成加号(+) 2.正斜杠(/)分隔目录和子目录 3.问号(?)分隔URL和查询 4.百分号(%)制定特殊字符 5.#号指定书签 6.&号分隔参数 转义字符的原因 ...
- url特殊字符转义及解决方法
URL特殊字符需转义 1.空格换成加号(+) 2.正斜杠(/)分隔目录和子目录 3.问号(?)分隔URL和查询 4.百分号(%)制定特殊字符 5.#号指定书签 6.&号分隔参数 转义字符的原因 ...
随机推荐
- 【SystemTap】 Linux下安装使用SystemTap源码安装SystemTap
转自 http://blog.csdn.net/zklth/article/details/6248558 文章 http://blog.csdn.net/zklth/archive/2010/09/ ...
- 使用Easy4net编写代码生成器
在项目中经常要手动创建和数据库对应的实体类,如果数据库表比较多或者表字段比较多,那会是一个工作量非常大的事情,所以我根据自己的需求写了一个简单的代码生成工具,工具使用Easy4net框架开发. 下面是 ...
- ansible入门六(roles)
一.什么场景下会用roles? 假如我们现在有3个被管理主机,第一个要配置成httpd,第二个要配置成php服务器,第三个要配置成MySQL服务器.我们如何来定义playbook? 第一个play用到 ...
- Prism 4 文档 ---第5章 实现MVVM模式
MVVM模式有助于清楚的区分应用程序界面的业务层和展现层.保持一个清晰的应用程序逻辑和UI分离有助于处理开发和设计过程中大量的问题,同时,使得应用程序的测试,维护,和扩展更加容易.MVVM也可 ...
- WeChat-JSAPI支付
官方API:打开连接 特别注意----JSAPI只能在微信环境下 测试!2017-04-19 配置:微信公众号中 添加微信支付配置--请认真填写配置并获取下面对应的数据才能正常运行. ======== ...
- bzoj2501
题解: 显然,每当进入一个小的边界,那么我们的ans+1,出去一个大的边界,ans-1 然后,我们将每一个边界排序,时间小的在前,大的在后 每一次进来一个,如果是左边的边界,+1,右边的-1 然后输出 ...
- LeetCode OJ:N-Queens(N皇后问题)
Given an integer n, return all distinct solutions to the n-queens puzzle. Each solution contains a d ...
- 正则表达式 preg_match 匹配中文
preg_match 匹配中文出错 2010年01月06日 星期三 14:55 错误提示: Warning: preg_match() [function.preg-match]: Compilati ...
- 第6课:datetime模块、操作数据库、__name__、redis、mock接口
1. datetime模块 import datetime print(datetime.datetime.today()) # 当前时间 2018-01-23 17:22:35.739667 pr ...
- TP5 volist
VOLIST标签 volist标签通常用于查询数据集(select方法)的结果输出,通常模型的select方法返回的结果是一个二维数组,可以直接使用volist标签进行输出. 在控制器中首先对模版赋值 ...