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 批量删除 sql语句
Jun 05 PHP
php将数据库导出成excel的方法
May 07 PHP
PHP中设置时区,记录日志文件的实现代码
Jan 07 PHP
PHP获取QQ达人QQ信息的方法
Mar 05 PHP
php通过排列组合实现1到9数字相加都等于20的方法
Aug 03 PHP
Zend Framework教程之配置文件application.ini解析
Mar 10 PHP
ThinkPHP框架里隐藏index.php
Apr 12 PHP
PHP流Streams、包装器wrapper概念与用法实例详解
Nov 17 PHP
layui框架实现文件上传及TP3.2.3(thinkPHP)对上传文件进行后台处理操作示例
May 12 PHP
PHP等比例压缩图片的实例代码
Jul 26 PHP
PHP的curl函数的用法总结
Feb 14 PHP
php设计模式之代理模式分析【星际争霸游戏案例】
Mar 23 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判断手机访问还是电脑访问示例分享
2014/01/20 PHP
php三元运算符知识汇总
2015/07/02 PHP
分享php邮件管理器源码
2016/01/06 PHP
php的常量和变量实例详解
2017/06/27 PHP
PHP实现mysqli批量执行多条语句的方法示例
2017/07/22 PHP
用Javascript实现锚点(Anchor)间平滑跳转
2009/09/08 Javascript
jquery中dom操作和事件的实例学习 下拉框应用
2011/12/01 Javascript
浅析Js(Jquery)中,字符串与JSON格式互相转换的示例(直接运行实例)
2013/07/09 Javascript
JS如何判断移动端访问设备并解析对应CSS
2013/11/27 Javascript
JQuery中serialize()用法实例分析
2015/02/06 Javascript
JavaScript中数据结构与算法(四):串(BF)
2015/06/19 Javascript
一个简单的JavaScript Map实例(分享)
2016/08/03 Javascript
Seajs是什么及sea.js 由来,特点以及优势
2016/10/13 Javascript
javascript实现的图片预览功能
2017/03/25 Javascript
Angularjs中使用轮播图指令swiper
2017/05/30 Javascript
vue项目实现表单登录页保存账号和密码到cookie功能
2018/08/31 Javascript
Taro UI框架开发小程序实现左滑喜欢右滑不喜欢效果的示例代码
2020/05/18 Javascript
javascript实现放大镜功能
2020/12/09 Javascript
Python最基本的输入输出详解
2015/04/25 Python
详解django自定义中间件处理
2018/11/21 Python
Python使用requests提交HTTP表单的方法
2018/12/26 Python
详解python3 + Scrapy爬虫学习之创建项目
2019/04/12 Python
python自动化测试之异常及日志操作实例分析
2019/11/09 Python
django 链接多个数据库 并使用原生sql实现
2020/03/28 Python
Html5监听手机摇一摇事件的实现
2019/11/07 HTML / CSS
英国钻石公司:British Diamond Company
2020/02/16 全球购物
linux面试题参考答案(10)
2013/11/04 面试题
当当网软件测试笔试题
2015/11/24 面试题
《奇妙的国际互联网》 教学反思
2014/02/25 职场文书
高中班主任评语大全
2014/04/25 职场文书
超市仓管员岗位职责范本
2014/09/18 职场文书
2014年党的群众路线整改措施思想汇报
2014/10/12 职场文书
学生检讨书如何写
2014/10/30 职场文书
教师岗位职责范本
2015/04/02 职场文书
使用python创建股票的时间序列可视化分析
2022/03/03 Python
如何通过cmd 连接阿里云服务器
2022/04/18 Servers