如何拒绝所有子目录中的shell执行?

我希望nginx拒绝那些在/ webroot / uploads里面有文件夹的用户

例如

/webroot/uploads/user1 /webroot/uploads/user2 /webroot/uploads/user1000 

执行任何shell(php,pl,exe)。

shell通常隐藏在jpg或gif文件中。 像badfile.php.jpg一样

我也看到茂盛的二进制文件被上传到文件夹。

这里我的初步规则是:

 location ~ /webroot/uploads/(.+)\.php$ { deny all; } location ~ /webroot/uploads/(.+)\.pl$ { deny all; } 

但我不确定它是否健壮。 所以我感谢你的帮助。

如果你想绝对确保在/ webroot / uploads或下面的任何地方执行任何操作,我会build议在文件系统级别阻止执行。 为/ webroot / uploads创build一个文件系统,并使用“noexec”选项安装它:

 mount -t ext4 -o 'noexec,rw' /dev/<device-name> /webroot/uploads/ 

注意:如果您使用的是受pipe服务器,或者没有可用的存储来configuration文件系统,则可以将其挂载到回送设备上:

警告:在运行以下命令之前,请备份/ webroot / uploads并将文件移动到临时位置。

  1. 返回下一个可用的循环设备 – 将是/ dev / loop [0-8]之一

     sudo losetup -f 
  2. 创build一个图像作为文件系统 – 这会在/ opt中创build一个1GB的文件

     sudo dd if=/dev/zero of=/opt/uploads_fs.img bs=1M count=1024 
  3. configuration第一个命令返回的环回设备以使用新文件

     losetup /dev/loop0 /opt/uploads_fs.img 
  4. 创build一个文件系统

     mkfs.ext4 -m 1 -v /dev/loop0 
  5. 挂载/ webroot /在没有设置noexec的新设备上上传

     mount -t ext4 -o 'noexec,rw' /dev/loop0 /webroot/uploads/ 

此时 ,将文件恢复到以前的位置。 即使是root用户,也不能在该文件系统上执行文件:

 [root@localhost testfs]# ll myscript* -rwxrwxrwx. 1 root root 41 Jan 21 19:20 myscript.sh [root@localhost testfs]# ./myscript.sh -bash: ./myscript.sh: Permission denied [root@localhost testfs]# 

这个怎么样?

 location ~ /webroot/uploads/.*\.(php|pl|rb|sh)$ { deny all; } 

默认情况下,nginx不会将文件传递给parsing器或执行它们。 它只会为他们服务。 拒绝规则只有在您已经configuration了nginx来将php / pl / rb文件传递给parsing或执行它们的东西时才是必须的。