background image

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

) {