我正在提高软件的安全性。
如标题所述,目标是防止CSRF攻击。
在涉及必须管理控制面板的用户使用后端的场景中,让我们以一个示例为例,即用户必须初始化从数据库中删除数据的命令,很明显,如果使用该命令:
<a href="delete_post.php?post=003">Delete Post</a>这将是一次宣布的自杀。
通过阅读PHP文档(https://www.php.net/manual/en/function.random-bytes.php)
我发现这个让我很感兴趣,但也让我问了很多问题。
如果您在其中实现代码:
function RandomToken($length = 32){
if(!isset($length) || intval($length) <= 8 ){
$length = 32;
}
if (function_exists('random_bytes')) {
return bin2hex(random_bytes($length));
}
if (function_exists('mcrypt_create_iv')) {
return bin2hex(mcrypt_create_iv($length, MCRYPT_DEV_URANDOM));
}
if (function_exists('openssl_random_pseudo_bytes')) {
return bin2hex(openssl_random_pseudo_bytes($length));
}
}
function Salt(){
return substr(strtr(base64_encode(hex2bin(RandomToken(32))), '+', '.'), 0, 44);
}
$token = (RandomToken())."\n".Salt()."\n";我们会得到这样一种东西,每次刷新页面时,它都会改变:
13356ac7fc5e058b61bbad693d84ca2e1d9ae584db356dfa928098800d46ed6d F0ToG948CsaUF2wGDSdt.DuyUMKY1VC/liEAyjTB6ME=这很好..。
但是:
如果您选择了在db中存储代码的方式,并检查生成的代码是否是新的,并且从未使用过,那么我将验证查询语句以消除该语句,谁会保证,意图不良的用户无法生成可能从未使用过的108个字符的代码??。
如何解决这个问题?
发布于 2021-09-24 11:21:57
关于你的问题:
如果选择在db (.)中存储代码的方式,则为
。
为什么要将代码存储在数据库中?将它们存储在用户会话中。您可以为整个会话提供一个反CSRF令牌,这样可以简化令牌的处理。
,谁能向我保证,一个用心不好的用户不可能产生同样的108个字符的代码,也许它从未被使用过?
数学。32字节随机变量的熵为256位。128位将足以防止一次成功的蛮力攻击,这是远远超过这一点。
这样一个独特的时间代码解决方案会更好吗?
不是的。你已经拥有了你所需要的一切。你也不需要盐来做记号。
https://stackoverflow.com/questions/69313736
复制相似问题