我正在使用 nginx 和 PHP,并希望允许我的用户上传图像并将其放置在公共的网络可访问目录中。
我目前已定义此规则:
location ~ /uploads {
location ~ \.(jpg|gif|png)$ {}
deny all;
}
如果它不是 .jpg、.gif 或 .png,则拒绝访问。
该目录 ( /var/www/public/uploads
) 的权限设置为744
。
但是,我对上传图像的各种漏洞了解不够,无法尝试自己的漏洞利用方法。
理想情况下,我希望确保以 jpg、gif 或 png 结尾的任何内容都被视为相应的 mime 类型,这样任何脚本解释器都不会尝试执行它。
我如何实现这个目标?
答案1
您可以让该目录由应用了“noexec”选项的文件系统支持。这是一种确保其中的任何内容都无法执行的好方法,即使某些东西或某些人设法修改了文件权限。
您可以在 fstab 中创建文件系统后执行此操作(不是实际的行;更新以满足您自己的需要):
/dev/mapper/dedicated-filesystem /var/www/public/uploads ext4 noexec,nosuid 0 0
或者,(尽管可能不太确定)您可以使用默认 ACL 使在该目录中创建的所有文件都从父目录中继承权限。您可以通过这种方式对所有文件强制执行 644 权限。但这并不能阻止某些人在创建后更改这些权限。