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的更多相关文章

  1. 仿微信的IM聊天时间显示格式(含iOS/Android/Web实现)[图文+源码]

    本文为原创分享,转载请注明出处. 1.引言 即时通讯IM应用中的聊天消息时间显示是个再常见不过的需求,现在都讲究用户体验,所以时间显示再也不能像传统软件一样简单粗地暴显示成“年/月/日 时:分:秒”这 ...

  2. Lottie在手,动画我有:ios/Android/Web三端复杂帧动画解决方案

      为什么需要Lottie 在相对复杂的移动端应用中,我们可能会需要使用到复杂的帧动画.例如: 刚进入APP时候可能会看到的入场小动画,带来愉悦的视觉享受 许多Icon的互动变化比较复杂多变的时候,研 ...

  3. WEB通知和React Native之即时通讯(iOS Android)

    WEB通知和React Native之即时通讯(iOS Android) 一,需求分析 1.1,允许服务器主动发送信息给客户端,客户端能监听到并且能接收. 1.2,为了方便同一个系统内的用户可以指定某 ...

  4. React Native之配置URL Scheme(iOS Android)

    React Native之配置URL Scheme(iOS Android) 一,需求分析 1.1,需要在网站中打开/唤起app,或其他app中打开app,则需要设置URL Scheme.比如微信的是 ...

  5. ios访问web页面<div>点击事件不起效果,以及alert()显示url的解决办法

    ios访问web页面<div>点击不起效果,在其div上添加style=”cursor:pointer:“ jquery web页面动态append()事件调用方法:$(document) ...

  6. ios Url Encode

    //ios Url Encode //有时候在请求的参数里里特殊符号比如“+”等.而如果没有encode的话那么传过去的还是” ”,面实际上是%2B. -(NSString*)UrlValueEnco ...

  7. Android vs iOS vs Web

    Android vs iOS vs Web UI view Android ViewGroup ImageView TextView iOS UIView ImageView TextView Web ...

  8. 在Android、iOS、Web多平台使用AppGallery Connect性能管理服务

    性能管理(App Performance Management,简称APM)是华为应用市场AppGallery Connect(简称AGC)质量系列服务中的其中一项,可以提供分钟级应用性能监控能力,支 ...

  9. 微软云平台媒体服务实践系列 1- 使用静态封装为iOS, Android 设备实现点播(VoD)方案

    微软的云平台媒体服务为流媒体服务提供了多种选择,在使用流媒体服务为企业做流媒体方案时,首先需要确认要流媒体接收目标,如针对广大iOS, Android移动设备,由于它们都支持HLS 格式的流媒体,基于 ...

随机推荐

  1. angular state和stateParams

    angular ui-route通过路由传递参数 发送ctrl var model = { data: positionid }; $state.go('app.position.publish', ...

  2. js013-事件

    js013-事件 本章内容 理解事件流 使用时间处理程序 不同的事件类型 JS与HTML之间的交互是通过实践实现的.时间就还文档或浏览器窗口发生的一些特定的交互 瞬间.可以使用侦听器来预定事件,以便时 ...

  3. jquery 获取json文件数据,显示到jsp页面上, 或者html页面上

    [{"name":"中国工商银行","code":102},{"name":"中国农业银行",&qu ...

  4. JSON-LD

    RDF RDF用于信息需要被应用程序处理而不是仅仅显示给人观看的场合.RDF提供了一种用于表达这一信息.并使其能在应用程序间交换而不丧失语义的通用框架.既然是通用框架,应用程序设计者可以利用现成的通用 ...

  5. Nginx+PHP-fpm高负载优化及压力测试方法

    Nginx+PHP-fpm组合,以内存占用小,负载能力强壮的特点,成为小内存VPS建站的首选组合.我们一起来探讨一下nginx+php-fpm高负载的优化方法. 先来看看nginx配置参数的优化.ng ...

  6. 《深入理解bootstrap》读书笔记:第4章 CSS组件(上)

    bootstrap三大核心之二. 包括glyphicon图标,下拉菜单(dropdown),按钮组(button group)....等等. 一. 图标字体 bootstrap3提供了200多个免费图 ...

  7. msbuild FileSysExcludeFiles

    <?xml version="1.0" encoding="utf-8"?> <!-- This file is used by the pu ...

  8. redis入侵小结

    redis安装: windows安装包:http://pan.baidu.com/s/1i3jLlC5 下载下来之后,开始安装: redis-server.exe redis.conf: 简单一步,安 ...

  9. cookie和session的对比

    1.存放的位置     cookie存在客户端的临时文件夹     session:存在服务器的内存中,一个session域对象为一个用户浏览器服务. 2.安全性   cookie是以明文方式存放在客 ...

  10. 使用VMware 安装Linux CentOS7

    访问百度经验 http://jingyan.baidu.com/article/eae0782787b4c01fec548535.html 安装无忧..