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也可以?成Shell Script
Oct 09 PHP
给php新手谈谈我的学习心得
Feb 25 PHP
PHP读取MySQL数据代码
Jun 05 PHP
php实现的IMEI限制的短信验证码发送类
May 05 PHP
php微信开发之带参数二维码的使用
Aug 03 PHP
php版微信公众平台回复中文出现乱码问题的解决方法
Sep 22 PHP
PHP二维数组去重实例分析
Nov 18 PHP
PHP实现APP微信支付的实例讲解
Feb 10 PHP
thinkPHP框架整合tcpdf插件操作示例
Aug 07 PHP
PHP htmlspecialchars_decode()函数用法讲解
Mar 01 PHP
Laravel实现通过blade模板引擎渲染视图
Oct 25 PHP
php设计模式之模板模式实例分析【星际争霸游戏案例】
Mar 24 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的一个完整SMTP类(解决邮件服务器需要验证时的问题)
2006/10/09 PHP
PHP+ajax 无刷新删除数据
2010/02/20 PHP
PHP常用函数总结(180多个)
2016/12/25 PHP
JQuery 确定css方框模型(盒模型Box Model)
2010/01/22 Javascript
javascript中检测变量的类型的代码
2010/12/28 Javascript
深入分析js中的constructor和prototype
2012/04/07 Javascript
为JS扩展Array.prototype.indexOf引发的问题探讨及解决
2013/04/24 Javascript
js为空或不是对象问题的快速解决方法
2013/12/11 Javascript
JavaScript正则表达式小结(test|match|search|replace|split|exec)
2016/12/08 Javascript
详解使用vue实现tab 切换操作
2017/07/03 Javascript
Vue.js进行查询操作的实例详解
2017/08/25 Javascript
使用vue打包时vendor文件过大或者是app.js文件很大的问题
2018/06/29 Javascript
React 无状态组件(Stateless Component) 与高阶组件
2018/08/14 Javascript
JS块级作用域和私有变量实例分析
2019/05/11 Javascript
jQuery实现简易QQ聊天框
2020/02/10 jQuery
原生js+canvas实现验证码
2020/11/29 Javascript
python正则匹配抓取豆瓣电影链接和评论代码分享
2013/12/27 Python
Python实现将16进制字符串转化为ascii字符的方法分析
2017/07/21 Python
Python中int()函数的用法浅析
2017/10/17 Python
Linux(Redhat)安装python3.6虚拟环境(推荐)
2018/05/05 Python
通过Py2exe将自己的python程序打包成.exe/.app的方法
2018/05/26 Python
关于python写入文件自动换行的问题
2018/06/23 Python
基于腾讯云服务器部署微信小程序后台服务(Python+Django)
2019/05/08 Python
python如何将多个PDF进行合并
2019/08/13 Python
Django之使用celery和NGINX生成静态页面实现性能优化
2019/10/08 Python
在线吉他课程,学习如何弹吉他:Fender Play
2019/02/28 全球购物
Laravel中Kafka的使用详解
2021/03/24 PHP
优秀毕业生推荐信
2013/11/02 职场文书
学生周末长期请假条
2014/02/15 职场文书
银行金融服务方案
2014/06/11 职场文书
个人四风对照检查材料
2014/09/26 职场文书
作弊检讨书
2015/01/27 职场文书
离职证明格式样本
2015/06/12 职场文书
给校长的建议书作文400字
2015/09/14 职场文书
高考升学宴主持词
2019/06/21 职场文书
Java多线程并发FutureTask使用详解
2022/06/28 Java/Android