Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/249.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
php令牌匹配不起作用_Php_Smarty_Token - Fatal编程技术网

php令牌匹配不起作用

php令牌匹配不起作用,php,smarty,token,Php,Smarty,Token,我正在做表单验证程序(使用令牌)。 页面基于smarty。因此,在课堂文章中,我有以下功能: 公共静态函数getToken(){ self::$token=md5(uniqid(rand(),TRUE)); $\会话['token']=self::$token; }对于用户,CSRF令牌无需按1:1进行映射。如果一个页面上有多个表单怎么办?如果用户打开了多个浏览器窗口,该怎么办 定义要存储0..n令牌的内容,对它们设置合理的短有效期,并[可选地]定义它们的有效用途。例如: class Toke

我正在做表单验证程序(使用令牌)。 页面基于smarty。因此,在课堂文章中,我有以下功能:

公共静态函数getToken(){
self::$token=md5(uniqid(rand(),TRUE));
$\会话['token']=self::$token;

}
对于用户,CSRF令牌无需按1:1进行映射。如果一个页面上有多个表单怎么办?如果用户打开了多个浏览器窗口,该怎么办

定义要存储
0..n
令牌的内容,对它们设置合理的短有效期,并[可选地]定义它们的有效用途。例如:

class Token {
    protected $id, $expiry;

    public function __construct($expiry=300, $id=NULL) {
        $this->expiry = time() + $expiry;
        if( is_null($id) ) {
            // actual secure ID generation.
            $this->id = bin2hex(random_bytes(32));
        } else {
            $this->id = $id;
        }
    }

    public function getID() {
        return $id;
    }

    public function isValid() {
        return time() < $expiry;
    }
}

class YourApp {
    public function newToken() {
        $token = new Token();
        $_SESSION['tokens'][$token->getID()] = $token;
        return $token
    }

    public function checkToken($token_id) {
        if( key_exists($token_id, $_SESSION['tokens']) ) {
            $cur = $_SESSION['tokens'][$token_id];
            unset($_SESSION['tokens'][$token_id]; // single use only!
            return $cur->isValid();
        } else {
            return false;
        }
    }

    public function flushOldTokens() {
        $_SESSION['tokens'] = array_filter(
            $_SESSION['tokens'],
            function($t){return $t->isValid();}
        );
    }
}
类令牌{
受保护$id,$expiration;
公共函数构造($expiry=300,$id=NULL){
$this->expiry=time()+$expiry;
如果(为空($id)){
//实际安全ID生成。
$this->id=bin2hex(随机字节(32));
}否则{
$this->id=$id;
}
}
公共函数getID(){
返回$id;
}
公共函数isValid(){
返回时间()<$到期;
}
}
给你的应用程序分类{
公共职能部门{
$token=新令牌();
$\会话['tokens'][$token->getID()]=$token;
返回$token
}
公共函数checkToken($token\u id){
如果(密钥存在($token\u id,$\u会话['tokens'])){
$cur=$\会话['tokens'][$token\u id];
取消设置($\u会话['tokens'][$token\u id];//仅限一次性使用!
返回$cur->isValid();
}否则{
返回false;
}
}
公共函数flushOldTokens(){
$\u会话['tokens']=数组\u筛选器(
$\u会话['tokens'],
函数($t){return$t->isValid();}
);
}
}

为什么它们应该是相同的?在第二次请求时,
getToken
生成新的令牌并在会话中重写一个令牌,这当然与第一次不同one@Lashane,请您再详细说明一下。我不明白第二个请求是什么。我只调用了一次函数。当您发布表单时,这是第二个请求st,您肯定会第二次调用getToken。您能提出一些建议吗?我对此很陌生。@Benua如果在第二次请求时生成新令牌,请使用一个简单的条件:
if(empty($\u SESSION['token']){getToken()}
“如果页面上有多个表单怎么办?”---那么,那又怎样?拥有一个非过期且非一次性使用的csrf令牌有什么不对?@zerkms然后你就让自己对被恶意参与者截获和使用的令牌敞开了大门。如果令牌可以被截获,那么拥有多个令牌并不能保护任何东西:一旦一个令牌被盗,它就可以很快被使用。(合法用户的请求将失败)。因此,您的建议无法解决此问题。