Welcome

Как запаролить страничку с помощью php?

Я хотел сделать так: заходишь на Page (ее необходимо запаролить), тебя переадресовывает на страничку с формой логин и пароль; если вводишь верно, то переходишь на страничку Page . Но тут проблема, после ввода верного пароля переходишь на страничку Page и она опять кидает тебя на ввод пароля. Замкнутый круг. Есть у кого-нибудь что-то подобное, более рабочее? Скиньте.

7 ответов 7

Суть в том, что сервер должен запомнить, что ты прошел авторизацию и аутентификацию. Эти сведения тебе помогут сохранить данные об успешной авторизации:

На youtube есть хороший туториал, за одно и исходник можно скачать, называется Login System!

 else < echo "

Hello .

"; echo "

Вы ввели пароль .

"; > ?>

А не легче все сделать через htaccess .

Допустим у вас есть сайт www.site.ru, а по адресу www.site.ru/webadmin/ у вас находится система администрирования сайта, доступ к которой должен быть ограничен паролем. Для этого вам необходимо создать в директории /webadmin/ два файла: .htaccess и .htpasswd.

Содержимое файла .htaccess:

AuthType basic

AuthName ‘Authorization. ‘

AuthUserFile ‘/. /www/webadmin/.htpasswd’

Require valid-user

DirectoryIndex admin.php

Для вас важны третья и пятая строчки, остальные менять не нужно. В третьей строке между одинарными кавычками указан путь к файлу .htpasswd от корневой директории сервера. Как правило эта информация (путь от корня сервера) предоставляется хостером среди прочей информации об арендуемой фтп-площадке. В пятой строке указан файл, который будет загружаться по умолчанию (в случае если вы не указали конкретный файл в адресной строке).

В файле .htpasswd хранятся логин и пароль к папке. Выглядит содержимое этого файла примерно следующим образом:

Источник

Простая аутентификация на PHP

Многие новички до сих пор попадают в тупик при написании простейшей аутентификации в PHP. На Тостере с завидной регулярностью попадаются вопросы о том, как сравнить сохраненный пароль с паролем полученным из формы логина. Здесь будет краткая статья-туториал на эту тему.

Disclaimer: статья рассчитана на совершенных новичков. Умудрённые опытом разработчики ничего нового здесь не найдут, но могут указать на возможные недочёты =).

Для написания системы аутентификации будем использовать базу данных MySQL/MariaDB, PHP, PDO, функции для работы с паролями, для построения интерфейса возьмём bootstrap.

Для начала создадим базу. Пусть она называется php-auth-demo. В новой базе создадим таблицу пользователей users :

CREATE TABLE `users` ( `id` int unsigned NOT NULL AUTO_INCREMENT, `username` varchar(255) COLLATE utf8mb4_general_ci NOT NULL, `password` varchar(255) COLLATE utf8mb4_general_ci NOT NULL, PRIMARY KEY (`id`), UNIQUE KEY `username` (`username`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;

Создадим конфиг с данными для подключения к базе.

Имейте ввиду, что в реальном проекте к конфигам не должно быть доступа из браузера, и они не должны быть включены в систему контроля версий, во избежание компрометации учетных данных.

 'php-auth-demo', 'db_host' => '127.0.0.1', 'db_user' => 'mysql', 'db_pass' => 'mysql', ];

И сделаем «загрузочный» файл, который будем подключать вначале всех остальных файлов.

В реальных проектах обычно используется автозагрузка необходимых файлов. Но этот момент выходит за рамки статьи, и в демо-примере мы обойдёмся простым подключением.

В «загрузочном» файле мы будем инициализировать сессию и объявим некоторые функции-помощники.

setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); > return $pdo; >

Функция pdo() даст нам доступ к объекту PDO в любом месте нашего кода.

Далее нам нужна форма регистрации. Разместим её прямо в файле index.php .

 

Здесь всё просто: два поля, кнопка и форма, отправляющая запрос на файл do_register.php методом POST. Процесс регистрации пользователя опишем в файле do_register.php .

prepare("SELECT * FROM `users` WHERE `username` = :username"); $stmt->execute(['username' => $_POST['username']]); if ($stmt->rowCount() > 0) < flash('Это имя пользователя уже занято.'); header('Location: /'); // Возврат на форму регистрации die; // Остановка выполнения скрипта >// Добавим пользователя в базу $stmt = pdo()->prepare("INSERT INTO `users` (`username`, `password`) VALUES (:username, :password)"); $stmt->execute([ 'username' => $_POST['username'], 'password' => password_hash($_POST['password'], PASSWORD_DEFAULT), ]); header('Location: login.php');

В самом начале подключим наш «загрузчик».

Потом проверим, не занято ли имя пользователя. Для этого сделаем выборку из таблицы указав в условии полученное из формы имя пользователя. Обратите внимание, для запросов здесь и далее мы будем использовать подготовленные запросы, что обезопасит нас от SQL-инъекций. Для этого в тексте SQL-запроса мы указываем специальные плейсхолдеры, а при выполнении ассоциируем с ними ненадёжные данные (ненадёжными данными следует считать всё, что приходит из вне – $_GET, $_POST, $_REQUEST, $_COOKIE). После выполнения запроса мы просто проверим количество возвращённых строк. Если их больше нуля, то имя пользователя уже занято. В этом случае мы выведем сообщение и вернём пользователя на форму регистрации.

Я написал «больше нуля», но по факту, из-за того, что поле username в таблице уникальное, rowCount() может нам вернуть лишь два возможных значения: 0 и 1 .

В приведённом выше коде мы использовали функцию flash() . Данная функция предназначена для «одноразовых» сообщений. Если вызвать её со строковым параметром, то она сохранит эту строку в сессии, а если вызвать без параметров, то выведет из сессии сохранённое сообщение и затем удалит его в сессии. Добавим эту функцию в файл boot.php .

function flash(?string $message = null) < if ($message) < $_SESSION['flash'] = $message; >else < if (!empty($_SESSION['flash'])) < ?>  unset($_SESSION['flash']); > >

А также вызовем её нa форме регистрации, для вывода возможных сообщений.

На данном этапе простейший функционал регистрации нового пользователя готов.

Если мы посмотрим код регистрации выше, то увидим, что в случае успешной регистрации, мы перенаправляем пользователя на страницу логина. Самое время ее написать.

Login

Register

В виду простоты примера, она практически повторяет форму регистрации. Интереснее будет посмотреть на сам процесс логина в файле do_login.php .

prepare("SELECT * FROM `users` WHERE `username` = :username"); $stmt->execute(['username' => $_POST['username']]); if (!$stmt->rowCount()) < flash('Пользователь с такими данными не зарегистрирован'); header('Location: login.php'); die; >$user = $stmt->fetch(PDO::FETCH_ASSOC); // проверяем пароль if (password_verify($_POST['password'], $user['password'])) < // Проверяем, не нужно ли использовать более новый алгоритм // или другую алгоритмическую стоимость // Например, если вы поменяете опции хеширования if (password_needs_rehash($user['password'], PASSWORD_DEFAULT)) < $newHash = password_hash($_POST['password'], PASSWORD_DEFAULT); $stmt = pdo()->prepare('UPDATE `users` SET `password` = :password WHERE `username` = :username'); $stmt->execute([ 'username' => $_POST['username'], 'password' => $newHash, ]); > $_SESSION['user_id'] = $user['id']; header('Location: /'); die; > flash('Пароль неверен'); header('Location: login.php');

Здесь есть важный момент. Мы не запрашиваем пользователя из таблицы по паре username/password, а используем только username. Дело в том, что даже если вы захешируете пришедший из формы логина пароль и попробуете сравнить новый хеш с сохранённым в базе, вы ничего не получите. Password_hash() использует автоматически генерируемую соль для паролей и хеши будут всегда получаться разные. Вот результат функции password_hash , вызванной несколько раз для пароля «123»:

$2y$10$loqucup11.3DL1fgDWanoettFpFJuFFd0fY6BZyiP698ZqvA4tmuy $2y$10$.LF3OzmQRtJvuZZWeWF.2u80x3ls6OEAU5J9gLHDtcYrFzJkRRPvq $2y$10$iGj/nOCavShd2vbMZTC4GOMYCqDj2YSc8qWoeqjVbD1xaKU2CgAfi

Именно поэтому необходимо использовать функцию password_verify для проверки пароля. Кроме того, данная функция использует специальный алгоритм проверки и является безопасной для атак по времени.

Также хорошо будет проверить пароль на необходимость обновления хеша, в случае, если в проекте вы измените алгоритм хеширования или его опции.

В случае успешного логина мы сохраним идентификатор пользователя в сессии, и отправим его обратно на главную страницу.

Для проверки того факта, что пользователь залогинен, нужно будет проверить наличие данного идентификатора в сессии. Мы для удобства напишем функцию-помощник и разместим ее в том же файле boot.php .

Теперь можем добавить проверки и изменить вывод на главной странице, если пользователь аутентифицирован.

prepare("SELECT * FROM `users` WHERE `id` = :id"); $stmt->execute(['id' => $_SESSION['user_id']]); $user = $stmt->fetch(PDO::FETCH_ASSOC); > ?> 

Welcome back, !

else < ?>

Registration

?>

А также закрыть доступ к форме логина, если пользователь уже вошёл:

Осталось добавить возможность «выйти». Форму для выхода вы можете видеть в коде выше. Сама процедура выхода простейшая, и заключается в очистке сессии.

Заключение

  • Используем PDO/MySQLi и подготовленные запросы для работы с базой данных.
  • В базе данных обязательно храним только хеш пароля.
  • Для хеширования пароля используем специальную функцию password_hash.
  • Для проверки пароля не делаем сравнение хешей, а используем специальную функцию password_verify.

Полный код примера доступен на гитхабе: ссылка на Github.

Источник

Как ограничить доступ к html-странице паролем?

Всем привет! Вопрос в следующем: Допустим, есть html-страница, на которой одно единственное поле для ввода пароля. При успешном вводе пароля человека перекидывает на нужную страницу. Пароль хранится не в базе, а в каком либо файле, или в коде этой же страницы. Как организовать доступ по паролю, чтобы при неверном вводе пароля под инпутом сразу же появлялся див с заданным текстом типа «Вы ошиблись».

Хранить пароль в коде страницы — моветон и грубое нарушение правил безопасности. Для хранения пароля используйте какую-нибудь хеш-функцию, например md5

@Johny, сколько бы раз вы там не хешировали-перехешировали ключевую строку, толку от этого больше не станет. Так или иначе эта строка будет частью того же AJAX запроса, который для сервера будет верным, а, следовательно, злоумышленник( или школьник ) сумеет его вытащить без всяких проблем.

3 ответа 3

  
Кривой пароль

Самый лучший способ изменить расширение Вашего файла с .html на .php Так Вы по крайней мере сделаете код, который представлен снизу, компилируемым сервером. Это означает, что он не будет доступен другим пользователем. Они получат только конечный результат.

  1. Просто добавьте этот скрипт наверху Вашей страницы
  2. Замените login и pass на нужные Вам значения
  3. Пользуйтесь на здоровье 🙂

P.S. Это слабая защита, для больших проектов стоит найти другое решение

 "pass"); $valid_users = array_keys($valid_passwords); $user = $_SERVER['PHP_AUTH_USER']; $pass = $_SERVER['PHP_AUTH_PW']; $validated = (in_array($user, $valid_users)) && ($pass == $valid_passwords[$user]); if (!$validated) < header('WWW-Authenticate: Basic realm="My Realm"'); header('HTTP/1.0 401 Unauthorized'); die ("Not authorized"); >// Тут мы пишем те echo "

Здравствуйте $user.

"; echo "

Поздравляем, Вы успешно прошли авторизацию.

"; ?>

Источник

Аутентификация и авторизация через форму на PHP

Изображение баннера

Аутентификация через форму (Form-based authentication) популярна потому, что можно накрутить свою логику.

Структура

Прямо на этом сайте я создал директорию login а ней следующие файлы:

. ├── authorizer.php ├── check_credentials.php ├── index.php ├── logout.php └── welcome.php

Цель посетителя — страница welcome.php

На этой странице есть текст с приветствием и проверка — залогинился пользователь или нет

Welcome to AndreyOlegovich.ru

‘; ?>

Проверка осуществляется с помощью функции check_credentials() из файла check_credentials.php

Если переменная сессии $_SESSION[«loggedin»] не равна true пользователь отправляется на страницу с логином.

HTML форма для ввода логина и пароля будет находится в файле index.php

else < header("location: index.php"); >exit; > $username = «»; $password = «»; if (isset($_POST[‘username’]) && isset($_POST[‘password’])) < if (!empty($_POST['username']) && !empty($_POST['password'])) < $username = $_POST['username']; $password = $_POST['password']; >> echo’

HOME

Введите ваши имя пользователя и пароль

‘; ?>

Скрипт, который будет проверять введённые данные с правильными сохраните в файл authorizer.php

; echo’

menu

Welcome to eth1.ru

‘; ?>

Комментарии

Для простоты был рассмотрен вариант без применения баз данных

Я видел много инструкций где скрипт отвечающий за проверку данных находится в одном файле с HTML формой.

Также я видел вопросы на форумах в стиле «почему нужно нажимать на кнопку логин два раза»

Чтобы избавить себя от возможных проблем — скрипт и форму я держу в разных файлах.

Источник

Читайте также:  Как получить часть строки javascript
Оцените статью