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

时间:2018-06-20 22:05:27

标签: php nginx

我正在尝试建立一个用户可以上传文件的Web服务。我唯一遇到的问题是,NGINX允许任何用户在对用户进行任何身份验证之前上传文件。我希望只允许授权用户上传文件。

基本上,我想传递将文件上传到PHP的请求,并使PHP告诉NGINX该用户确实已经登录,现在可以从他那里接收文件了。

我正在使用NGINX和PHP。

有什么建议吗?

3 个答案:

答案 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 filemake 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;
    }
}
?>

希望有帮助!