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学习资料汇总与网址
Mar 16 PHP
phpmyadmin导入(import)文件限制的解决办法
Dec 11 PHP
PHP 获取文件路径(灵活应用__FILE__)
Feb 15 PHP
php中字符集转换iconv函数使用总结
Oct 11 PHP
php字符串函数学习之substr()
Mar 27 PHP
前端必学之PHP语法基础
Jan 01 PHP
理解php依赖注入和控制反转
May 11 PHP
php使用curl并发减少后端访问时间的方法分析
May 12 PHP
PHP实现将MySQL重复ID二维数组重组为三维数组的方法
Aug 01 PHP
PHP 获取 ping 时间的实现方法
Sep 29 PHP
PHP获取访问设备信息的方法示例
Feb 20 PHP
PHP7新功能总结
Apr 14 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
php上传图片到指定位置路径保存到数据库的具体实现
2013/12/30 PHP
PHP根据IP判断地区名信息的示例代码
2014/03/03 PHP
PHP学习笔记(二) 了解PHP的基本语法以及目录结构
2014/08/04 PHP
PHP连接和操作MySQL数据库基础教程
2014/09/29 PHP
json跟xml的对比分析
2008/06/10 Javascript
RGB颜色值转HTML十六进制(HEX)代码的JS函数
2009/04/25 Javascript
基于JavaScript实现继承机制之构造函数方法对象冒充的使用详解
2013/05/07 Javascript
Jquery焦点与失去焦点示例应用
2014/06/10 Javascript
Jquery 垂直多级手风琴菜单附源码下载
2015/11/17 Javascript
实现easyui的datagrid导出为excel的示例代码
2016/11/10 Javascript
JS实现图片预加载之无序预加载功能代码
2017/05/12 Javascript
iframe高度自适应及隐藏滚动条的实例详解
2017/09/29 Javascript
Node.js 实现抢票小工具 &amp; 短信通知提醒功能
2019/10/22 Javascript
vue配置多代理服务接口地址操作
2020/09/08 Javascript
[03:13]DOTA2-DPC中国联赛1月25日Recap集锦
2021/03/11 DOTA
Python(Tornado)模拟登录小米抢手机
2013/11/12 Python
详解python使用递归、尾递归、循环三种方式实现斐波那契数列
2018/01/16 Python
Python实现PS滤镜功能之波浪特效示例
2018/01/26 Python
python中join()方法介绍
2018/10/11 Python
浅谈Pycharm中的Python Console与Terminal
2019/01/17 Python
Python实现的IP端口扫描工具类示例
2019/02/15 Python
Python 类属性与实例属性,类对象与实例对象用法分析
2019/09/20 Python
Python中如何将一个类方法变为多个方法
2019/12/30 Python
python3用PyPDF2解析pdf文件,用正则匹配数据方式
2020/05/12 Python
Python使用urlretrieve实现直接远程下载图片的示例代码
2020/08/17 Python
给同学的道歉信
2014/01/16 职场文书
工程管理英文求职信
2014/03/18 职场文书
班委竞选演讲稿
2014/04/28 职场文书
团日活动总结怎么写
2014/06/25 职场文书
合同意向书范本
2014/07/30 职场文书
高中社区服务活动报告
2015/02/05 职场文书
公司门卫岗位职责
2015/04/13 职场文书
旅游项目合作意向书
2015/05/08 职场文书
深入解析NumPy中的Broadcasting广播机制
2021/05/30 Python
浅谈JavaScript浅拷贝和深拷贝
2021/11/07 Javascript
浅谈Redis的事件驱动模型
2022/05/30 Redis