我知道黄金法则,永远不要相信用户提供的文件名。 不过我想打破这个规则。 以下方案有什么不安全的地方吗?
$name = $_POST['name'];
$id = intval($_GET['id']);
$sanitized_name = preg_replace('/[^0-9a-zA-Z]/','',$name);
$fp = fopen("/path/to/".$id."/".$sanitized_name.".jpg",'w');
如果我用"替换所有不是 0-9 或 a-z 或 A-Z 的东西,那么绝对有 0% 的变化,任何人都可以注入一个 '." 来创建自己的扩展名(使用 NULL 字节的组合(或遍历目录。 这似乎很安全。 我只是想通过SO运行它。
此外,由于 ID 被迫为 int,任何时髦的东西都会变成 0。
如果您所说的安全是指用户无法在另一个文件夹或其他扩展名中强制上传,是的,这很好。
此外,为了使文件名"更唯一",您可以在文件名中添加时间戳time()
和/或rand(0, MAX)
的随机数。