php 中 url 传递中文字符,特殊危险字符的解决方法
本文一览
php 为你介绍结合 php 中的 urldecode,
base64_encode
函数然后再结合自己写的替换
函数来进行安全传递
url 中文字符,特殊危险字符,有需要的朋友可以参考一下
我们需要在
url 中传递中文字符或是其它的 html 等特殊字符,似乎总会有各种乱,不同的
浏览器对他们的编码又不一样,
对于中文,一般的做法是:
把这些文本字符串传给
url 之前,先进行 urlencode(
$text
)一下;
但是对于一些很
“危险”的字符,比如说 html 字符,甚至是 SQL 注入相关的字符,如果很明
显的传给系统,出于安全考虑,系统一般都会把它们过滤掉的。
现在,我们需要这些危险字符,该这么办?
我想到的办法是
先给它们
base64_encode
(
$text
) 编码,到服务端时,又给它们
base64_decode
(
$text
) 解码,
貌似很完美,但是在使用的过程中又遇到一个问题,
base64_encode
编码后的字符串中含有
"/", "+", "=" 等字符,
base64_encode
()函数由于要在 url 中传用户输入观点(少量的内容),当用户提交(post 提交)过
来的是一个数组
.所以我把观点用 bse64_encode()函数给加密.当跳转到处理页面时,我再给
get 接收,这时出现两边加密的数据不对.少了一个+字符.
用户提交加密
:
tPK9tNPNyKUsuse6xyYjNDY7JiM0NjsufMavwcEhfMyrxq/BwcHLLMjDztLO3tPvLNXmz+vI
69ehsKEhfHw=
在处理页面用
get 接收到的:
tPK9tNPNyKUsuse6xyYjNDY7JiM0NjsufMavwcEhfMyrxq/BwcHLLMjDztLO3tPvLNXmz
vI69ehsKEhfHw=
对比找到少了一个加号
,不知道是什么原因导制的(猜想可能是 get 时,+字符可能不能得到
吧
!).还请高手指点.
这些字符在
url 编码中又是特殊字符,比如 "+" ,它就表示 “空格”,但是不同的浏览器对
“空格”的编码又不一样,有的是用“+”表示,有的是用“20%”表示,也就是说,让这些
base64_encode
编码后的字符串在
url 中传递,用不同的浏览器去浏览时,服务端得到值不
一样。
于是乎,想到了一个折中办法,先将这些
base64 编码后的特殊字符替换掉,到服务端后,
又替换回来:
解决方法
:
一
.在用户提交加密串的时间,我把+字符给换成别的字字符.如:
str_replace
('+', '_',
$content
);
二
.在处理页面再次转换一次:如:
str_replace
('_', '+',
$content
);
代码如下
:
function
base_encode(
$str
) {