PHP: скрипт входа в систему, но требует небольших изменений - PullRequest
0 голосов
/ 18 января 2011

У меня есть веб-сайт, на котором пользователи вводят свое имя пользователя / пароль для входа в систему и хранят эту информацию в файле. Вот мой текущий код:

function getPassword( $user )
{
  $passwords= array 
       (
        'Admin' => '123456',
        'Moderator' => 'abcde'
       );
 eval(file_get_contents('./login.info'));  //<--- THIS is where usernames/passwords are stored  

    $password = $passwords[ $user ];
    if ( NULL == $password )
        return NULL;

    return array( $user, $password );
}

Вот код, который у меня есть для пользователей, создающих новые учетные записи:

<?php
if((isset($_POST['username']))and(isset($_POST['password']))){
 $file = "login.info";
 $fh = fopen($file, 'a');
//prevent sql injection
function check_field($fh)
{
  if(!preg_match("/[^a-zA-Z0-9\.\-\_\@\.\+\~]/",$fh))
  return TRUE;
  else
  return FALSE;
}
if(!check_field($_POST[username]))
{
  header("Location:illegalchars.html");
  break;
}
if(!check_field($_POST[password]))
{
  header("Location:illegalchars.html");
  break;
}
 fwrite($fh, '$passwords["'.$_POST['username'].'"]="'.$_POST['password'].'";');
 fclose($fh);
 header("Location:success.html");
 break;
}
?>

Я знаю, что мой код не очень красив и имеет серьезные проблемы.
Один из них: если кто-то создает учетную запись с именем пользователя x, любой может создать x с новым паролем для получения контроля.
Простым решением, которое у меня было, было перемещение eval(file_get_contents('./login.info')); поверх учетных записей администраторов и добавление новых учетных записей в ТОП списка новых пользователей / проходов. Тем не менее, я не могу понять, почему размещение eval поверх массива не работает. Кроме того, как я могу получить код для добавления в верхней части списка. Любая помощь очень ценится.

== РЕДАКТИРОВАТЬ == Я знаю, что в отношении этого кода НАМНОГО критикуется, но может кто-нибудь ответить на вопрос? Я не пытаюсь улучшить безопасность / производительность в данный момент (это игра для проверки концепции, в конце концов, все это придется переписать в любом случае). Я просто хочу функциональный скрипт, пожалуйста, ответьте на вопрос? :]

Ответы [ 3 ]

2 голосов
/ 18 января 2011

Честно говоря, здесь есть серьезные проблемы.

Ноль. Вы не должны хранить незашифрованные пароли. Когда-либо. Используйте одностороннее хеширование, например sha1 () (не md5) с солью, об этом есть множество руководств в Интернете.

One. Использование eval () является плохой практикой, как с точки зрения производительности, так и с точки зрения безопасности. Ищите другие механизмы, они всегда рядом.

Два. Вы должны использовать надежные механизмы хранения данных, кроме файла php. Предложите использовать СУБД, такую ​​как mysql, которая гарантирует, что для пользователей никогда не будут создаваться повторяющиеся записи.

Три. Не следует придавать какое-либо особое значение имени пользователя, например, admin или mod, делать разрешения специальным полем или, что еще лучше, рассмотреть возможность использования авторизации на основе ролей.

Четыре. Вы не можете контролировать безопасность кода, запускаемого для определенного пользователя, без правильной архитектуры. Подумайте об использовании объектно-ориентированного подхода MVC, вы снова можете найти много руководств по этому поводу.

Извините, это звучит критично, но я серьезно считаю, что это лучший ответ, чем публикация исправлений к представленному вами коду.

1 голос
/ 18 января 2011

OMG!

Могу ли я опубликовать это на dailywtf .

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

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

Хранение незашифрованных паролей неверно.

Вы сказали, что не можете использовать mysql - но как насчет dbm? SQLite? Быстрый Google предлагает, что есть много слоев абстракции плоского файла, бегущих поверх простого текста или файлов CSV.

1 голос
/ 18 января 2011

Сценарий входа в систему

Если вы действительно не можете использовать что-либо вроде openid, то здесь вы можете просмотреть мой улучшенный сценарий для вашего сценария входа (Должно быть в крайнем случае ..).

OpenId

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

Я здесь не для того, чтобы критиковать Гоукера.Напротив, я хотел бы поблагодарить их за широкую и смелую иллюстрацию грязной правды о паролях веб-сайтов: нам всем лучше без них.Если вы хотите, чтобы в будущем в Интернете не было компромиссов с паролями в стиле Gawker, перестаньте доверять каждому случайному интернет-сайту уникальное имя пользователя и пароль!Требуйте, чтобы они позволили вам использовать ваши водительские права в Интернете, то есть существующие учетные данные Twitter, Facebook, Google или OpenID, для входа на их веб-сайт.

Вместо этого следует использовать, например,OpenID ( lightopenid ).Прочитайте ссылку, чтобы узнать, как легко интегрировать openid в ваш сайт.

...