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 相关文章推荐
dede3.1分页文字采集过滤规则详说(图文教程)
Apr 03 PHP
mysql limit查询优化分析
Nov 12 PHP
php UTF8 文件的签名问题
Oct 30 PHP
字母顺序颠倒而单词顺序不变的php代码
Aug 08 PHP
Php图像处理类代码分享
Jan 19 PHP
使用Smarty 获取当前日期时间和格式化日期时间的方法详解
Jun 18 PHP
php过滤html中的其他网站链接的方法(域名白名单功能)
Apr 24 PHP
CentOS6.5 编译安装lnmp环境
Dec 21 PHP
php求一个网段开始与结束IP地址的方法
Jul 09 PHP
培养自己的php编码规范
Sep 28 PHP
php语言注释,单行注释和多行注释
Jan 21 PHP
PHP+MySQL高并发加锁事务处理问题解决方法
Apr 30 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实现Soap通讯的方法
2014/11/03 PHP
使用PHP实现阻止用户上传成人照片或者裸照
2014/12/25 PHP
PHP微信开发之查询微信精选文章
2016/06/23 PHP
关于ThinkPhp 框架表单验证及ajax验证问题
2017/07/19 PHP
laravel实现分页样式替换示例代码(增加首、尾页)
2017/09/22 PHP
extjs之去除s.gif的影响
2010/12/25 Javascript
jquery中dom操作和事件的实例学习-表单验证
2011/11/30 Javascript
Jquery时间验证和转换工具小例子
2013/07/01 Javascript
jQuery 快速结束当前正在执行的动画
2013/11/20 Javascript
javascript如何动态加载表格与动态添加表格行
2013/11/27 Javascript
实例详解jQuery结合GridView控件的使用方法
2016/01/04 Javascript
jQuery前端开发35个小技巧
2016/05/24 Javascript
浅谈JavaScript中面向对象的的深拷贝和浅拷贝
2016/08/01 Javascript
jQuery实现表格隔行及滑动,点击时变色的方法【测试可用】
2016/08/20 Javascript
JS中静态页面实现微信分享功能
2017/02/06 Javascript
详解Vue2 SSR 缓存 Api 数据
2017/11/20 Javascript
使用nodejs+express实现简单的文件上传功能
2017/12/27 NodeJs
Vue在页面右上角实现可悬浮/隐藏的系统菜单
2018/05/04 Javascript
vue实现动态按钮功能
2019/05/13 Javascript
javascript随机变色实例代码
2019/10/15 Javascript
Python multiprocess pool模块报错pickling error问题解决方法分析
2019/03/20 Python
python 中pyqt5 树节点点击实现多窗口切换问题
2019/07/04 Python
基于python实现自动化办公学习笔记(CSV、word、Excel、PPT)
2019/08/06 Python
Flask项目中实现短信验证码和邮箱验证码功能
2019/12/05 Python
Matlab使用Plot函数实现数据动态显示方法总结
2021/02/25 Python
加拿大时尚少女服装品牌:Garage
2016/10/10 全球购物
4s店销售经理岗位职责
2014/07/19 职场文书
优秀大专毕业生求职信
2014/08/04 职场文书
2014学习优秀共产党员先进事迹思想汇报
2014/09/14 职场文书
2014年乡镇安全生产工作总结
2014/12/02 职场文书
董事长助理岗位职责
2015/02/11 职场文书
保密法制宣传月活动总结
2015/05/07 职场文书
锦旗赠语
2015/06/23 职场文书
2016年小学“公民道德宣传日”活动总结
2016/04/01 职场文书
详解PHP Swoole与TCP三次握手
2021/05/27 PHP
解决MySQL Varchar 类型尾部空格的问题
2022/04/06 MySQL