【问题标题】:PHP | prevent CSRF attacksPHP |防止 CSRF 攻击
【发布时间】:2022-02-11 16:41:15
【问题描述】:
我非常清楚防止篡改表单是不可能的。
但我想问一下,通过实现这个函数,该函数在托管表单的页面中生成一个随机数并在隐藏的输入字段中回显它
function makeRandomString($bits = 256) {
$bytes = ceil($bits / 8);
$return = '';
for ($i = 0; $i < $bytes; $i++) {
$return .= chr(mt_rand(0, 255));
}
return $return;
}
如果在提交时,我通过查询检查了该代码是否已存在于之前创建的 random_codes 表中,如果存在,则阻止所有内容,如果不存在,则将其插入并执行查询.
这是一件好事吗?
【问题讨论】:
标签:
php
security
csrf
nonce
【解决方案1】:
您不应该创建您的自定义实现,几乎每种语言和框架都已经有针对此问题的众所周知的解决方案。
您的方法存在一些明显的问题:
-
mt_rand() 不是加密随机的,不应用于此目的
- 如果您将生成的值存储在一个表中,攻击者可以将自己的值存储到同一个表中并在受害用户会话的上下文中使用它,除非这些值也与实际用户相关联
- 这将需要单独的数据库查找来每次检查此令牌(而不是将其存储在会话中)
- 您没有提到使这些值无效,它们是一次性使用并在收到时删除吗?这将是一场用户体验灾难,尤其是对于大量使用 javascript 的应用程序,并且也是一个潜在的竞争条件
- 生成的某些字符将无法打印,这可能会导致隐藏字段出现问题
- (如果
$bits参数不能被8整除,就会产生更多的位,非常反直觉)
- 等等……
仅使用已知的良好实现要容易得多,自行开发比您想象的要复杂。