Как лучше всего создать страницу входа в PHP?

Я новичок в PHP и ищу лучшие практики реализации аутентификации в PHP.

Я проповедник Adobe, и одна из вещей, которая меня раздражает, это когда люди используют Flex/Flash для экрана входа в систему. Итак, я хочу сделать сообщение в блоге/пример использования страницы входа в систему HTML/PHP, а затем передать информацию о сеансе во Flex - после того, как сеанс был установлен.

Я все еще ломаю голову над тем, что именно нужно PHP для создания действительного сеанса и как он устанавливает файлы cookie. Так что примеры или информация, которые конкретно относятся к этому, были бы очень полезны.

Заранее спасибо,

=Райан [email protected]


person ryanstewart    schedule 11.01.2010    source источник
comment
Вы можете взглянуть на github.com/delight-im/PHP-Auth который не зависит ни от фреймворка, ни от базы данных.   -  person caw    schedule 21.10.2016


Ответы (4)


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

Первое, что вы хотите сделать, это позвонить session_start(). Сделав это, вы можете получить и установить переменные сеанса, используя $_SESSION superglobal:

session_start();
$_SESSION['foo'] = $foo;
$bar = $_SESSION['bar'];

После того, как вы это сделаете, вы можете установить данные для входа в систему для текущего пользователя после успешного входа в систему и сохранить их на страницах (не забывая вызывать session_start перед их использованием). Кроме того, session_start необходимо вызывать перед отправкой любого содержимого в браузер.

Однако необходимо учитывать проблемы безопасности, такие как фиксация сеанса и кража файлов cookie. Один из подходов к фиксации сеанса, например, заключается в повторном создании идентификатора сеанса пользователя после повышения привилегий с помощью PHP session_regenerate_id (или что-то в этом роде).

Консорциум безопасности PHP содержит много полезной информации.

Файлами cookie можно управлять с помощью функции setcookie.

person Will Vousden    schedule 11.01.2010
comment
Когда вы говорите, что первое, что вы хотите сделать, это вызвать session_start(), вы имеете в виду, что я должен сделать это, прежде чем я даже проверю учетные данные для входа? Похоже, это правильный способ его реализации, а затем при успешном входе в систему я бы изменил эти переменные сеанса (скажем, изменил $_SESSION['logged_in'] с false на true). Это правильно? - person ryanstewart; 12.01.2010
comment
Да, верно. Вы не можете получить доступ к $_SESSION без предварительной инициализации сеанса; вы должны делать это на каждой странице. - person Will Vousden; 12.01.2010

Это довольно обширная тема. Тем не менее, хорошее понимание сеансов/куки-файлов было бы хорошей основой. Вам следует заглянуть в блог Криса Шифлетта — у него много хороших статей на эти темы.

Я проповедник Adobe, и одна из вещей, которая меня раздражает, это когда люди используют Flex/Flash для экрана входа в систему. Итак, я хочу сделать сообщение в блоге/пример использования страницы входа в систему HTML/PHP, а затем передать информацию о сеансе во Flex - после того, как сеанс был установлен.

Я не совсем уверен в вашей цели здесь. Нужен ли вам компонент Flash для аутентификации пользователя? Поскольку это технология на стороне клиента, такая аутентификация будет иметь ограниченные возможности.

person troelskn    schedule 11.01.2010
comment
Во многих случаях Flash/Flex будет обрабатывать сеанс и напрямую обращаться к PHP для аутентификации. Итак, что я хочу сделать, это использовать перехватчики HTML в Flash Player, чтобы получить обычную информацию о файлах cookie/сеансах, которая будет использоваться на обычной странице входа в PHP, и передать ее во Flash Player, чтобы Player мог делать аутентифицированные запросы к PHP-сервер. - person ryanstewart; 12.01.2010

Создайте страницу login.php с формой примерно такой:

<form method="post" action="login.php">
<input type="text" name="username">
<input type="password" name="password">
<input type="submit" name="submLogin">
</form>

затем добавьте свою логику php:

<?
if(isset($submLogin))
{
 $username = $_POST['username'];
 $password = $_POST['password'];

// run checks on vars not to pass on silly data + escape chars

 $query_login = 'SELECT * FROM users 
 WHERE username = ' . $username . ' AND password = ' . $password . ' LIMIT 1';
 $login = mysql_query($query_login, $db_connection) or die();
 $login_result = mysql_num_rows($login);

 if($login_result == 1)
 {
  // success
  session_start();
  $_SESSION['logged_in'] = TRUE;
  // redirect somewhere, set cookies, do whatever you want to do on success
 }
 else
 {
  // fail
  // display error or redirect
 }
}  
?>

Переменная $db_connection — это идентификатор ссылки — результат mysql_connect() или mysql_pconnect().

person LukeP    schedule 11.01.2010
comment
Непосредственное использование имени пользователя и пароля в SQL-запросе очень небезопасно для SQL-инъекций. Вы должны по крайней мере использовать функцию htmlentities для очистки имени пользователя и пароля перед использованием в SQL-запросе. Просто чтобы ты знал. - person mdikici; 07.02.2014
comment
@subet У меня только что был один из тех, кто, черт возьми, написал эту вещь, когда я посмотрел на свой код выше. Да, определенно не делайте того, что я сделал в своем ответе, и не дезинфицируйте ввод. Опять же, это упоминается в комментариях (в коде). - person LukeP; 07.02.2014

Сбросьте PHP и войдите в ASP.NET. Все это уже сделано вместе с деталями безопасности и членства. знак равно

person Heckflosse_230    schedule 11.01.2010
comment
Лол, этот комментарий бесполезен и просто пламенный. Но я думаю, что на данный момент у него было достаточно отрицательных голосов. - person Alfred; 12.01.2010
comment
Хотел бы я, чтобы кто-нибудь дал мне такой бесполезный совет, когда я начинал с PHP много лет назад. =) Кто-нибудь хочет стопку журналов PHP Architect? Какой позор класть их в камин. - person Heckflosse_230; 13.01.2010