PHP Token(令牌)设计

时间:2008-03-14 12:54:53  来源:蓝色理想  作者:xling  【背景色 杏仁黄 秋叶褐 胭脂红 芥末绿 天蓝 雪青 灰 银河白

PHP Token(令牌)设计

设计目标:

  1. 避免重复提交数据.
  2. 检查来路,是否是外部提交
  3. 匹配要执行的动作(如果有多个逻辑在同一个页面实现,比如新增,删除,修改放到一个PHP文件里操作)

这里所说的token是在页面显示的时候,写到FORM的一个隐藏表单项(type=hidden).
token不可明文,如果是明文,那就太危险了,所以要采用一定的加密方式.密文要可逆.俺算法很白痴,所以采用了网上一个现成的方法.

如何达到目的:

  1. 怎样避免重复提交?
    在SESSION里要存一个数组,这个数组存放以经成功提交的token.在后台处理时,先判断这个token是否在这个数组里,如果存在,说明是重复提交.
  2. 如何检查来路?
    可选项,这个token在生成的时候,加入了当前的session_id.如果别人copy你的html(token一迸copy),在提交时,理论上token里包含的session_id不等于当前session_id,就可以判断这次提交是外部提交.
  3. 如何匹配要执行的动作?
    在token的时候,要把这个token的动作名称写进这个token里,这样,在处理的时候,把这个动作解出来进行比较就行了.

我以前写的GToken不能达到上面所说的第二条,今天修改了一下,把功能2加上了.个人感觉还行.

请大家看代码,感觉哪里有不合理的地方,还请赐教!谢谢.

加密我是找的网上的一个方法,稍作了一下修改.

GEncrypt.inc.php:

<?php
class GEncrypt extends GSuperclass {
    protected static 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;  
    }
   
    public static function encrypt($txt,$key){  
        //$encrypt_key = md5(rand(0,32000));
        $encrypt_key = md5(((float) date("YmdHis") + rand(10000000000000000,99999999999999999)).rand(100000,999999));
        $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 base64_encode(self::keyED($tmp,$key));
    }
   
    public static function decrypt($txt,$key){
        $txt = self::keyED( base64_decode($txt),$key);  
        $tmp = "";
        for ($i=0;$i<strlen($txt);$i++){  
            $md5 = substr($txt,$i,1);  
            $i++;  
            $tmp.= (substr($txt,$i,1) ^ $md5);  
        }
        return $tmp;
    }   
}
?>


共2页: 上一页 1 [2] 下一页

文章评论

共有 0位网翼网友发表了评论 查看完整内容

24小时热门信息