iOS/Android/Web Url Encode空格處理 原文連結:http://read01.com/3gDO.html
iOS/Android/Web Url Encode空格處理
原文連結:http://read01.com/3gDO.html
前言 這裡只是講一個故事,一個發生在我身上的真實的故事。曾經,我以為搞加密很簡單,不就是百度幾個加密演算法回來就可以了嗎?百度上一大堆呢,要什麼加密演算法都有,有什麼困難呢?是啊,理論上是可行的,可是,實際上卻有很多的坑,跳了一個又一個,最後才發現大家已經跳進坑裡面了。 這裡所講的故事是關於URL Encode的故事。想想我們iOS原來都是不管三七二十一,都是直接呼叫寫一個URLEncode方法,然後在加密時就encode一下,服務端decode一下就可以了,但是我們要防篡改,使用了sign… 在安卓端,他們直接呼叫URLEncoder.encode(text, encodeType)這樣的函數來進行encode,可是他們這個函數對空格進行encode後,得到的是+號,而不是%20。我們看到在瀏覽器裡空格是轉換成%20的。另外,安卓這個API並不是對所有的特殊字元都進行轉碼,這樣就有問題了…生成sign簽名時,如果都encode了,那麼結果就會不一樣 iOS端Encode問題 在iOS端,我們直接使用系統NSString的API進行轉碼的話,不會對一些比較特殊的字元進行轉碼。系統NSString的轉碼API: 123 [str stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; 這樣並不對特殊的字元,像`、!、:等字元並不會轉碼,那怎麼辦呢?我們通常會自己寫一個API,呼叫C底層的API,可以指定對哪裡特殊字元也轉碼(給NSString擴充套件): 1 2 3 4 5 6 7 8 9 10 11 12 13 14 - (NSString *)hyb_URLEncode { NSString *newString = CFBridgingRelease(CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault, (CFStringRef)self, NULL, CFSTR(":/?#@!$ &'*+,;="<>%{}|^~`"), CFStringConvertNSStringEncodingToEncoding(NSUTF8StringEncoding))); if (newString) { return newString; } return self; } 贊助商 這樣就可以對所有特殊字元都轉碼了。而解碼則是非常簡單的,只是對空格進行特殊處理: 1 2 3 4 5 6 7 8 9 10 11 12 - (NSString *)hyb_URLDecode { NSString *input = self; NSMutableString *outputStr = [NSMutableString stringWithString:input]; [outputStr replaceOccurrencesOfString:@"+" withString:@" " options:NSLiteralSearch range:NSMakeRange(0, [outputStr length])]; return [outputStr stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; } 在iOS端,對空格轉碼得到%20,對+轉碼得到%2b,但是在服務端和android端對空格轉碼得到的是+,而對+轉碼得到的也是%2b。問題就出在這裡了… 怎麼生成sign 通常的做法是對所有參數按key排序,然後拼接成a=x&b=y…這樣的字元串,然後md5一下。但是如果encode一下,iOS端和安卓端出現不同的結果,那麼服務端拿到以後是可以得到原串的,但是服務端encode一下所得到的結果會不一樣,那麼校驗sign就會失敗。 但是,如果不對每個value進行轉碼,在服務端就無法通過&來分割了,因為value中有&時,若不轉碼就會出問題,因此encode是必須的。 如何解決 生成sign時,是遍歷所有的key-value,然後拼接,最後md5。那麼,生成sign時,我們只要不對value進行encode,而其他上傳的參數值都encode,這樣就可以解決我們的問題了。 解決方案: 生成sign時,遍歷parameters,對每個value都不進行encode,直接拼接然後md5(前提是一定要Asc或者Desc排序一下)。 而其他參數在拼接時,就正常使用encode,一切就可以解決了!
原文連結:http://read01.com/3gDO.html
iOS/Android/Web Url Encode空格處理 原文連結:http://read01.com/3gDO.html的更多相关文章
- 仿微信的IM聊天时间显示格式(含iOS/Android/Web实现)[图文+源码]
本文为原创分享,转载请注明出处. 1.引言 即时通讯IM应用中的聊天消息时间显示是个再常见不过的需求,现在都讲究用户体验,所以时间显示再也不能像传统软件一样简单粗地暴显示成“年/月/日 时:分:秒”这 ...
- Lottie在手,动画我有:ios/Android/Web三端复杂帧动画解决方案
为什么需要Lottie 在相对复杂的移动端应用中,我们可能会需要使用到复杂的帧动画.例如: 刚进入APP时候可能会看到的入场小动画,带来愉悦的视觉享受 许多Icon的互动变化比较复杂多变的时候,研 ...
- WEB通知和React Native之即时通讯(iOS Android)
WEB通知和React Native之即时通讯(iOS Android) 一,需求分析 1.1,允许服务器主动发送信息给客户端,客户端能监听到并且能接收. 1.2,为了方便同一个系统内的用户可以指定某 ...
- React Native之配置URL Scheme(iOS Android)
React Native之配置URL Scheme(iOS Android) 一,需求分析 1.1,需要在网站中打开/唤起app,或其他app中打开app,则需要设置URL Scheme.比如微信的是 ...
- ios访问web页面<div>点击事件不起效果,以及alert()显示url的解决办法
ios访问web页面<div>点击不起效果,在其div上添加style=”cursor:pointer:“ jquery web页面动态append()事件调用方法:$(document) ...
- ios Url Encode
//ios Url Encode //有时候在请求的参数里里特殊符号比如“+”等.而如果没有encode的话那么传过去的还是” ”,面实际上是%2B. -(NSString*)UrlValueEnco ...
- Android vs iOS vs Web
Android vs iOS vs Web UI view Android ViewGroup ImageView TextView iOS UIView ImageView TextView Web ...
- 在Android、iOS、Web多平台使用AppGallery Connect性能管理服务
性能管理(App Performance Management,简称APM)是华为应用市场AppGallery Connect(简称AGC)质量系列服务中的其中一项,可以提供分钟级应用性能监控能力,支 ...
- 微软云平台媒体服务实践系列 1- 使用静态封装为iOS, Android 设备实现点播(VoD)方案
微软的云平台媒体服务为流媒体服务提供了多种选择,在使用流媒体服务为企业做流媒体方案时,首先需要确认要流媒体接收目标,如针对广大iOS, Android移动设备,由于它们都支持HLS 格式的流媒体,基于 ...
随机推荐
- BZOJ3082: Graph2
经典问题.强制在线的话非常复杂. 考虑离线. 每条边的存在时间是一个区间,因此按时间建立一颗线段树,将每条边插入,拆成log条边.然后dfs线段树,每次并查集合并当前节点的所有边,到叶子节点时回答询问 ...
- Apache和Nginx配置支持苹果ATS方法
什么是ATS功能? ATS是iOS9和OS X El Capitan的一个新特性.开启该功能后,ATS对使用NSURLConnection, CFURL或NSURLSession 等APIs 进行的网 ...
- mysql查看表使用的数据库引擎
看某个使用的引擎,在显示结果里参数engine后面的就表示该表当前用的存储引擎: mysql> show create table 表名; 看mysql支持哪些存储引擎: mysql> s ...
- telnet连接ip
win7 telnet命令无法开启的解决方案(不是内部命令或外部命令) 出处:西西整理 作者:西西 日期:2012-12-21 14:22:06 [大 中 小] 评论: 0 | 我要发表看法 如果你想 ...
- Wget下载终极用法和15个详细的例子
Wget下载终极用法和15个详细的例子 备注:wget 不支持https 下载,也没有相关https参数,当下载https的时候或以改用 axelWget是一种很好用的因特网下载工具,他具有的很多特 ...
- scrapy2_初窥Scrapy
递归知识:oop,xpath,jsp,items,pipline等专业网络知识,初级水平并不是很scrapy,可以从简单模块自己写. 初窥Scrapy Scrapy是一个为了爬取网站数据,提取结构性数 ...
- python 五子棋
http://www.skywind.me/blog/archives/1029 http://blog.csdn.net/skywind/article/details/8164713 https: ...
- 9月26日JavaScript表单验证、正则表达
一.非空验证 trim:去空格(去掉前后的空格),任何字符串都可以用这个方法.写法为:if(v.trim().length==0),表示如果去掉空格后的字符串的长度为0. <body> & ...
- ecshop广告-》单张,多张
//读取广告 function get_ad_id($ad_id){ //读取指定ad_id广告 $sql = 'select * from '. $GLOBALS['ecs']->table( ...
- centos 7.0 PHP 5.6.5 安装过程 (php+nginx)
php网址 http://php.net/downloads.php 首先下载 php-5.6.5.tar.gz [root@localhost src]# wget http://cn2.php.n ...