Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/235.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
首先使用NGINX和PHP+用户授权上传文件_Php_Nginx - Fatal编程技术网

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

首先使用NGINX和PHP+用户授权上传文件,php,nginx,Php,Nginx,我正在尝试建立一个网络服务,用户可以上传文件。我遇到的唯一问题是,NGINX允许任何用户在对用户进行任何身份验证之前上载文件。我想只能让授权用户上传文件 基本上,我想把上传文件的请求传递给PHP,让PHP告诉NGINX这个用户确实已经登录了,现在可以从他那里接收文件了 我正在使用NGINX和PHP 有什么建议吗?一个例子:使用$\u会话检查用户是否登录。 你有代码片段吗?因为nginx在cgi/fastcgi下运行,可能是php-fpm,可能有不同的设置来引起注意 if (isset($_SES

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

基本上,我想把上传文件的请求传递给PHP,让PHP告诉NGINX这个用户确实已经登录了,现在可以从他那里接收文件了

我正在使用NGINX和PHP


有什么建议吗?

一个例子:使用$\u会话检查用户是否登录。 你有代码片段吗?因为nginx在cgi/fastcgi下运行,可能是php-fpm,可能有不同的设置来引起注意

if (isset($_SESSION['allowUpload']) {
    // OK
} else {
   // please login or you are not allowed to upload
}

例如:使用$\u会话检查用户是否已登录。 你有代码片段吗?因为nginx在cgi/fastcgi下运行,可能是php-fpm,可能有不同的设置来引起注意

if (isset($_SESSION['allowUpload']) {
    // OK
} else {
   // please login or you are not allowed to upload
}

我想你在这里有一些误解

我唯一的问题是NGINX允许任何用户上传一个文件,让PHP告诉NGINX

NGINX只服务于网页,是一种PHP,它可以从服务器内部让用户上传或不上传文件。如果你和每个人都可以上传文件到你的服务器上,你就有严重的安全风险。这里的要点是限制外部用户直接将任何文件上载到任何文件夹,然后只允许用户在您通过表单决定的文件夹上载文件

典型的情况是:

用户通过文件上载表单访问您的网页。他们选择输入type='file'作为有效文件,然后提交表单。表单将文件发送到一个PHP文件upload.PHP,并将此存储发送到您的服务器:

网页->表单->upload.php->服务器

你可以做不同的事情,比如:

不要让未登录的用户访问他们无法上载的表单 如果用户登录了$\u会话,请签入upload.php。这应该一直做到。 他们俩都是我的推荐 这样,非登录用户就无法上传到您的服务器,因为: -没有直接上传权限ssh、sftp等。 -想要上传文件的用户必须转到您的表单页面。如果未记录,请将其重定向到LOGIN.php。 -如果有人试图直接访问upload.php,将使用$\u会话进行检查,以了解是否已登录

一个非常简单的例子

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;
    }
}
?>

希望有帮助

我想你在这里有一些误解

我唯一的问题是NGINX允许任何用户上传一个文件,让PHP告诉NGINX

NGINX只服务于网页,是一种PHP,它可以从服务器内部让用户上传或不上传文件。如果你和每个人都可以上传文件到你的服务器上,你就有严重的安全风险。这里的要点是限制外部用户直接将任何文件上载到任何文件夹,然后只允许用户在您通过表单决定的文件夹上载文件

典型的情况是:

用户通过文件上载表单访问您的网页。他们选择输入type='file'作为有效文件,然后提交表单。表单将文件发送到一个PHP文件upload.PHP,并将此存储发送到您的服务器:

网页->表单->upload.php->服务器

你可以做不同的事情,比如:

不要让未登录的用户访问他们无法上载的表单 如果用户登录了$\u会话,请签入upload.php。这应该一直做到。 他们俩都是我的推荐 这样,非登录用户就无法上传到您的服务器,因为: -没有直接上传权限ssh、sftp等。 -想要上传文件的用户必须转到您的表单页面。如果未记录,请将其重定向到LOGIN.php。 -如果有人试图直接访问upload.php,将使用$\u会话进行检查,以了解是否已登录

一个非常简单的例子

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;
    }
}
?>
希望有帮助

使用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;
}
现在,每当客户端请求/上载时,Nginx都会向/auth发出内部子请求,在本例中,会在头中传递客户端IP,但您可以根据需要对其进行配置

您的PHP脚本接收子请求,执行您想执行的任何身份验证,如果您想允许访问,则返回HTTP响应代码200,如果不允许,则返回401。

使用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;
}
现在,每当客户端请求/上载时,Nginx都会向/auth发出内部子请求,在本例中,会在头中传递客户端IP,但您可以根据需要对其进行配置

您的PHP脚本接收子请求,执行您想要执行的任何身份验证,并返回HTTP响应代码200(如果您想允许访问和访问)

401如果你不知道。

这有帮助吗?如果我错了,请告诉我。您需要用户身份验证系统,并且只有登录到该系统的用户才能上载文件,对吗?这有帮助吗?如果我错了,请告诉我。您需要用户身份验证系统,并且只有登录到系统的用户才能上载文件,对吗?这将如何不要求用户发送文件?我不知道你要去哪里…给我们更多的帮助我需要用户上传一个文件,但首先我想确保用户已通过php登录。这将如何不需要用户发送文件?我不知道你要去哪里…给我们更多的输入帮助我需要用户上传一个文件,但首先我想确保用户已经通过php登录。这确实有帮助,但我已经跟踪了所有这些…唯一的问题是我不希望php收到文件…我只希望php收到上传文件的请求,然后然后它让nginx接管……有点像XSendfile的工作方式。。。。。用户发送文件->php仅接收用户请求->nginx接收文件并直接存储到硬盘。问题是,当你说我只想接收上传文件的请求时,这就是文件。请求是带有请求的文件,来自文件数据。您不能将其分离,PHP将获取请求和NGINX重定向到它的数据。顺便问一下,你为什么想要这种奇怪的行为?这不符合你的标准方式?我想我不认为这有那么奇怪。。。。$\文件的问题在于,身份验证发生在文件已存储在服务器上之后。我试图做的是在文件存储到服务器上之前对用户进行身份验证。再一次:NGINX应该防止用户在未经您验证的情况下上传任何文件。这是入口点,PHP文件。如果你只有一个通往服务器的网关——php文件,那么你可以阻止未登录的用户上传任何东西。如果你看不清楚,发布你的代码/文件,我会尽力帮助你,但我认为问题在于对服务器上传工作原理的误解,因为您可以阻止未经身份验证的用户查看您的上载表单或您正在执行的任何上载文件操作。。。甚至阻止未经身份验证的用户上传任何内容……因为他们没有任何权限访问您的服务器,除非他们将您的PHP文件用作存储它的网关。。我解释自己?这确实有帮助,但我已经在跟踪所有这些…唯一的问题是我不想让php接收文件…我只想让php接收上传文件的请求,然后让nginx接管…有点像XSendfile的工作方式。。。。。用户发送文件->php仅接收用户请求->nginx接收文件并直接存储到硬盘。问题是,当你说我只想接收上传文件的请求时,这就是文件。请求是带有请求的文件,来自文件数据。您不能将其分离,PHP将获取请求和NGINX重定向到它的数据。顺便问一下,你为什么想要这种奇怪的行为?这不符合你的标准方式?我想我不认为这有那么奇怪。。。。$\文件的问题在于,身份验证发生在文件已存储在服务器上之后。我试图做的是在文件存储到服务器上之前对用户进行身份验证。再一次:NGINX应该防止用户在未经您验证的情况下上传任何文件。这是入口点,PHP文件。如果你只有一个通往服务器的网关——php文件,那么你可以阻止未登录的用户上传任何东西。如果你看不清楚,发布你的代码/文件,我会尽力帮助你,但我认为问题在于对服务器上传工作原理的误解,因为您可以阻止未经身份验证的用户查看您的上载表单或您正在执行的任何上载文件操作。。。甚至阻止未经身份验证的用户上传任何内容……因为他们没有任何权限访问您的服务器,除非他们将您的PHP文件用作存储它的网关。。我解释我自己?