3

我知道黄金法则,永远不要相信用户提供的文件名。不过我想打破这个规则。以下方案有什么不安全的地方吗?

   $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或az或AZ的所有内容,那么任何人都可以注入'。创建自己的扩展名(使用 NULL 字节的组合)或遍历目录。这似乎很安全。我只是想由 SO 运行它。

此外,由于 ID 被强制为 int,任何时髦的东西都会简单地变成 0。

4

1 回答 1

0

如果通过安全您的意思是用户不能强制上传到另一个文件夹或另一个扩展名,是的,这很好。

另外,为了使文件名“更独特”,您可以在文件名中添加时间戳time()和/或随机数rand(0, MAX)

于 2013-10-08T19:29:35.540 回答