php中url传递中文字符,特殊危险字符的解决方法


Posted in PHP onAugust 17, 2013

我们需要在url中传递中文字符或是其它的html等特殊字符,似乎总会有各种乱,不同的浏览器对他们的编码又不一样,

对于中文,一般的做法是:

把这些文本字符串传给url之前,先进行urlencode($text)一下;

但是对于一些很“危险”的字符,比如说html字符,甚至是SQL注入相关的字符,如果很明显的传给系统,出于安全考虑,系统一般都会把它们过滤掉的。

现在,我们需要这些危险字符,该这么办?

我想到的办法是 先给它们 base64_encode($text) 编码,到服务端时,又给它们 base64_decode($text) 解码,

貌似很完美,但是在使用的过程中又遇到一个问题,base64_encode 编码后的字符串中含有 "/", "+", "=" 等字符,

base64_encode()函数由于要在url中传用户输入观点(少量的内容),当用户提交(post提交)过来的是一个数组.所以我把观点用bse64_encode()函数给加密.当跳转到处理页面时,我再给get接收,这时出现两边加密的数据不对.少了一个+字符.

用户提交加密:

tPK9tNPNyKUsuse6xyYjNDY7JiM0NjsufMavwcEhfMyrxq/BwcHLLMjDztLO3tPvLNXmz+vI69ehsKEhfHw=

在处理页面用get接收到的:

tPK9tNPNyKUsuse6xyYjNDY7JiM0NjsufMavwcEhfMyrxq/BwcHLLMjDztLO3tPvLNXmz vI69ehsKEhfHw=

对比找到少了一个加号,不知道是什么原因导制的(猜想可能是get时,+字符可能不能得到吧!).还请高手指点.

这些字符在url编码中又是特殊字符,比如 "+" ,它就表示 “空格”,但是不同的浏览器对“空格”的编码又不一样,有的是用“+”表示,有的是用“20%”表示,也就是说,让这些base64_encode编码后的字符串在url中传递,用不同的浏览器去浏览时,服务端得到值不一样。

于是乎,想到了一个折中办法,先将这些base64编码后的特殊字符替换掉,到服务端后,又替换回来:

解决方法:

一.在用户提交加密串的时间,我把+字符给换成别的字字符.如:str_replace('+', '_', $content);
二.在处理页面再次转换一次:如:str_replace('_', '+', $content);

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;
}

下面是在浏览器中得到的效果

xOO6w6Osuf65_aiy_atL_b00Ke5_b8jnus6ho6GjoaM_c

urldecode实例方法很简单

urldecode ( string $str )
解码给出的已编码字符串中的任何 %##。返回解码后的字符串。

Example #1 urldecode() 例子

<?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++;
}
?>
PHP 相关文章推荐
弄了个检测传输的参数是否为数字的Function
Dec 06 PHP
修改了一个很不错的php验证码(支持中文)
Feb 14 PHP
PHP 伪静态隐藏传递参数名的四种方法
Feb 22 PHP
IP攻击升级,程序改进以对付新的攻击
Nov 23 PHP
8个出色的WordPress SEO插件收集
Feb 26 PHP
PHP中call_user_func_array()函数的用法演示
Feb 05 PHP
php学习之function的用法
Jul 14 PHP
php导出word文档与excel电子表格的简单示例代码
Mar 08 PHP
Smarty中的注释和截断功能介绍
Apr 09 PHP
php 二维数组时间排序实现代码
Nov 19 PHP
php框架CodeIgniter主从数据库配置方法分析
May 25 PHP
PHP单例模式数据库连接类与页面静态化实现方法
Mar 20 PHP
测试PHP连接MYSQL成功与否的代码
Aug 16 #PHP
PHP 通过Socket收发十六进制数据的实现代码
Aug 16 #PHP
php读取mysql中文数据出现乱码的解决方法
Aug 16 #PHP
JoshChen_web格式编码UTF8-无BOM的小细节分析
Aug 16 #PHP
JoshChen_php新手进阶高手不可或缺的规范介绍
Aug 16 #PHP
php漏洞之跨网站请求伪造与防止伪造方法
Aug 15 #PHP
PHP Global定义全局变量使用说明
Aug 15 #PHP
You might like
Classes and Objects in PHP5-面向对象编程 [1]
2006/10/09 PHP
ThinkPHP CURD方法之page方法详解
2014/06/18 PHP
用JS判别浏览器种类以及IE版本的几种方法小结
2011/08/02 Javascript
js获取height和width的方法说明
2013/01/06 Javascript
jquery获取被勾选的checked(选中)的那一行的3列和4列的值
2013/07/04 Javascript
我的Node.js学习之路(三)--node.js作用、回调、同步和异步代码 以及事件循环
2014/07/06 Javascript
JS鼠标拖拽实例分析
2015/11/23 Javascript
Bootstrap框架安装使用详解
2017/01/21 Javascript
vue2.0使用Sortable.js实现的拖拽功能示例
2017/02/21 Javascript
js中DOM三级列表(代码分享)
2017/03/20 Javascript
electron demo项目npm install安装失败的解决方法
2018/02/06 Javascript
快速解决vue-cli在ie9+中无效的问题
2018/09/04 Javascript
vue项目环境变量配置的实现方法
2018/10/12 Javascript
vue swipe自定义组件实现轮播效果
2019/07/03 Javascript
JS浏览器BOM常见操作实例详解
2020/04/27 Javascript
Vue 自适应高度表格的实现方法
2020/05/13 Javascript
Python操作MySQL数据库9个实用实例
2015/12/11 Python
Python使用email模块对邮件进行编码和解码的实例教程
2016/07/01 Python
Python如何判断数独是否合法
2016/09/08 Python
python爬虫headers设置后无效的解决方法
2017/10/21 Python
Anaconda2下实现Python2.7和Python3.5的共存方法
2018/06/11 Python
python事件驱动event实现详解
2018/11/21 Python
PyCharm安装Markdown插件的两种方法
2019/06/24 Python
利用Pandas和Numpy按时间戳将数据以Groupby方式分组
2019/07/22 Python
tensorflow -gpu安装方法(不用自己装cuda,cdnn)
2020/01/20 Python
matplotlib部件之套索Lasso的使用
2021/02/24 Python
Sunglasses Shop荷兰站:英国最大的太阳镜独立在线零售商和供应商
2017/01/08 全球购物
英国现代绅士品牌:Hackett
2017/12/17 全球购物
十八大标语口号
2014/10/09 职场文书
质检员岗位职责
2015/02/03 职场文书
道歉的话怎么说
2015/05/12 职场文书
退休欢送会主持词
2015/07/01 职场文书
2019年年中工作总结讲话稿模板
2019/03/25 职场文书
在Spring-Boot中如何使用@Value注解注入集合类
2021/08/02 Java/Android
weblogic服务建立数据源连接测试更新mysql驱动包的问题及解决方法
2022/01/22 MySQL
git中cherry-pick命令的使用教程
2022/06/25 Servers