首页
学
【学】PHP
【学】前端
【学】Linux
【学】杂学
【学】支付
【学】Docker
享
【享】文件
【享】工具
日记
Me
【Me】我
【Me】留言
老郭博客-程序员客栈
文章模型
下载模型
首页
学
【学】PHP
【学】前端
【学】Linux
【学】杂学
【学】支付
【学】Docker
享
【享】文件
【享】工具
日记
Me
【Me】我
【Me】留言
首页
学
【学】支付
PHP 中 Des加密后传参被特殊字符截断处理方法(重要)
PHP 中 Des加密后传参被特殊字符截断处理方法(重要)
发布时间:
4年前
作者:
老郭
热度:
2183 ℃
评论数:
本人在写一个项目的时候,需要对接口的参数做加密,所以选择了`DES加密`,但是在加密的过程中出现了种种的问题。 ### 小插曲 由于公司服务器的原因,没有用`Larave框架`进行编写项目,这是比较可惜的;本人还没有了解过`ThinkPHP5` 的一些知识,所以就没敢贸然使用`ThinkPHP5`来编写公司的项目 ,所以就用了`ThinkPHP3.2` 框架进行编写。在编写过程中,需要为项目的API配置路由,也就是路由`DES 加密`这一块,写这个`正则路由`废了点时间,但是也不会影响项目的进度,所以分享一下配置的路由。 ```php 'URL_ROUTER_ON' => true, //开启路由 'URL_ROUTE_RULES'=>array( // 's/:id$'=>'Home/Index/order?s=:id$', '/^s\/([A-Za-z0-9+\/=_]{56,70})$/' => 'Home/Index/order?id=:1' ), ``` ### 言归正传 我们需要在url中传递中文字符或是其它的html等特殊字符,似乎总会有各种乱,不同的浏览器对他们的编码又不一样, 对于中文,一般的做法是: 把这些文本字符串传给url之前,先进行`urlencode($text)`一下; 但是对于一些很“危险”的字符,比如说html字符,甚至是SQL注入相关的字符,如果很明显的传给系统,出于安全考虑,系统一般都会把它们过滤掉的。 现在,我们需要这些危险字符,该这么办? 我想到的办法是 先给它们 `base64_encode($text)` 编码,到服务端时,又给它们 `base64_decode($text) `解码, 貌似很完美,但是在使用的过程中又遇到一个问题,`base64_encode` 编码后的字符串中含有` "/", "+", "="` 等字符, `base64_encode()`函数由于要在url中传用户输入观点(少量的内容),当用户提交(post提交)过来的是一个数组.所以我把观点用`bse64_encode()`函数给加密.当跳转到处理页面时,我再给get接收,这时出现两边加密的数据不对.`少了一个+字符`. 用户提交加密: ```php tPK9tNPNyKUsuse6xyYjNDY7JiM0NjsufMavwcEhfMyrxq/BwcHLLMjDztLO3tPvLNXmz+vI69ehsKEhfHw= ``` 在处理页面用get接收到的: ```php tPK9tNPNyKUsuse6xyYjNDY7JiM0NjsufMavwcEhfMyrxq/BwcHLLMjDztLO3tPvLNXmz vI69ehsKEhfHw= ``` 对比找到少了一个加号,不知道是什么原因导制的(猜想可能是get时,+字符可能不能得到吧!).还请高手指点. 这些字符在url编码中又是特殊字符,比如 "+" ,它就表示 “空格”,但是不同的浏览器对“空格”的编码又不一样,有的是用“+”表示,有的是用“20%”表示,也就是说,让这些`base64_encode`编码后的字符串在url中传递,用不同的浏览器去浏览时,服务端得到值不一样。 于是乎,想到了一个折中办法,先将这些base64编码后的特殊字符替换掉,到服务端后,又替换回来: ### 解决方法: ##### 一、在用户提交加密串的时间,我把+字符给换成别的字字符.如:`str_replace('+', '_', $content);` ##### 二、在处理页面再次转换一次:如:`str_replace('_', '+', $content);` ```php function base_encode($str) { $src = array("/","+","="); $dist = array("_a","_b","_c"); $old = base64_encode($str); $new = str_replace($src,$dist,$old); return $new; } function base_decode($str) { $src = array("_a","_b","_c"); $dist = array("/","+","="); $old = str_replace($src,$dist,$str); $new = base64_decode($old); return $new; } ``` 下面是在浏览器中得到的效果: ```php xOO6w6Osuf65_aiy_atL_b00Ke5_b8jnus6ho6GjoaM_c ``` ##### 三、urldecode实例方法很简单 urldecode ( string $str ) 解码给出的已编码字符串中的任何 %##。返回解码后的字符串。 ```php <?php $a = explode('&', $QUERY_STRING); $i = 0; while ($i < count($a)) { $b = split('=', $a[$i]); echo 'Value for parameter ', htmlspecialchars(urldecode($b[0])), ' is ', htmlspecialchars(urldecode($b[1])), "<br /> "; $i++; } ?> ```
des加密,3des加密,特殊字符,截断,php加密,php 3des加密,des加密php
上一篇:
php 3DES|DES 加密解密(通用)
下一篇:
通过支付宝二维码链接直接调起支付宝支付
栏目导航
【学】PHP
【学】前端
【学】Linux
【学】杂学
【学】支付
【学】Docker
相关文章
PHP通过OpenSSL生成证书、密钥并且加密解密数据
2946 ℃
总支付流程及银联二维码PHP版本demo详细剖析
4177 ℃
php生成md5签名原理
2656 ℃
php 3DES|DES 加密解密(通用)
4000 ℃
PHP 中 Des加密后传参被特殊字符截断处理方法(重要)
2183 ℃
通过支付宝二维码链接直接调起支付宝支付
2726 ℃
微信小程序
手机扫码访问