大家在使用PHP进行GET或POST提交数据时,经常会在URL带着参数进行传递,比如www.mdaima.com/get.php?id=1&page=5,这里就将id编号和page页码进行了参数传递,如果这样直接明文传输,会将参数直接暴露给用户,要是是比较重要的数据这样传输我觉得还是不太安全。那如果将参数变成下面这样,是不是会好点呢?
1
|
www.mdaima.com/get.php?VGsAYQ96VzkEaF08DTxTLQIyDmsBIQtnVj0Fe1ciAD0EN1M0X2MHMQYxDDcAOwI%2FXToBPVM5ADxfag%3D%3D
|
我们再加强一下,将get.php重命名改为get_mb.php,然后利用静态规则,把get.html映射到get_mb.php,这样即使用户试着访问get.php也无法找到真实的PHP文件了,因为真实的PHP文件不是get.php而是get_mb.php,以下是.htaccess规则设置?
1
|
RewriteRule ^get.html$ get_mb.php?&%{QUERY_STRING} #.htaccess伪静态规则的设置(加入到.htaccess里就行)
|
利用加密再配合伪静态设置,最终效果就是下面这样了,即隐藏了真实php文件get_mb.php又将参数都加密传输了。
1
|
www.mdaima.com/get.html?VGsAYQ96VzkEaF08DTxTLQIyDmsBIQtnVj0Fe1ciAD0EN1M0X2MHMQYxDDcAOwI%2FXToBPVM5ADxfag%3D%3D
|
相比之下已经好一些了吧,至少看上去会好很多,那如何进行加密和解密呢?请看下面函数(不用细看,直接拿过去用就行了,重点看如果调用)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
|
//---------------以下为加密函数(复制过去就行了)-----------------
function
keyED(
$txt
,
$encrypt_key
){
$encrypt_key
= md5(
$encrypt_key
);
$ctr
=0;
$tmp
=
""
;
for
(
$i
=0;
$i
<
strlen
(
$txt
);
$i
++)
{
if
(
$ctr
==
strlen
(
$encrypt_key
))
$ctr
=0;
$tmp
.=
substr
(
$txt
,
$i
,1) ^
substr
(
$encrypt_key
,
$ctr
,1);
$ctr
++;
}
return
$tmp
;
}
function
encrypt(
$txt
,
$key
) {
$encrypt_key
= md5(mt_rand(0,100));
$ctr
=0;
$tmp
=
""
;
for
(
$i
=0;
$i
<
strlen
(
$txt
);
$i
++)
{
if
(
$ctr
==
strlen
(
$encrypt_key
))
$ctr
=0;
$tmp
.=
substr
(
$encrypt_key
,
$ctr
,1) . (
substr
(
$txt
,
$i
,1) ^
substr
(
$encrypt_key
,
$ctr
,1));
$ctr
++;
}
return
keyED(
$tmp
,
$key
);
}
function
decrypt(
$txt
,
$key
){
$txt
= keyED(
$txt
,
$key
);
$tmp
=
""
;
for
(
$i
=0;
$i
<
strlen
(
$txt
);
$i
++)
{
$md5
=
substr
(
$txt
,
$i
,1);
$i
++;
$tmp
.= (
substr
(
$txt
,
$i
,1) ^
$md5
);
}
return
$tmp
;
}
function
encrypt_url(
$url
,
$key
){
return
rawurlencode(
base64_encode
(encrypt(
$url
,
$key
)));
}
function
decrypt_url(
$url
,
$key
){
return
decrypt(
base64_decode
(rawurldecode(
$url
)),
$key
);
}
function
geturl(
$str
,
$key
){
$str
= decrypt_url(
$str
,
$key
);
$url_array
=
explode
(
'&'
,
$str
);
if
(
is_array
(
$url_array
))
{
foreach
(
$url_array
as
$var
)
{
$var_array
=
explode
(
"="
,
$var
);
$vars
[
$var_array
[0]]=
$var_array
[1];
}
}
return
$vars
;
}
$key_url_md_5
=
'mdaima.com-123-scc'
;
//可以更换为其它的加密标记,可以自由发挥
//---------------以上为加密函数-结束(复制过去就行了)-----------------
|
以上这个是关键的加密与解密函数,下面看一下如何调用,我们举例说一下将表单action中参数id和page进行加密并加入时间戳一起,这样每次的链接地址都是动态的,而且可以在接收页面设置页面限制超时的有效期了。
1
|
<form id=
"form1"
name=
"form1"
method=
"post"
action=
"?<?=encrypt_url("
id=1&page=5
"."
&time=
".time(),$key_url_md_5)?>"
enctype=
"multipart/form-data"
>
|
上面就是如何加密参数。再看一下如何解密接收到的参数:
1
2
3
4
|
$url_info
= geturl(
$_SERVER
[QUERY_STRING],
$key_url_md_5
);
//接收所有参数
$page
=
$url_info
[
'page'
];
//解密对应参数
$id
=
$url_info
[
'id'
];
$time
=
$url_info
[
'time'
];
//这个是时间戳,大家可以利用这个参数判断一下链接生成的时间,就可以判断是否超时了(此项如果不需要也可以忽略)
|
这样我们就得到了解密的$page和$id参数了,大家试一下吧,有问题也可以联系我!