[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Логин скрипт
Alex108
Я пишу скрипт входа на сайт, используя некоторые идеи отсюда:
http://tinsology.net/2009/06/creating-a-se...-the-right-way/
Все странички сайта должны быть доступны только зарегистрированным пользователям.
Для защиты пароля используется хашинг:
$hash = hash('sha256', $salt . $hash);

На страничке ввода, если имя пользователя и пароль прошли проверку, устанавливается сессия:
session_regenerate_id (); //this is a security measure; 
$_SESSION['username'] = $username;


Для остальных страниц вводится проверка, вошел ли пользователь в систему:
function isLoggedIn()
{
if($_SESSION['username'])
return true;
return false;
}
session_start();
//if the user has not logged in
if(!isLoggedIn())
{
header('Location: login.php');
die();
}
//page content follows


На страничке ввода, если имя пользователя и пароль прошли проверку:
session_regenerate_id (); //this is a security measure; 
$_SESSION['username'] = $username;
$_SESSION['password'] = $hash;

$hash это закодированный пароль. Такой же хранится в БД
И для остальных страниц:
if(!isLoggedIn())
{
header('Location: login.php');
die();
}
if(isset($_SESSION['username']))

{
$username = $_SESSION['username'];
$password = $_SESSION['password'];

$check = mysql_query("SELECT * FROM users WHERE username = '$username'")or die(mysql_error());

while($info = mysql_fetch_array( $check ))

{
$query = "SELECT password, salt
FROM users
WHERE username = '$username';";
$result = mysql_query($query);
if(mysql_num_rows($result) < 1) //no such user exists
{
die('Wrong login. Please, log in.');
}
$userData = mysql_fetch_array($result, MYSQL_ASSOC);

if($password != $info['password']) //incorrect password
{
die('Incorrect password. Please, log in.');
}
//login successful

else
etc



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



Спустя 4 минуты, 59 секунд (8.01.2011 - 23:42) alex12060 написал(а):
Ну, нормально)
В принципе, хэш, и проверка на существование это не плохо, но...

Если я сворую сессию, будет плохо)

session_regenerate_id (); //this is a security measure; 


Не, эта штука не позволит сделать затеяное)

В принципе, норма)

Спустя 4 минуты, 18 секунд (8.01.2011 - 23:47) Invis1ble написал(а):
Alex108
не особо вникал, но на первый взгляд все довольно грамотно. Единственное, я не знаю, что за алгоритм хэширования sha256... Возможно, стоит воспользоваться md5..

Спустя 2 минуты, 6 секунд (8.01.2011 - 23:49) Invis1ble написал(а):
Alex108
А, и еще... У тебя там угроза SQL-инъекции есть.. Нужно экранировать переменные, используемые в запросе с помощью mysql_real_escape_string()

PS. Вместо mysql_fetch_array() юзай mysql_fetch_assoc()

Спустя 21 минута, 18 секунд (9.01.2011 - 00:10) alex12060 написал(а):
Цитата
PS. Вместо mysql_fetch_array() юзай mysql_fetch_assoc()


А с этого момента подробнее плиз)

Какая разница, ведь он вызывает с флагом.

Спустя 1 минута, 43 секунды (9.01.2011 - 00:12) alex12060 написал(а):
Кстати ,я даже не заметил оО

  $_SESSION['username'] = $username;


Я вот не понимаю, у тебя $username проходит проверку? Экранку? Обрезку пробелов и так далее?

Если нет, то тебя взломать дело 5 секунд)

Спустя 5 минут, 44 секунды (9.01.2011 - 00:17) Invis1ble написал(а):
alex12060
Цитата
А с этого момента подробнее плиз)

Какая разница, ведь он вызывает с флагом.

Цитата
while($info = mysql_fetch_array( $check ))



Цитата
Обрезку пробелов и так далее

это лишнее

Спустя 7 минут, 14 секунд (9.01.2011 - 00:25) alex12060 написал(а):
Да я почитал на сайте, там идет mysql_real_escape_string();

Не красиво же когда идет 50 пробелов влево (логин) 50 пробелов вправо.

Спустя 5 минут, 56 секунд (9.01.2011 - 00:31) Invis1ble написал(а):
alex12060
Цитата
Не красиво же когда идет 50 пробелов влево (логин) 50 пробелов вправо.

согласен, но можно на выводе обрезать в таком случае. А если я введу при регистрации такой логин: " Логин", то ты его обрежешь, а я потом авторизоваться не смогу, т.к. буду набирать этот же логин, а мне будет писать типа "Неверный логин/пароль", а я буду гадать, в чем же дело... =)

Спустя 1 минута, 30 секунд (9.01.2011 - 00:32) Invis1ble написал(а):
alex12060
можно конечно и при авторизации обрезать тоже.... но это все лишнее, имхо... Вряд ли кто-то будет регистрироваться с такими логинами. В любом случае - к безопасности это не имеет отношения

Спустя 3 минуты, 34 секунды (9.01.2011 - 00:36) Basili4 написал(а):
да не пусть остается если кто то хочет иметь ник %20username%20 это его право

Спустя 3 минуты, 42 секунды (9.01.2011 - 00:39) Invis1ble написал(а):
Basili4
вот и я так думаю

Спустя 1 минута, 53 секунды (9.01.2011 - 00:41) Игорь_Vasinsky написал(а):
интересно:

function isLoggedIn(){   
if($_SESSION['username'])
return true;
return false;
}
session_start();
//if the user has not logged in
if(!isLoggedIn()){
header('Location: login.php');
die();
}
//page content follows


у тя ошибок не каких не вылазит?

или ты отключил их вывод?

Спустя 6 минут, 28 секунд (9.01.2011 - 00:48) Alex108 написал(а):
Цитата (Invis1ble @ 8.01.2011 - 20:49)
Alex108
А, и еще... У тебя там угроза SQL-инъекции есть.. Нужно экранировать переменные, используемые в запросе с помощью mysql_real_escape_string()

PS. Вместо mysql_fetch_array() юзай mysql_fetch_assoc()

Спасибо. О другом думал. Вставлю защитные функции, все будет нормально.

Спустя 2 минуты, 12 секунд (9.01.2011 - 00:50) Alex108 написал(а):
Цитата (Игорь_Vasinsky @ 8.01.2011 - 21:41)
интересно:

function isLoggedIn(){   
if($_SESSION['username'])       
return true;   
return false;
}
session_start();
//if the user has not logged in
if(!isLoggedIn()){   
header('Location: login.php');   
die();
}
//page content follows


у тя ошибок не каких не вылазит?

или ты отключил их вывод?

Нет, не отключал и никаких сообщений не получаю.
С функцией что-то не в порядке?


Спустя 4 минуты, 16 секунд (9.01.2011 - 00:54) Alex108 написал(а):
На этом сайте все пользователи будут проверяться админом и пароль получать от него, длина вводимых слов тоже ограничивается, так что особых проблем с логинами быть не должно.Важнее, чтобы взломать было непросто.

Спустя 1 минута, 54 секунды (9.01.2011 - 00:56) Alex108 написал(а):
Цитата (Invis1ble @ 8.01.2011 - 20:47)
Alex108
не особо вникал, но на первый взгляд все довольно грамотно. Единственное, я не знаю, что за алгоритм хэширования sha256... Возможно, стоит воспользоваться md5..

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

Спустя 5 минут, 11 секунд (9.01.2011 - 01:01) Invis1ble написал(а):
Alex108
все там в порядке, Игорь просто сам не въехал

ЗЫ. Это я про функцию

Спустя 2 минуты, 43 секунды (9.01.2011 - 01:04) Игорь_Vasinsky написал(а):
vмен вотэто смуашет:

session_start();//if the user has not logged in
if(!isLoggedIn()){
header('Location: login.php');
die();
}//page content follows


Спустя 27 секунд (9.01.2011 - 01:04) Invis1ble написал(а):
Alex108
Цитата
Я читал, что sha256 лучше md5

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

Спустя 1 минута, 30 секунд (9.01.2011 - 01:06) Игорь_Vasinsky написал(а):
редиректа же не будет.

Спустя 1 минута, 27 секунд (9.01.2011 - 01:07) Invis1ble написал(а):
Цитата
session_start();//if the user has not logged in
if(!isLoggedIn()){
header('Location: login.php');
die();
}//page content follows

это да, тут варнинг будет при неавторизованном входе

Спустя 2 минуты, 20 секунд (9.01.2011 - 01:10) Basili4 написал(а):
Invis1ble
взломать можно все ты как хочешь хешируй но коллизии будут по причине того что размер исходного варианта не ограничен а результат по размеру ограничивается.

Спустя 59 секунд (9.01.2011 - 01:11) Игорь_Vasinsky написал(а):
ну вот... я уж самопонижаться чуть не начал... игорёк сам не въехал...

где афтор???

протестит с кривым логином... или паролем.

Спустя 10 минут, 22 секунды (9.01.2011 - 01:21) Invis1ble написал(а):
Игорь_Vasinsky
прости, я думал ты про 2 return'a говорил cool.gif

Спустя 1 минута, 47 секунд (9.01.2011 - 01:23) Invis1ble написал(а):
Basili4
это я понимаю, поэтому на данную тему и не парюсь ) Пусть индусы алгоритмы пишут, а мы юзать будем =)

Спустя 4 минуты, 22 секунды (9.01.2011 - 01:27) Alex108 написал(а):
Цитата (Invis1ble @ 8.01.2011 - 22:07)
Цитата
session_start();//if the user has not logged in
if(!isLoggedIn()){
header('Location: login.php');
die();
}//page content follows

это да, тут варнинг будет при неавторизованном входе

Так и есть. Почему нет редиректа?



Спустя 8 минут, 12 секунд (9.01.2011 - 01:35) Invis1ble написал(а):
Alex108
потому что отсылаются заголовки с куками для сессии, а потом заголовок редиректа

Спустя 4 минуты, 7 секунд (9.01.2011 - 01:40) Invis1ble написал(а):
логика хромает

Спустя 15 часов, 26 минут, 31 секунда (9.01.2011 - 17:06) Alex108 написал(а):
В принципе я вообще могу выкинуть
function isLoggedIn()
{
if($_SESSION['username'])
return true;
return false;
}
if(!isLoggedIn())
{
header('Location: login.php');
die();
}

Потому что дальше у меня опять похожая проверка
или заменить if($_SESSION['username']) на if(isset($_SESSION['username']))

Теперь у меня вопрос: как PHP понимает выражение if($_SESSION['username'])?
Можно ли вообще использовать такие конструкции?

И еще. Меня тут пугают replay attacks и session ID fixation.
Для session ID fixation я везде поставил session_regenerate_id ();
Достаточно ли этого?
И, если честно я не очень понял, чем replay attacks отличаются от session ID fixation и существует ли от них своя, отличающаяся от session_regenerate_id (); защита?

Спустя 1 день, 6 часов, 5 минут, 21 секунда (10.01.2011 - 23:11) anonymouse написал(а):

Для остальных страниц вводится проверка, вошел ли пользователь в систему:

function isLoggedIn()
{
if($_SESSION['username'])
return true;
return false;
}
session_start();
//if the user has not logged in
if(!isLoggedIn())
{
header('Location: login.php');
die();
}
//page content follows

в изначальном коде если я не ошибаюсь заметил вот что
ведется работа с массивом $_SESSION до выполнения метода session_start();

если мне память не изменяет массива SESSION просто не будет.
И тогда

if($_SESSION['username'])
return true;
return false;


всегда будет FALSE;

Как я еще прочел у тебя не возникает ошибок - значит они у тебя отключены.
если ты где-то используешь массив SESSION то правилом зарубить надо.
session_start(); всегда выполнятся должен до работы с массивом.

П.С. так от себя - я бы лично в SESSION забивал логин какой-то хэш ну какие личные данные пользователя к примеру группу - что бы когда он потом бегает по сайту - я всегда мог определить его уровень доступа к стр.

Спустя 2 минуты, 47 секунд (10.01.2011 - 23:14) anonymouse написал(а):
П.С.2
А что до SQL Injection - чел узай рег. для обрубки спец символов и trim();
И забудь ты о зашите логина.
П.С.3. можно конечно заюзать mysql_real_escape_string();
А можно просто addslashes();

Спустя 14 часов, 12 минут, 16 секунд (11.01.2011 - 13:26) Alex108 написал(а):
Спасибо.
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.