csrf攻防方式浅谈

1,csrf的攻击步奏大概是:(1)可信任的用户访问a网站。(2)此用户同时(没有退出登录的情况下)访问b网站,b网站向a网站发出一个请求。

2,csrf攻击的预防办法主要是(1)验证referer。(2)自定义header,验证header。(3)token验证。

但是以上防止csrf的方法都是有缺陷的,本文阐述用“一次性令牌”的方式防止csrf攻击,代码如下:

<?php

//生成token

function genToken(){
    $hash = md5(uniqid(rand(), true));
    $n = rand(1, 24);
    $token = substr($hash, $n, 8);
    return $token;
}
//删除已存在的session,并用重新创建token的session
function genStoken(){
    $token = genToken();
    destroyStoken();
    //session_register('csrfToken');
    $_SESSION['csrfToken'] = $token;
}

//删除已存在session
function destroyStoken(){
    if(!empty($_SESSION['csrfToken'])){
        unset($_SESSION['csrfToken']);
        session_destroy();
    }
}

//输入页面的隐藏表单(隐藏token)
function gen_input(){
    genStoken();
    echo "<input type='hidden'  name='FTOKEN_NAME'  value='".$_SESSION[csrfToken]."'>";
}

//判断token是否存在

function isStoken(){
    if(!empty($_SESSION[csrfToken])){
        return true;
    }else{
        return false;
    }
}

//检查token,其中FTOKEN_NAME是生成的token,原理就是拿token值和session中存放的token比较是否相同

function token_check(){
    if(isStoken($_SESSION[csrfToken])) {
        if(isset($_REQUEST[FTOKEN_NAME])) {
            if($_REQUEST[FTOKEN_NAME] != $_SESSION[csrfToken]) {
                gen_error(1);
                destroyStoken();
                 exit();
            } else {
                destroyStoken();
            }
        } else {
            gen_error(2);
            destroyStoken();
            exit();
        }
    } else {
        gen_error(3);
        destroyStoken();
        exit();
    }
}
?>

注:伪随机数会存在一定的危险性,如果在php5.3以上版本中,若是支持openSSL扩展,可以使用openssl_random_pseudo_bytes()函数

参考网站:http://www.hanguofeng.com/archives/security/preventing-csrf/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值