Авторизация, Интересно Ваше мнение
Каким способом лучше делать авторизацию
1) В админзону,
2) Для множества пользователей, например, интернет магазина.
Знаю, что многие делают авторизацию в админку через .htaccess и .htpasswd, но действительно ли такой способ достаточно безопасен, даже если хранить пароль выше директории, доступной из интернета? Или лучше здесь использовать php+mysql?
И, что касается php+mysql, насколько действительно безопасно хранить данные в базе данных? И как их следует защищать?
Интересно узнать, кто как делает, и нужен совет по следующему вопросу:
Каким способом лучше делать авторизацию
1) В админзону,
2) Для множества пользователей, например, интернет магазина.
Знаю, что многие делают авторизацию в админку через .htaccess и .htpasswd, но действительно ли такой способ достаточно безопасен, даже если хранить пароль выше директории, доступной из интернета? Или лучше здесь использовать php+mysql?
И, что касается php+mysql, насколько действительно безопасно хранить данные в базе данных? И как их следует защищать?
В свои админки я использую следующий уровень авторизации, создаю файлы с такими именами что на завтра сам их забываю :)
Я всегда использую PHP+MySQL авторизацию, причем пароли храню в БД в зашифрованным PASSWORD(md5($pwd)), что невероятно надежно. Не рекомендую использовать куки. Лучше сессии с ключиком sid, который и будет ходить вместе с ссылками. Еще надо запретить индексацию этой части сайта. На всякий случай.
Авторизация Апаше сервером достаточно надежная, но ломается, известны преценденты.
Я всегда использую PHP+MySQL авторизацию, причем пароли храню в БД в зашифрованным PASSWORD(md5($pwd)), что невероятно надежно. Не рекомендую использовать куки. Лучше сессии с ключиком sid, который и будет ходить вместе с ссылками. Еще надо запретить индексацию этой части сайта. На всякий случай.
Не согласен, запрещение индексации сразу грит злоумышленику что такой раздел есть, наоборот админ ращздел нигде не должен светиться....
Не согласен, запрещение индексации сразу грит злоумышленику что такой раздел есть, наоборот админ ращздел нигде не должен светиться....
Вообще-то можно запретить все по умолчанию, и разрешить только определенные директории.
Хотя ты прав, конечно.
Авторизация Апаше сервером достаточно надежная, но ломается, известны преценденты.
Я всегда использую PHP+MySQL авторизацию, причем пароли храню в БД в зашифрованным PASSWORD(md5($pwd)), что невероятно надежно. Не рекомендую использовать куки. Лучше сессии с ключиком sid, который и будет ходить вместе с ссылками. Еще надо запретить индексацию этой части сайта. На всякий случай.
А PASSWORD() - что это за функция? Наподобие md5()?
"ходить вместе с ссылками" - имеете в виду передаваться в открытом виде в ссылках?
А PASSWORD() - что это за функция? Наподобие md5()?
"ходить вместе с ссылками" - имеете в виду передаваться в открытом виде в ссылках?
PASSWORD() - это внутренняя функция MySQL. Тоже необратимое шифрование. Вместе они дают неповторимый результат. Определить каков был пароль становится ну совершенно невозможно.
А работать с ним надо примерно так:
PASSWORD() - это внутренняя функция MySQL. Тоже необратимое шифрование. Вместе они дают неповторимый результат. Определить каков был пароль становится ну совершенно невозможно.
А работать с ним надо примерно так:
Большое Спасибо, понял:)
Могу кинуть набор функций для удачной сессии.
Буду очень благодарен.
Буду очень благодарен.
Вот набор функций. Надеюсь, тут все понятно. Если надо будет, добавляйте PASSOWORD() и мультипользователей.
function isSession( $sid ) {
global $database;
$database->setQuery("SELECT id, sid, ip, UNIX_TIMESTAMP(NOW(NULL))-UNIX_TIMESTAMP(access) as howold, created, access FROM #__domaininfo_sessions WHERE sid='$sid'");
list( $row ) = $database->loadObjectList();
if ($database->getErrorNum()) {
echo $database->stderr();
return false;
}
// is row with this key exists?
if ($row->id) {
// isn't it expires?
if (($row->howold >= 0) && ($row->howold < 3600)) {
// has it same IP that previous?
if ($row->ip == $_SERVER['REMOTE_ADDR']) {
return true;
}
} else {
deleteSession( $sid );
}
}
return false;
}
// Destroys session with this key
function deleteSession( $sid ) {
global $database;
$database->setQuery( "DELETE FROM #__domaininfo_sessions WHERE sid='$sid'" );
if (!$database->query()) {
echo "<script> alert('".$database->getErrorMsg()."'); window.history.go(-1); </script>\n";
}
}
// Make new session
function makeSession() {
global $database;
$row = new mosDomainInfo_Sessions( $database );
$row->sid = md5( time() + rand(0,100000) + $_SERVER['REMOTE_ADDR'] );
$row->ip = $_SERVER['REMOTE_ADDR'];
$row->created = date( "Y-m-d H:i:s" );
$row->access = date( "Y-m-d H:i:s" );
if (!$row->check()) {
echo "<script> alert('".$row->getError()."'); window.history.go(-1); </script>\n";
exit();
}
if (!$row->store()) {
echo "<script> alert('".$row->getError()."'); window.history.go(-1); </script>\n";
exit();
}
return $row->sid;
}
//
function updateSession( $sid ) {
global $database;
$database->setQuery( "UPDATE #__domaininfo_sessions SET ip='".$_SERVER['REMOTE_ADDR']."', created=created, access=NOW(NULL) WHERE sid='$sid'" );
if (!$database->query()) {
echo "<script> alert('".$database->getErrorMsg()."'); window.history.go(-1); </script>\n";
}
}
if ( isSession($sid) ) { // maybe current session is correct?
updateSession( $sid );
} else { // checking for login&pwd
if ($logins[$_POST['domaininfo_login']]&&($logins[$_POST['domaininfo_login']] == $_POST['domaininfo_pwd'])) {
mosRedirect("index2.php?option=$option&sid=" . makeSession());
} else { // user is not authorised
HTML_domaininfo::drawLoginForm( $option );
}
die();
}
Не рекомендую использовать куки.
Почему же? Куки, которые живут лишь до конца сессии (а ещё лучше - 3-5 минут, не более) и каждый раз меняются при переходе на другую страницу, имеют ничтожно малые возможности на нормальное использование. А если и про дырки в двиге ничего никому неизвестно...
Почему же? Куки, которые живут лишь до конца сессии (а ещё лучше - 3-5 минут, не более) и каждый раз меняются при переходе на другую страницу, имеют ничтожно малые возможности на нормальное использование. А если и про дырки в двиге ничего никому неизвестно...
Куки воруются в режиме онлайн адаварями. И еще они преспокойно могут быть отключены. Как у меня, например. А то что я выложил воруется только из хисторей, да и то в течение часа после использования или еще меньше. Метод с сессией в строке запроса имхо надежней.
Куки воруются в режиме онлайн адаварями.
При переходе на другую страницу куки переписываются. Я об этом уже писал.
И еще они преспокойно могут быть отключены. Как у меня, например.
А если куки отключены, то sid можно благополучно передавать через те же самые ссылки.
А если куки отключены, то sid можно благополучно передавать через те же самые ссылки.
Я о том и говорю, что sid нужен по-любому.
Я о том и говорю, что sid нужен по-любому.
Зато при использовании куки этот sid не будет маячить в адресной строке и в линках недогадливого юзера.
[FONT=courier new]http://example.com/forum/index.php?sid=2defa8bc2123[/FONT]
Зато при использовании куки этот sid не будет маячить в адресной строке и в линках недогадливого юзера.
[FONT=courier new]http://example.com/forum/index.php?sid=2defa8bc2123[/FONT]
Согласись, in a way это уже вопрос вкуса )
Как ещё, кроме предотвращения инъективных sql-атак следует защищать БД на уровне сайта?
Господа, простите, что повторяю вопрос, но боюсь, что он остался незамеченным...
Как ещё, кроме предотвращения инъективных sql-атак следует защищать БД на уровне сайта?
Проверять в каждом инклуде, какой файл его вызывает, иметь грамотный пароль на бд, разрешить работать с бд только с локалхоста. Еще все-все-все проверить. Все переменные, которые могут быть введены. Ни одной переменной не пропускать напрямую в запрос, например, в виде: "SELECT * FROM table1 WHERE a='" . $external_var . "'".
Примерно так.
Проверять в каждом инклуде, какой файл его вызывает...
Подскажите способ, пожалуйста...
Подскажите способ, пожалуйста...
В самом начале всех подчиненных инклудов (т.е. тех кто не должен вызываться сам) указываете что-то вроде:
И не использовать стандартных имен!
Спасибо:)
Да пожалуйста ) На эту тему я могу долго распространяться)
Ни одной переменной не пропускать напрямую в запрос, например, в виде: "SELECT * FROM table1 WHERE a='" . $external_var . "'".
Знаешь, я попытался отправить на своём движке конференции сообщение следующего вида:
INSERT INTO dbb_users (username, userid, userpass) VALUES ('hyperadmin','1','');
INSERT INTO dbb_posts (topicid, posttext, postauthor, postauthname, postauthip, postsubj, postdatetime) VALUES ('0','hello
И ничего при этом в dbb_users не добавилось. При просмотре поста в топике я просто увидел тот же текст.
Вот часть исходника:
Почему вместо лишней записи я получил те жи строки?
Знаешь, я попытался отправить на своём движке конференции сообщение следующего вида:
....
Почему вместо лишней записи я получил те жи строки?
Не знаю. Я всего кода не видел. Возможно, дело в кавычках?
Не знаю. Я всего кода не видел. Возможно, дело в кавычках?
Кавычки и в сообщении, и в запросе одинарные.
Кавычки и в сообщении, и в запросе одинарные.
Не я писал код, не знаю )
dolonet, как насчет сделать FAQ по этому вопросу? т.е. по вопросам безопасности движков сайта? с примерами из личного опыта и распространенных продуктов?
Мысль, однако! )
Я создал и прилепил тему:
http://forum.codenet.ru/showthread.php?s=&threadid=27251