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 相关文章推荐
一个ftp类(ini.php)
Oct 09 PHP
整理的9个实用的PHP库简介和下载
Nov 09 PHP
php curl 伪造IP来源的实例代码
Nov 01 PHP
codeigniter中实现一次性加载多个view的方法
Mar 20 PHP
php跨服务器访问方法小结
May 12 PHP
在WordPress的文章编辑器中设置默认内容的方法
Dec 29 PHP
php文件上传的两种实现方法
Apr 04 PHP
SAE实时日志接口SDK用法示例
Oct 09 PHP
Yii框架用户登录session丢失问题解决方法
Jan 07 PHP
PHP设计模式之装饰器模式定义与用法简单示例
Aug 13 PHP
浅谈PHP封装CURL
Mar 06 PHP
PHP时间函数使用详解
Mar 21 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
多文件上传的例子
2006/10/09 PHP
php记录日志的实现代码
2011/08/08 PHP
symfony表单与页面实现技巧
2015/01/26 PHP
ThinkPHP5.1的权限控制怎么写?分享一个AUTH权限控制
2021/03/09 PHP
JavaScript DOM学习第八章 表单错误提示
2010/02/19 Javascript
JavaScript 语言的递归编程
2010/05/18 Javascript
由JavaScript技术实现的web小游戏(不含网游)
2010/06/12 Javascript
如何确保JavaScript的执行顺序 之实战篇
2011/03/03 Javascript
cument.execCommand()用法深入理解
2012/12/04 Javascript
跨域传值即主页面与iframe之间互相传值
2013/12/09 Javascript
JavaScript获取客户端计算机硬件及系统等信息的方法
2014/01/02 Javascript
js判断手机访问或者PC的几个例子(常用于手机跳转)
2015/12/15 Javascript
简单实现JavaScript图片切换效果
2016/11/28 Javascript
Bootstrap table简单使用总结
2017/02/15 Javascript
canvas仿iwatch时钟效果
2017/03/06 Javascript
angular $watch 一个变量的变化(实例讲解)
2017/08/02 Javascript
vue内置指令详解
2018/04/03 Javascript
js实现点击按钮复制文本功能
2020/07/20 Javascript
通过实例了解Javascript柯里化流程
2020/03/03 Javascript
JavaScript 防盗链的原理以及破解方法
2020/12/29 Javascript
[05:09]DOTA2-DPC中国联赛2月22日Recap集锦
2021/03/11 DOTA
Python用GET方法上传文件
2015/03/10 Python
pygame学习笔记(5):游戏精灵
2015/04/15 Python
python计算牛顿迭代多项式实例分析
2015/05/07 Python
python实现微信定时每天和女友发送消息
2019/04/29 Python
flask/django 动态查询表结构相同表名不同数据的Model实现方法
2019/08/29 Python
Python实现TCP探测目标服务路由轨迹的原理与方法详解
2019/09/04 Python
20行代码教你用python给证件照换底色的方法示例
2021/02/05 Python
极简的HTML5模版
2015/07/09 HTML / CSS
屈臣氏泰国官网:Watsons TH
2021/02/23 全球购物
老师给学生的表扬信
2014/01/17 职场文书
讲文明树新风演讲稿
2014/05/12 职场文书
党员教师群众路线个人整改措施
2014/10/28 职场文书
国情备忘录观后感
2015/06/04 职场文书
学生会招新宣传语
2015/07/13 职场文书
小学记事作文之200字
2019/08/06 职场文书