我正在尝试设置一个用户可以上传文件的Web服务。我遇到的唯一问题是NGINX允许任何用户在对用户进行任何身份验证之前上传文件。我希望只能允许授权用户上传文件。
基本上,我想传递将文件上传到PHP的请求,并使PHP告诉NGINX,该用户确实已登录,现在可以从他那里接收文件。
我正在使用NGINX和PHP。
有什么建议吗?
使用 Nginx 身份验证请求模块
然后在 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;
}
现在,每当客户端请求/upload时,Nginx都会向/auth发出内部子请求,在本例中,在标头中传递客户端IP,但您可以根据需要对其进行配置。
您的 PHP 脚本接收子请求,执行您想要执行的任何身份验证,如果您想允许访问,则返回 HTTP 响应代码 200,如果您不想允许访问,则返回 401。
一个例子:使用 $_SESSION 检查用户是否已登录。 你有任何代码片段吗?因为nginx在cgi/fastcgi下运行,也许是php-fpm,并且可能有不同的设置来引起人们的注意。
if (isset($_SESSION['allowUpload']) {
// OK
} else {
// please login or you are not allowed to upload
}
我认为你在这里有一些误解......
The only problem that I am having is that NGINX lets ANY user upload a file
和make PHP tell NGINX that ...
NGINX"仅"服务于网页,是(从服务器内部(允许用户上传(或不上传(文件的PHP。如果您(和所有人(可以将文件上传到您的服务器,那么您将面临严重的安全风险。这里的要点是限制外部用户将任何文件直接上传到任何文件夹,然后只允许用户通过表单(例如(上传文件(在您决定的文件夹中(。
典型的场景是:
用户使用文件上传表单访问您的网页。他们选择(input type='file'
(一个有效的文件,然后提交表格。表单将文件发送到 PHP 文件(上传.php(,并将此存储发送到您的服务器:
网页 -->表单 -->上传.php -->服务器
您可以执行不同的操作,例如:
- 不要让未登录的用户访问您的
form
(他们无法上传( - 签入
upload.php
用户是否已登录($_SESSION(。这应该始终完成。 - 他们两个(我的建议(
这样,未登录的用户就无法上传到您的服务器,因为: - 没有直接上传权限(ssh,sftp等( - 想要上传文件的用户,必须转到您的表单页面。如果未记录,请将其重定向到登录.php。 - 如果有人尝试直接访问上传.php将检查 $_SESSION 以了解是否被记录。
一个(非常简单的(例子
1 - 网页表单:
<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;
}
}
?>
希望对您有所帮助!