php令牌匹配不起作用
我正在做表单验证程序(使用令牌)。 页面基于smarty。因此,在课堂文章中,我有以下功能: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
公共静态函数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然后你就让自己对被恶意参与者截获和使用的令牌敞开了大门。如果令牌可以被截获,那么拥有多个令牌并不能保护任何东西:一旦一个令牌被盗,它就可以很快被使用。(合法用户的请求将失败)。因此,您的建议无法解决此问题。