php 安全:添加随机字符串验证,防止伪造跨站请求
伪造跨站请求比较难以防范,而且危害巨大,攻击者可以通过这种方式恶作剧,发 spam
信息,删除数据等等。那怎么防范伪造跨站攻击呢
yahoo 对付伪造跨站请求的办法是在表单里加入一个叫.crumb 的随机串;而 facebook 也有
类似的解决办法,它的表单里常常会有 post_form_id 和 fb_dtsg
。
比较常见而且也很廉价的防范手段是在所有可能涉及用户写操作的表单中加入一个随机
且变换频繁的字符串,然后在处理表单的时候对这个字符串进行检查。这个随机字符串如
果和当前用户身份相关联的话,那么攻击者伪造请求会比较麻烦。现在防范方法基本上都
是基于这种方法的了
随机串代码实现
咱们按照这个思路,山寨一个 crumb
的实现,代码如下:
代码如下:
<?php
class
Crumb {
CONST SALT = "your-secret-salt";
static
$ttl
= 7200;
static
public
function
challenge(
$data
) {
return
hash_hmac('md5',
$data
, self::SALT);
}
static
public
function
issueCrumb(
$uid
,
$action
= -1) {
$i
=
ceil
(time() / self::
$ttl
);
return
substr
(self::challenge(
$i
.
$action
.
$uid
), -12, 10);
}
static
public
function
verifyCrumb(
$uid
,
$crumb
,
$action
= -1) {
$i
=
ceil
(time() / self::
$ttl
);
if
(
substr
(self::challenge(
$i
.
$action
.
$uid
), -12, 10) ==
$crumb
||
substr
(self::challenge((
$i
- 1) .
$action
.
$uid
), -12, 10) ==
$crumb
)
return
true;
return
false;
}
}
代码中的
$uid
表示用户唯一标识,而
$ttl
表示这个随机串的有效时间。
应用示例
构造表单