我知道黄金法则,绝不相信用户提供的文件名。我想打破这个规则。以下方案有什么不安全的地方吗?
$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。
答案 0 :(得分:0)
如果安全,则表示用户无法强制上传到其他文件夹或其他扩展程序,是的,这很好。
Addtionnaly,为了使文件名“更独特”,您可以在文件名中添加时间戳time()
和/或随机数rand(0, MAX)
。