background image

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

 

表示这个随机串的有效时间。

 

应用示例
构造表单