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集成FCK的函数代码
Sep 27 PHP
PHP 读取文件内容代码(txt,js等)
Dec 06 PHP
解析isset与is_null的区别
Aug 09 PHP
php上传文件中文文件名乱码的解决方法
Nov 01 PHP
PHP对表单提交特殊字符的过滤和处理方法汇总
Feb 18 PHP
ThinkPHP实现带验证码的文件上传功能实例
Nov 01 PHP
PHP 快速排序算法详解
Nov 10 PHP
PHP中addcslashes与stripcslashes函数用法分析
Jan 07 PHP
PHP简单获取网站百度搜索和搜狗搜索收录量的方法
Aug 23 PHP
利用 fsockopen() 函数开放端口扫描器的实例
Aug 19 PHP
Laravel框架使用Seeder实现自动填充数据功能
Jun 13 PHP
Mac系统下搭建Nginx+php-fpm实例讲解
Dec 15 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调用Linux的命令行执行文件压缩命令
2013/01/27 PHP
使用jQuery实现的网页版的个人简历(可换肤)
2013/04/19 Javascript
node.js WEB开发中图片验证码的实现方法
2014/06/03 Javascript
Javascript URI 解析介绍
2015/03/15 Javascript
学习JavaScript编程语言的8张思维导图分享
2015/03/27 Javascript
jQuery匹配文档链接并添加class的方法
2015/06/26 Javascript
JavaScript实现可拖拽的拖动层Div实例
2015/08/05 Javascript
原生JS实现旋转木马式图片轮播插件
2016/04/25 Javascript
JavaScript ES6的新特性使用新方法定义Class
2016/06/28 Javascript
将form表单通过ajax实现无刷新提交的简单实例
2016/10/12 Javascript
从零学习node.js之文件操作(三)
2017/02/21 Javascript
JavaScript简单计算人的年龄示例
2017/04/15 Javascript
ionic环境配置及问题详解
2017/06/27 Javascript
vue.js整合vux中的上拉加载下拉刷新实例教程
2018/01/09 Javascript
通过函数作用域和块级作用域看javascript的作用域链
2018/08/05 Javascript
[01:31:22]Ti4 循环赛第四日附加赛LGD vs Mouz
2014/07/13 DOTA
python三元运算符实现方法
2013/12/17 Python
Python面向对象类的继承实例详解
2018/06/27 Python
对python 读取线的shp文件实例详解
2018/12/22 Python
linux安装python修改默认python版本方法
2019/03/31 Python
django中media媒体路径设置的步骤
2019/11/15 Python
TensorFlow加载模型时出错的解决方式
2020/02/06 Python
HTML5轻松实现全屏视频背景的示例
2018/04/23 HTML / CSS
德国电子产品购物网站:TechInTheBasket德国
2018/12/07 全球购物
Clarks西班牙官方在线商店:clarks鞋
2019/05/03 全球购物
Nordgreen台湾官网:极简北欧设计手表
2019/08/21 全球购物
Foot Locker澳洲官网:美国运动服和鞋类零售商
2019/10/11 全球购物
药剂专业个人求职信范文
2014/04/29 职场文书
电子商务专业毕业生自荐书
2014/06/22 职场文书
推广普通话标语
2014/06/27 职场文书
研究生导师推荐信
2014/09/06 职场文书
共青团员自我评价范文
2014/09/14 职场文书
党支部创先争优公开承诺书
2015/04/30 职场文书
初中生物教学随笔
2015/08/15 职场文书
解决numpy和torch数据类型转化的问题
2021/05/23 Python
Win11 KB5015814遇安装失败 影响开始菜单性能解决方法
2022/07/15 数码科技