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