首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PHP防止CSRF攻击

PHP防止CSRF攻击
EN

Stack Overflow用户
提问于 2021-09-24 10:48:55
回答 1查看 127关注 0票数 0

我正在提高软件的安全性。

如标题所述,目标是防止CSRF攻击。

在涉及必须管理控制面板的用户使用后端的场景中,让我们以一个示例为例,即用户必须初始化从数据库中删除数据的命令,很明显,如果使用该命令:

代码语言:javascript
复制
<a href="delete_post.php?post=003">Delete Post</a>

这将是一次宣布的自杀。

通过阅读PHP文档(https://www.php.net/manual/en/function.random-bytes.php)

我发现这个让我很感兴趣,但也让我问了很多问题。

如果您在其中实现代码:

代码语言:javascript
复制
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";

我们会得到这样一种东西,每次刷新页面时,它都会改变:

代码语言:javascript
复制
13356ac7fc5e058b61bbad693d84ca2e1d9ae584db356dfa928098800d46ed6d F0ToG948CsaUF2wGDSdt.DuyUMKY1VC/liEAyjTB6ME=

这很好..。

但是:

如果您选择了在db中存储代码的方式,并检查生成的代码是否是新的,并且从未使用过,那么我将验证查询语句以消除该语句,谁会保证,意图不良的用户无法生成可能从未使用过的108个字符的代码??。

  • ,所以一个唯一的时间代码的解决方案会更好?

如何解决这个问题?

EN

回答 1

Stack Overflow用户

发布于 2021-09-24 11:21:57

关于你的问题:

如果选择在db (.)中存储代码的方式,则为

为什么要将代码存储在数据库中?将它们存储在用户会话中。您可以为整个会话提供一个反CSRF令牌,这样可以简化令牌的处理。

,谁能向我保证,一个用心不好的用户不可能产生同样的108个字符的代码,也许它从未被使用过?

数学。32字节随机变量的熵为256位。128位将足以防止一次成功的蛮力攻击,这是远远超过这一点。

这样一个独特的时间代码解决方案会更好吗?

不是的。你已经拥有了你所需要的一切。你也不需要盐来做记号。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69313736

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档