Я думаю, что у вас есть некоторые промахи здесь ...
The only problem that I am having is that NGINX lets ANY user upload a file
а также make PHP tell NGINX that ...
NGINX «только» служит для веб-страниц, является PHP, который (изнутри вашего сервера) позволяет пользователям загружать (или нет) файлы. Если вы (и все) можете загружать файлы на свой сервер, у вас есть серьезный риск для безопасности. Главное здесь - ограничить внешних пользователей прямой загрузкой любого файла в любую папку, а затем разрешить пользователям загружать файл (в папку, которую вы решили), через тип ввода = 'файл' (например).
Типичным сценарием будет:
Доступ пользователя к вашей веб-странице с формой загрузки файла. Они выбирают ( form
) действительный файл и затем отправляют форму. Форма отправляет файл в файл PHP (upload.php) и этот магазин на ваш сервер:
Веб-страница -> форма -> upload.php -> сервер
Вы можете делать разные вещи, например:
- Не позволяйте пользователям без регистрации доступа к ним
form
(они не могут загружаться)
- Проверьте,
upload.php
зарегистрирован ли пользователь ($ _SESSION). Это всегда нужно делать.
- Оба они (мое одобрение)
Таким образом, невозможно, чтобы пользователь, не зарегистрированный на вашем сервере, мог загрузить на ваш сервер, потому что: - Отсутствие прямого разрешения на загрузку (ssh, sftp и т. Д.). Пользователи, которые хотят загрузить файл, должны перейти на вашу страницу формы. Если они не вошли в систему, перенаправляйте их на LOGIN.php. - Если кто-то попытается получить прямой доступ к upload.php, будет проверен с помощью $ _SESSION, чтобы узнать, зарегистрирован ли он или нет.
A (очень простой) пример
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;
}
}
?>
Надеюсь, поможет!