Вход в Php — лучшая практика

Как лучше всего проверять введенные данные при использовании функции входа в систему i на веб-странице?

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

На данный момент я просто использую If-оператор с введенными данными и жестко запрограммированным паролем, и это как-то небезопасно, но в то же время пользователи не могут видеть php-код, пока они не попадают на сервер, или я ошибаюсь?

if($password == 'myPassword123')

Кстати, есть ли способ загрузить фактический файл .php с сервера (с точки зрения пользователя).


person Victor Axelsson    schedule 15.07.2013    source источник
comment
ЛУЧШАЯ ПРАКТИКА - ХЭШИРОВАНИЕ ВАШЕГО ПАРОЛЯ!   -  person mnagel    schedule 15.07.2013


Ответы (4)


Хэш пароль! никогда не храните в открытом виде.

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

<?php
function check_pass($password){
    $chkpass = file_get_contents(dirname(__FILE__).'/../path_outside/webroot/adminpass.txt');
    if(crypt($password, $chkpass) == $chkpass){
        return true;
    }else{
        return false;
    }
}

/* The file adminpass.txt contains the hash 
   $1$MH0.l.1.$aNx9btlqPfGpkAxK4Bdym. 
   which is mypassword in plaintext */
if (check_pass($_POST['password'])) {
   echo "ok!";
}else{
    echo "fail!";
}
?>
person Lawrence Cherone    schedule 15.07.2013

В обычной практике нет возможности просто загрузить копию файла php без какой-либо ошибки или неправильной конфигурации на вашем сервере.

При этом вам, вероятно, следует просто хранить хэш пароля, а не его текстовую версию http://php.net/manual/en/faq.passwords.php

person Anigel    schedule 15.07.2013

Единственный способ, которым пользователь получит доступ к вашему PHP-коду, это если:

  1. Они взламывают ваш сервер, и в этот момент поиск вашего пароля администратора — это наименьшая из ваших забот.
  2. Неправильная конфигурация сервера выводит код PHP в виде простого текста (это случилось с Facebook несколько лет назад).
person Wayne Whitty    schedule 15.07.2013

Я бы создал динамически сгенерированную строку и И с моим паролем, и, вероятно, сделал бы что-то вроде захвата количества попыток. Заблокировать пользователя до истечения срока действия сеанса. :D

<?php //login.php
$_SESSION['xrf'] = hash('sha512');
$myPassword = 'password';
?>

<input type="hidden" name="_xrf_" />
<input type="password" name="password" />

<?php
$password = $_POST['password'];
if(isset($password) && $_SESSION['attempt'] != 3):
  $xrf = $_POST['_xrf_'];
  if($password === $myPassword  && $_SESSION['xrf'] === $xrf):
    echo 'Hell Yeah';
  else:
    header("Cache-Control: private, must-revalidate, max-age=0");
    header("Pragma: no-cache");
    header("Expires: Sat, 27 Jan 1997 05:00:00 GMT");
    header("Location:login.php");
  endif;
else:
  $_SESSION['attempt'] += 1;
endif;
?>
person tux    schedule 15.07.2013
comment
Я предполагаю, что вы хотели добавить session_start() перед использованием $_SESSION - person Anigel; 15.07.2013