Скачивание с правами
Мне нужно сделать так, чтобы можно было скачать файл только тому, кто правильно ввёл логин и пароль (https://my.website/download.php?login=admin&password=admin), а в другом случае, просто ничего не делать.
Возможно ли это сделать? Возможно ли сделать это на PHP?
Ответы (2 шт):
Моё решение:
<?php
$mysqli = mysqli_connect("server", "user", "pass", "db");
$res = mysqli_query($mysqli, "SELECT password FROM user WHERE login = '" . $_GET["login"] . "'");
$row = mysqli_fetch_assoc($res);
if (is_array($row)) {
foreach ($row as $r) {
if ($r == $_GET["password"]) {
header("Content-Description: File Transfer");
header("Content-Type: application/zip");
header("Content-Disposition: attachment; filename=".basename("files/test.zip"));
header("Content-Transfer-Encoding: binary");
}
}
} else {
if ($row == $_GET["password"]) {
header("Content-Description: File Transfer");
header("Content-Type: application/zip");
header("Content-Disposition: attachment; filename=".basename("files/test.zip"));
header("Content-Transfer-Encoding: binary");
}
}
?>
Как простой вариант можно не генерировать временную ссылку, а использовать сессию. Для проверки логина и пароля лучше все-таки сделать простую форму. Вот код с пояснениями. У вас может быть своя структура файлов и организации кода. Даю просто идею. В файле index.php:
<?php session_start(); ?>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
</head>
<body>
<?php
// объявляем флаговую переменную для дальнейших проверок
$isLoged = false;
// проверяем пытался ли пользователь ввести логин и пароль
if(isset($_POST['send'])){
// фильтруем введенные пользователем данные
$login = htmlspecialchars(trim($_POST['login']));
$password = htmlspecialchars($_POST['password']);
// проверяем введенный пользователем логин и пароль
// здесь нужно написать настоящую проверку логина и пароля пользователя
if($login === 'admin' && $password === 'qwerty') {
// если проверка прошла, переводим флаговую переменную в true
// и записываем в сессию что-нибудь такое
$isLoged = true;
$_SESSION['user'] = 'isLoged';
}
}
?>
<!-- если пользователь не прошел авторизацию выводим форму -->
<?php if(!$isLoged): ?>
<p>Для скачивания файла введите логин и пароль</p>
<form method="post">
<p>
<b>Login:</b>
<input type="text" name="login" value="<?php echo $login; ?>">
</p>
<p>
<b>Password:</b>
<input type="password" name="password">
</p>
<?php if(isset($_POST['send'])) : ?>
<p><b>Неверный логин или пароль!</b></p>
<?php endif; ?>
<input type="submit" name="send">
</form>
<?php endif; ?>
<!-- если пользователь прошел авторизацию, то форма авторизации не выведетя, т.к. $isLoged === true
и показываем ссылку для скачивания -->
<?php if($isLoged): ?>
<p><a href="./download.php">Скачать</a></p>
<?php endif; ?>
</body>
</html>
Файл download.php:
<?php
// запускаем сессию
session_start();
// проверяем авториован ли пользователь
if($_SESSION['user'] === 'isLoged') {
// если авторизован, отдаем требуемый файл. Я просто вывел картинку с котиком
// вы можете использовать имеющийся уже у вас код
$image = file_get_contents('http://magspace.ru/uploads/2009/05/16/09-085832832-lg.jpg');
header("Content-type: image/jpeg");
echo $image;
// удаляем из сессии данные об авторизации
unset($_SESSION['user']);
} else {
// если на эту страницу попал неавторизованный польхователь, т.е. данные в сессии отсутсвуют
// генерируем ошибку 404 (как вариант).
// тут может быть другая логика
header($_SERVER['SERVER_PROTOCOL'] . " 404 Not Found");
}
Для проверки логина и пароля можно написать простую функцию. В случае соответствия логина и пароля она вернет true, иначе false:
function checkUser($login, $password)
{
$mysqli = mysqli_connect('127.0.0.1', 'root', '', 'php');
$res = mysqli_query($mysqli, "SELECT id FROM users WHERE login= '$login' AND password = '$password' LIMIT 1");
if( mysqli_num_rows($res) > 0) return true;
return false;
}
И вызывать ее в нужном месте кода:
if(checkUser($login, $password)) {
$isLoged = true;
$_SESSION['user'] = 'isLoged';
}