我在 URL 上有一个媒体文件夹example.com/media/
,我想拒绝用户在我的服务器中运行脚本。我的服务器应用程序是 nginx,在如何拒绝可写目录内的脚本执行我找不到特定 URL 的任何特殊之处。这是我的 nginx 服务器配置:
# sites-avalaible/default
server {
listen 80;
listen 443 ssl;
server_name www.example.com example.com;
ssl_certificate /var/www/example/ssl/ssl.crt;
ssl_certificate_key /var/www/example/ssl/ssl.key;
location /static {
alias /var/www/example/static;
expires 7d;
add_header Pragma public;
add_header Cache-Control "public, must-revalidate, proxy-revalidate";
}
location /media {
alias /var/www/example/media;
# limit download speed after 5mb download
limit_rate_after 5m;
limit_rate 120k;
limit_req zone=lh burst=5 nodelay;
}
location / {
proxy_pass http://127.0.0.1:8000;
}
}
我想拒绝运行媒体 URL 中的任何可执行文件,用户可以通过该 URL 将文件上传到服务器。我该怎么做?例如,当用户导航到example.com/media/bomb.py
nginx 时,返回 404 错误页面。我还更改了媒体文件夹的执行权限,但我需要对 nginx 执行此操作,以便停止查看脚本文件。
答案1
首先,当 nginx 中没有其他配置时,它只是从文件系统读取文件,然后通过 TCP 连接将其发送到客户端。
因此,就您而言,如果bomb.py
您的媒体目录中有一个,您的用户只会收到该文件,而不会执行该文件。
其次,您的上传脚本应该检查允许上传的文件类型,以确保没有这样的文件可以上传。
最后,回答一下您的实际问题。您可以location
为媒体目录提供更具体的指令,这样只允许处理某些扩展。其他请求则通过location /
指令进行。
location ~* /media/[^\.]+\.(gif|jpg|png)$ {
....
}
/media/
仅当文件名在目录中、至少有一个不在目录中的字符.
并且扩展名为 gif / jpg / png 时,此位置指令才会通过块提供文件。