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提取中文首字母
Apr 09 PHP
使用VisualStudio开发php的图文设置方法
Aug 21 PHP
使用php检测用户当前使用的浏览器是否为IE浏览器
Dec 03 PHP
PHP获取本周第一天和最后一天示例代码
Feb 24 PHP
仿dedecms下拉分页样式修改的thinkphp分页类实例
Oct 30 PHP
php中session_id()函数详细介绍,会话id生成过程及session id长度
Sep 23 PHP
PHP基于接口技术实现简单的多态应用完整实例
Apr 26 PHP
PHP基于ICU扩展intl快速实现汉字转拼音及按拼音首字母分组排序的方法
May 03 PHP
PHP调用接口用post方法传送json数据的实例
May 31 PHP
PHP连接sftp并下载文件的方法教程
Aug 26 PHP
php使用gearman进行任务分发操作实例详解
Feb 26 PHP
PHP isset empty函数相关面试题及解析
Dec 11 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的MVC模式实现原理分析(一相简单的MVC框架范例)
2014/04/29 PHP
php中cookie实现二级域名可访问操作的方法
2014/11/11 PHP
深入理解PHP JSON数组与对象
2016/07/19 PHP
PHP单例模式详解及实例代码
2016/12/21 PHP
PHP数组遍历的几种常见方式总结
2019/02/15 PHP
PHP实现笛卡尔积算法的实例讲解
2019/12/22 PHP
通过JS自动隐藏手机浏览器的地址栏实现原理与代码
2013/01/02 Javascript
Asp.Net alert弹出提示信息的几种方法总结
2014/01/29 Javascript
js+css实现select的美化效果
2016/03/24 Javascript
三种带箭头提示框总结实例
2016/06/14 Javascript
Vue.js实现价格计算器功能
2020/03/30 Javascript
mint-ui的search组件在键盘显示搜索按钮的实现方法
2017/10/27 Javascript
vue cli 3.0 使用全过程解析
2018/06/14 Javascript
Vue2.X 通过AJAX动态更新数据
2018/07/17 Javascript
vue回到顶部监听滚动事件详解
2019/08/02 Javascript
深入理解redux之compose的具体应用
2020/01/12 Javascript
基于vue+echarts数据可视化大屏展示的实现
2020/12/25 Vue.js
[54:57]DOTA2-DPC中国联赛定级赛 Aster vs DLG BO3第二场 1月8日
2021/03/11 DOTA
bat和python批量重命名文件的实现代码
2016/05/19 Python
python使用正则表达式替换匹配成功的组
2017/11/17 Python
详解Python locals()的陷阱
2019/03/26 Python
python tkinter基本属性详解
2019/09/16 Python
pygame实现俄罗斯方块游戏(对战篇1)
2019/10/29 Python
Python线程障碍对象Barrier原理详解
2019/12/02 Python
python 引用传递和值传递详解(实参,形参)
2020/06/05 Python
python 30行代码实现蚂蚁森林自动偷能量
2021/02/08 Python
Giglio英国站:意大利奢侈品购物网
2018/03/06 全球购物
Weblogc domain问题
2014/01/27 面试题
旅游节目策划方案
2014/05/26 职场文书
2015元旦家电促销活动策划方案
2014/12/09 职场文书
2014年党总支工作总结
2014/12/18 职场文书
2015重阳节敬老活动总结
2015/07/29 职场文书
国庆节主题班会
2015/08/15 职场文书
初三英语教学反思
2016/02/15 职场文书
Python os和os.path模块详情
2022/04/02 Python
mysql sql常用语句大全
2022/06/21 MySQL