首先使用NGINX和PHP +用户授权上传文件



我正在尝试设置一个用户可以上传文件的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 filemake 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;
}
}
?>

希望对您有所帮助!

最新更新