All articles(网络文学目录) All Pictures(图片目录) All Softwares(软件目录)

 
PHP Token(令牌)设计_[PHP教程]

Writer: 归海一刀 Article type: Programming skills(编程技巧) Time: 2014/2/17 7:13:19 Browse times: 338 Comment times: 0

PHP Token(令牌)设计_[PHP教程]


Head photo

Go homepage
Upload pictures
Write articles

PHP Token(令牌)设计_[PHP教程]

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:

class GEncrypt extends GSuperclass {
protected static function keyED(txt,encrypt_key){
encrypt_key = md5(encrypt_key);
ctr=0;
tmp = "";
for (i=0;iif (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;iif (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;imd5 = substr(txt,i,1);
i++;
tmp.= (substr(txt,i,1) ^ md5);
}
return tmp;
}
}
?>





There are 0 records,
Comment:
Must be registered users to comment(必须是注册用户才能发表评论)

Disclaimer Privacy Policy About us Site Map
Copyright ©2011-
uuhomepage.com, Inc. All rights reserved.