我正在尝试建立一个用户可以上传文件的Web服务。我唯一遇到的问题是,NGINX允许任何用户在对用户进行任何身份验证之前上传文件。我希望只允许授权用户上传文件。
基本上,我想传递将文件上传到PHP的请求,并使PHP告诉NGINX该用户确实已经登录,现在可以从他那里接收文件了。
我正在使用NGINX和PHP。
有什么建议吗?
答案 0 :(得分:3)
使用Nginx auth request module
然后在Nginx中设置如下指令:
location /upload/ {
auth_request /auth;
...
}
location = /auth {
proxy_pass ...
proxy_pass_request_body off;
proxy_set_header Content-Length "";
proxy_set_header X-Real-Ip $remote_addr;
}
现在,每当客户端请求/ uploads时,Nginx都会向/ auth发出内部子请求,在此示例中,将客户端IP传递到标头中,但是您可以根据自己的需要进行配置。
您的PHP脚本收到子请求,执行您想执行的身份验证,如果要允许访问,则返回HTTP响应代码200,否则,则返回401。
答案 1 :(得分:1)
一个例子:使用$ _SESSION检查用户是否登录。 你有代码片段吗?因为nginx可能在cgi / fastcgi下运行,可能是php-fpm,并且可能有不同的设置来引起注意。
if (isset($_SESSION['allowUpload']) {
// OK
} else {
// please login or you are not allowed to upload
}
答案 2 :(得分:1)
我认为您在这里有一些误解……
The only problem that I am having is that NGINX lets ANY user upload a file
和make PHP tell NGINX that ...
NGINX “仅”服务网页,是 PHP (允许从服务器内部)允许用户上传(或不上传)文件的 PHP 。如果您(和所有人)可以将文件上传到您的服务器,则存在严重的安全风险。这里的主要要点是限制外部用户直接将任何文件上传到任何文件夹,然后,仅允许用户通过表单(例如)上传文件(在您确定的文件夹中)。
典型的情况是:
用户使用文件上传表单访问您的网页。他们选择(input type='file'
)有效文件,然后提交表单。表单将文件发送到PHP文件(upload.php),并将此存储发送到您的服务器:
网页->表单-> upload.php->服务器
您可以做不同的事情,例如:
form
(他们无法上传)upload.php
是否已登录用户($ _SESSION)。应该总是这样做。这样,未登录的用户将无法上载到您的服务器,因为: -没有直接上传权限(ssh,sftp等) -想要上传文件的用户,必须转到您的表单页面。如果未记录,请将其重定向到LOGIN.php。 -如果有人尝试直接访问upload.php,将使用$ _SESSION进行检查,以了解是否已记录。
一个非常简单的例子
1-HTML表单:
<form action="upload.php" method="post" enctype="multipart/form-data">
Select image to upload:
<input type="file" name="fileToUpload" id="fileToUpload">
<input type="submit" value="Upload Image" name="submit">
</form>
2-上传文件:
<?php
if(!User->isLogged()){ // or $_SESSION
return false; //or header('Location: login.php')
}
$target_dir = "uploads/";
$target_file = $target_dir . basename($_FILES["fileToUpload"]["name"]);
$uploadOk = 1;
$imageFileType = strtolower(pathinfo($target_file,PATHINFO_EXTENSION));
// Check if image file is a actual image or fake image
if(isset($_POST["submit"])) {
$check = getimagesize($_FILES["fileToUpload"]["tmp_name"]);
if($check !== false) {
echo "File is an image - " . $check["mime"] . ".";
$uploadOk = 1;
} else {
echo "File is not an image.";
$uploadOk = 0;
}
}
?>
希望有帮助!