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..
не особо вникал, но на первый взгляд все довольно грамотно. Единственное, я не знаю, что за алгоритм хэширования sha256... Возможно, стоит воспользоваться md5..
Спустя 2 минуты, 6 секунд (8.01.2011 - 23:49) Invis1ble написал(а):
Alex108
А, и еще... У тебя там угроза SQL-инъекции есть.. Нужно экранировать переменные, используемые в запросе с помощью mysql_real_escape_string()
PS. Вместо mysql_fetch_array() юзай mysql_fetch_assoc()
А, и еще... У тебя там угроза 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 написал(а):
Кстати ,я даже не заметил оО
Я вот не понимаю, у тебя $username проходит проверку? Экранку? Обрезку пробелов и так далее?
Если нет, то тебя взломать дело 5 секунд)
$_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 пробелов вправо.
Не красиво же когда идет 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(){ у тя ошибок не каких не вылазит? или ты отключил их вывод? |
Нет, не отключал и никаких сообщений не получаю.
С функцией что-то не в порядке?
Спустя 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
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 говорил
прости, я думал ты про 2 return'a говорил
Спустя 1 минута, 47 секунд (9.01.2011 - 01:23) Invis1ble написал(а):
Basili4
это я понимаю, поэтому на данную тему и не парюсь ) Пусть индусы алгоритмы пишут, а мы юзать будем =)
это я понимаю, поэтому на данную тему и не парюсь ) Пусть индусы алгоритмы пишут, а мы юзать будем =)
Спустя 4 минуты, 22 секунды (9.01.2011 - 01:27) Alex108 написал(а):
Цитата (Invis1ble @ 8.01.2011 - 22:07) | ||
это да, тут варнинг будет при неавторизованном входе |
Так и есть. Почему нет редиректа?
Спустя 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 написал(а):
В принципе я вообще могу выкинуть
Потому что дальше у меня опять похожая проверка
или заменить 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 (); защита?
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();
А что до SQL Injection - чел узай рег. для обрубки спец символов и trim();
И забудь ты о зашите логина.
П.С.3. можно конечно заюзать mysql_real_escape_string();
А можно просто addslashes();
Спустя 14 часов, 12 минут, 16 секунд (11.01.2011 - 13:26) Alex108 написал(а):
Спасибо.