XOOPS中实现FORM TOKEN [技术论坛 - XOOPS综合讨论区] imag1

正在浏览:   1 名游客






XOOPS中实现FORM TOKEN
初级会员
注册日期:
2/6 11:32
所属群组:
注册会员
帖子: 24 | 精华: 1
等级: 3; EXP: 62
HP: 0 / 65
MP: 8 / 26
离线
转载自CMSGP [Http://www.cmsgp.org ]
在XOOPS中,为了防止通过恶意提交内容来攻击网站,在form中插入了一个隐藏的参数form_token。每次用户提交内容是,XOOPS都会对 form_token进行验证,当验证失败,或者form_token超时时就会使这次提交无效。Form_token主要的工作原理是:
1. 生成一个token并输出到html form中;
2. 验证用户提交的form中的token参数;
在XOOPS中,所有的与token有关的代码都定义在class/xoopsecurity.php中。

生成一个token
1. 设置一个token有效期
要生成一个form token, 首先要确定一个token的有效时间;在XOOPS中,默认的token有效时间为sesson.gc_maxlifetime;如果maxlifetime等于0时,默认的有效时间为900秒。
2. 建立token id,通过md5散列一个随机数;
3. 将token数据保存在session中
4. 通过已知的token id利用md5散列出token。


function createToken($timeout 0$name 'XOOPS_TOKEN')
    {
        global 
$config$user;
        if (
$timeout == 0) {
            
$expire = @ini_get('session.gc_maxlifetime');
            
$timeout = ($expire 0) ? $expire 900;
        }
        
        
$expire_date time() + intval($timeout);
        
$token_sid = ($user->data['user_id'] == ANONYMOUS && !empty($config['form_token_sid_guests'])) ? $user->session_id '';
        
$token $expire_date.'_'.sha1($expire_date $user->data['user_form_salt'] . $name $token_sid);
        return 
$token;
    }


Token验证
1. 检查保存token的session变量XOOPS_TOKEN_SESSION是否存在。
2. 循环$_SESSION[‘XOOPS_TOKEN_SESSION’]找到对应的token
3. 检查对应的token是否已经过期。

function validateToken($token false$clearIfValid true$name 'XOOPS_TOKEN')
    {
        global 
$xoopsLogger$config$user;
        
$token = ($token !== false) ? $token : ( isset($_REQUEST[$name '_REQUEST']) ? $_REQUEST[$name '_REQUEST'] : '' );
        if(empty(
$token)) {
            
$xoopsLogger->addExtra('Token Validation''No valid token found in request/session');
            return 
false;
        }
        
        list(
$expire_date$token_key) = explode("_"$token);
        if(isset(
$expire_date) && isset($token_key)) {
            if(
intval($expire_date) > time()) {
                
$token_sid = ($user->data['user_id'] == ANONYMOUS && !empty($config['form_token_sid_guests'])) ? $user->session_id '';
                
$key sha1($expire_date $user->data['user_form_salt'] . $name $token_sid);
                if (
$key === $token_key)
                {
                    return 
true;
                }
            }
        } else {
            
$xoopsLogger->addExtra('Token Validation''invalid token:'.$token);
            return 
false;
        }
        
        
$xoopsLogger->addExtra('Token Validation''valid token ('.$token.') failed');
        return 
false;
    }

3/20 15:28
_________________
XOOPS学习研究 www.cmsgp.org
QQ群:6070014
工具箱 短消息 Email PDF 书签 打印 举报 回顶部


与PHPBB的FORM TOKEN的对比
初级会员
注册日期:
2/6 11:32
所属群组:
注册会员
帖子: 24 | 精华: 1
等级: 3; EXP: 62
HP: 0 / 65
MP: 8 / 26
离线
PHPBB中的form token工作原理与XOOPS有一点不同。PHPBB中的并不需要使用session来保存token数据。而是通过将token生成时间追加到 form的隐藏数据中。所有和token有关的函数都定义在includes/functions.php的add_form_key()和 check_form_key()函数中;

生成token
PHPBB中生成token的代码如下:
$token = sha1($now . $user->data['user_form_salt'] . $form_name . $token_sid);
$now是当前时间,’user_form_salt’是用户的一个随机标示,$form_name和$token_sid都是可选的;当产生了token以后,PHPBB会把token和now (当前时间)一起添加到form中,等到用户提交form以后使用。

Token验证
PHPBB中的Token验证比较简单。就是把从用户提交的form中的token和expired date进行验证,如果token验证成功,并且expired date时间没有超时,那么这个form就通过验证了。


function add_form_key($form_name)
{
    global 
$config$template$user;
    
$now time();
    
$token_sid = ($user->data['user_id'] == ANONYMOUS && !empty($config['form_token_sid_guests'])) ? $user->session_id '';
    
$token sha1($now $user->data['user_form_salt'] . $form_name $token_sid);

    
$s_fields build_hidden_fields(array(
            
'creation_time' => $now,
            
'form_token'    => $token,
    ));
    
$template->assign_vars(array(
            
'S_FORM_TOKEN'    => $s_fields,
    ));
}

转载自[http://www.cmsgp.org/article/20.html]

3/21 13:50
_________________
XOOPS学习研究 www.cmsgp.org
QQ群:6070014
工具箱 短消息 Email PDF 书签 打印 举报 回顶部





不可查看帖子。
不可发帖。
不可回复。
不可编辑自己的帖子。
不可删除自己的帖子。
不可发起投票调查。
不可在投票调查中投票。
不可上传附件。
不可不经审核直接发帖。
不可使用主题类别。
不可以使用HTML语法。
不可以使用签名档。

[高级搜索]