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 相关文章推荐
聊天室php&amp;mysql(四)
Oct 09 PHP
PHP定时执行计划任务的多种方法小结
Dec 19 PHP
Window下PHP三种运行方式图文详解
Jun 11 PHP
ThinkPHP文件上传实例教程
Aug 22 PHP
ThinkPHP 3.2 数据分页代码分享
Oct 14 PHP
PHP中substr函数字符串截取用法分析
Jan 07 PHP
Smarty分页实现方法完整实例
May 11 PHP
php 时间time与日期date之间的使用详解及区别
Nov 07 PHP
thinkPHP框架对接支付宝即时到账接口回调操作示例
Nov 14 PHP
Yii2中使用asset压缩js,css文件的方法
Nov 24 PHP
PHP5.6新增加的可变函数参数用法分析
Aug 25 PHP
php+redis实现消息队列功能示例
Sep 19 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
给apache2.2加上mod_encoding模块後 php5.2.0 处理url出现bug
2007/04/12 PHP
php生成随机数或者字符串的代码
2008/09/05 PHP
php 设计模式之 单例模式
2008/12/19 PHP
PHP运行环境配置与开发环境的配置(图文教程)
2013/06/04 PHP
php实现监听事件
2013/11/06 PHP
php从memcache读取数据再批量写入mysql的方法
2014/12/29 PHP
JavaScript 判断浏览器类型及版本
2009/02/21 Javascript
跟我一起学写jQuery插件开发方法(附完整实例及下载)
2010/04/01 Javascript
初识javascript 文档碎片
2010/07/13 Javascript
js自定义事件及事件交互原理概述(二)
2013/02/01 Javascript
js动态生成指定行数的表格
2013/07/11 Javascript
详解js闭包
2014/09/02 Javascript
vuex实现简易计数器
2016/10/27 Javascript
解决ajax不能访问本地文件问题(利用js跨域原理)
2017/01/24 Javascript
javaScript实现复选框全选反选事件详解
2020/11/20 Javascript
详解Javascript中new()到底做了些什么?
2018/03/29 Javascript
vue 实现边输入边搜索功能的实例讲解
2018/09/16 Javascript
微信小程序实现打卡日历功能
2020/09/21 Javascript
python中遍历文件的3个方法
2014/09/02 Python
python实现读取并显示图片的两种方法
2017/01/13 Python
python里使用正则的findall函数的实例详解
2017/10/19 Python
Python代码块批量添加Tab缩进的方法
2018/06/25 Python
Python类和实例的属性机制原理详解
2020/03/21 Python
解决python虚拟环境切换无效的问题
2020/04/30 Python
美国最便宜的旅游网站:CheapTickets
2017/07/09 全球购物
联想新西兰官方网站:Lenovo New Zealand
2018/10/30 全球购物
Foot Locker加拿大官网:美国知名运动产品零售商
2019/07/21 全球购物
印尼在线旅游门户网站:NusaTrip
2019/11/01 全球购物
《桂林山水》教学反思
2014/02/08 职场文书
护理专业毕业生自我鉴定总结
2014/03/24 职场文书
租赁意向书范本
2014/04/01 职场文书
2014年青年教师工作总结
2014/12/17 职场文书
2014年机关工会工作总结
2014/12/19 职场文书
教师个人学习总结
2015/02/11 职场文书
2015年公司工作总结
2015/04/25 职场文书
学习师德师风的心得体会(2篇)
2019/10/08 职场文书