我有一个使用Apache(和PHP)的网站,用户可以在其中上传内容(例如图像)。 Apache根目录为/project/www/
,上传的数据保存到/project/data/
中(有关信息,php类位于/project/php/
中。)
因此,我有一个指向/project/www/resources/data/
的符号链接/project/data/
,允许通过网络访问上载的内容。
我在PHP上传脚本中确实有一些限制(它仅允许jpg / gif / png,并且在将其保存到/project/data/
目录之前始终将其转换为png文件,并使用服务器定义的名称,例如{{ 1}})。
我还使用player-ID-random8hexabytes.png
规则限制了所提供的网址:
/project/www/.htaccess
但是我想确保# User can upload images, turned into PNG, in /data/player/...png
RewriteCond %{REQUEST_FILENAME} -f
RewriteRule ^resources/data/avatars/[a-z0-9-]+\.png$ - [E=IS_RESOURCE:yes]
#[...]
RewriteCond %{ENV:IS_RESOURCE} =yes
RewriteRule ^ - [END]
# Let /project/www/request.php file PHP handle all the rest
RewriteRule ^ request.php [END]
目录中的内容永远不会被Apache解释,因此,如果某种方式,一个PHP文件最终出现在该数据目录中,它将不会被执行,只会被执行。充当八位字节流(因此,即使仅是HTML,也不会打开XSS攻击)。如果是我不知道的HTML,XML或cgi脚本引擎,则相同(这是托管的Web托管,因此,Perl或类似的其他内容也可能处于活动状态,我不知道)
用不同的措词,也许我可以将Apache可以“直接”执行的PHP脚本列入白名单,所以我只允许执行data
并禁用其他所有内容(包括Perl,其他PHP脚本等)。
我不确定是否会带来比我已经拥有的更多的安全性...但是听起来也有这样的限制。