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 相关文章推荐
使用Apache的rewrite技术
Jun 22 PHP
SMARTY学习手记
Jan 04 PHP
php escape URL编码
Dec 10 PHP
php插入中文到sqlserver 2008里出现乱码的解决办法分享
Jul 19 PHP
ASP和PHP实现生成网站快捷方式并下载到桌面的方法
May 08 PHP
PHP MySql增删改查的简单实例
Jun 21 PHP
PHP5.4起内置web服务器使用方法
Aug 09 PHP
ThinkPHP打水印及设置水印位置的方法
Oct 14 PHP
php compact 通过变量创建数组
Nov 15 PHP
修改yii2.0用户登录使用的user表为其它的表实现方法(推荐)
Aug 01 PHP
laravel中数据显示方法(默认值和下拉option默认选中)
Oct 11 PHP
如何在Laravel5.8中正确地应用Repository设计模式
Nov 26 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中利用wsdl创建标准webservice的实现代码
2011/12/07 PHP
利用PHP计算有多少小于当前数字的数字方法示例
2020/08/26 PHP
JS跨域总结
2012/08/30 Javascript
js实现特定位取反原理及示例
2014/06/30 Javascript
JavaScript实现动态创建CSS样式规则方案
2014/09/06 Javascript
jquery中change()用法实例分析
2015/02/06 Javascript
javascript中replace( )方法的使用
2015/04/24 Javascript
js实现横向伸展开的二级导航菜单代码
2015/08/28 Javascript
jQuery图片旋转插件jQueryRotate.js用法实例(附demo下载)
2016/01/21 Javascript
jQuery页面元素动态添加后绑定事件丢失方法,非 live
2016/06/16 Javascript
常用的javascript设计模式
2017/01/11 Javascript
详解Sea.js中Module.exports和exports的区别
2017/02/12 Javascript
Angular.js之作用域scope'@','=','&amp;'实例详解
2017/02/28 Javascript
浅谈Node.js之异步流控制
2017/10/25 Javascript
基于vue v-for 多层循环嵌套获取行数的方法
2018/09/26 Javascript
Vue学习之常用指令实例详解
2020/01/06 Javascript
[49:08]完美世界DOTA2联赛PWL S2 LBZS vs FTD.C 第一场 11.27
2020/12/01 DOTA
python实现手机通讯录搜索功能
2018/02/22 Python
python查看模块安装位置的方法
2018/10/16 Python
Python实现一个数组除以一个数的例子
2019/07/20 Python
kafka-python 获取topic lag值方式
2019/12/23 Python
python 图像判断,清晰度(明暗),彩色与黑白实例
2020/06/04 Python
浅谈OpenCV中的新函数connectedComponentsWithStats用法
2020/07/05 Python
CSS3实现渐变背景兼容问题
2020/05/06 HTML / CSS
印度领先的在线时尚商店:Koovs
2016/08/28 全球购物
中专毕业个人的自荐信格式
2013/09/21 职场文书
玩具公司的创业计划书
2013/12/31 职场文书
股权转让协议书
2014/04/12 职场文书
演讲稿格式范文
2014/05/19 职场文书
2015年安全生产月活动总结
2015/03/26 职场文书
西部计划志愿者工作总结
2015/08/11 职场文书
2016年第32个教师节致辞
2015/11/26 职场文书
会计工作自我鉴定范文
2019/06/21 职场文书
表扬稿表扬信的格式及范文
2019/06/24 职场文书
解析MySQL binlog
2021/06/11 MySQL
VUE递归树形实现多级列表
2022/07/15 Vue.js