|
|
|
| Здравствуйте господа программисты!!!
подскажите пожалуйста как мне написать скрипт авторизации который после авторизации откроет страницу пользователей... пожалуйста только подробно.... СПС заранее...
написал такой скрипт но мне самому не нравится :::
<?php
Error_Reporting(E_ALL & ~E_NOTICE);
include('scripts/connect.php');// подключение к серверу MySql и выбор БД
$userinfo='';
$state='0';
if( (isset($_COOKIE['login'])) & (isset($_COOKIE['password'])) ) {// если в куках лежит логин и зашифрованый пароля
if (!isset($_GET['exit'])) {// если кнопка выход не была нажата
$login=$_COOKIE['login'];
$pass=$_COOKIE['password'];
// проверяем наличие пользователя в БД и достаём оттуда пароль
$sql="SELECT id, password FROM info WHERE login='$login'";
$res=mysql_query($sql);
if(mysql_num_rows($res)>0){// если пользователь есть в БД
$userinfo = mysql_fetch_array($res);// в этой переменной лежит пароль из БД
if(strcmp($pass,md5($userinfo['password'])) == 0) { //проверяем схожесть пароля из БД с паролем из куков
// достаём все данные из БД
$sql="SELECT * FROM info WHERE login='$login'";
$res=mysql_query($sql);
$userinfo=mysql_fetch_array($res); // в этой переменной будет лежать вся информация о пользователе из БД
$time=time();
// устанавливаем куки для запоминания статуса пользователя
setcookie("login",$login,$time+1800);
setcookie("password",$pass,$time+1800);
$state = 1;// статус, если 1, тогда пользователь авторизован
}
}
} else {
//обнуляем куки, если была нажата кнопка выход
setcookie("login");
setcookie("password");
}
}
if($state != 1) {// если после проверки куков, оказалось, что пользователь не авторизован, то идем дальше
if( (isset($_POST['login'])) & (isset($_POST['password'])) ){ // если пользователь ввёл логин и пароль
$login = $_POST['login'];
// проверяем наличие пользователя в БД и достаём оттуда пароль
$sql = "SELECT id, password FROM info WHERE login='$login'";
$res = mysql_query($sql);
if(mysql_num_rows($res)>0) {// если пользователь есть в БД
$userinfo = mysql_fetch_array($res);// в этой переменной лежит пароль из БД и номер пользователя
$password = $_POST['password'];
if(strcmp($password,$userinfo['password'])==0){
// достаём все данные из БД
$sql="SELECT * FROM info WHERE login='$login'";
$res=mysql_query($sql);
$userinfo=mysql_fetch_array($res);// в этой переменной будет лежать вся информация о пользователе из БД
$time=time();
// устанавливаем куки для запоминания статуса пользователя, пароль шифруем
/* setcookie("login", $login, $time+1800);
setcookie("password", md5($password), $time+1800);*/
$state = 1;// статус, если 1, тогда пользователь авторизован
}
}
}
}
if($state != 1) {
?> | |
|
|
|
|
|
|
|
для: Max_imus
(13.04.2011 в 00:44)
| | Я бы за счет использования дополнительной функции и сравнения пароля непосредственно в SQL-запросе разделил бы логику авторизации и прием логина-пароля, кроме того настоятельно посоветовал бы экранировать кавычки в данных, которые поступают методом POST и COOKIE. Тогда бы ваш вариант авторизации можно было бы записать следующим образом
<?php
// Устанавливаем уровень тревожности
error_reporting(E_ALL & ~E_NOTICE);
// подключение к серверу MySql и выбор БД
include('scripts/connect.php');
function auth($login, $pass, $crypt = false)
{
$state = 0;
if(!$crypt) $p = "MD5('$pass')";
else $p = "'$pass'"
// проверяем наличие пользователя в БД и достаём оттуда пароль
$sql="SELECT COUNT(*)
FROM info
WHERE
login='$login' AND
`password` = $p";
$res = mysql_query($sql);
if(!$res) exit("Ошибка авторизации");
if(mysql_result($res, 0))
{
// если пользователь есть в БД
// продлеваем куки
setcookie("login",$login,$time+1800);
if(!$crypt) $pass = md5($pass);
setcookie("password",$pass,$time+1800);
// статус, если 1, тогда пользователь авторизован
$state = 1;
}
return $state;
}
$userinfo='';
$state=0;
if( (isset($_COOKIE['login'])) & (isset($_COOKIE['password'])) )
{
// если в куках лежит логин и зашифрованый пароля
if (!isset($_GET['exit']))
{
// если кнопка выход не была нажата
$login = $_COOKIE['login'];
$pass = $_COOKIE['password'];
// Если не включен режим магических кавычек
// экранируем спец-символы
if (!get_magic_quotes_gpc())
{
$login = mysql_escape_string($login);
$pass = mysql_escape_string($pass);
}
// Статус авторизации
$state = auth($login, $pass, true);
}
}
else
{
//обнуляем куки, если была нажата кнопка выход
setcookie("login");
setcookie("password");
}
// если после проверки куков, оказалось, что пользователь не авторизован, то идем дальше
if($state != 1)
{
// если пользователь ввёл логин и пароль
if( (isset($_POST['login'])) & (isset($_POST['password'])) )
{
$login = $_POST['login'];
$password = $_POST['password'];
// Если не включен режим магических кавычек
// экранируем спец-символы
if (!get_magic_quotes_gpc())
{
$login = mysql_escape_string($login);
$pass = mysql_escape_string($pass);
}
// Статус авторизации
$state = auth($login, $pass);
}
}
if($state != 1) {
}
?>
|
| |
|
|
|
|
|
|
|
для: Max_imus
(13.04.2011 в 00:44)
| | Скрипт, который я привел выше, написан в предположении, что и в базе данных у вас тоже лежит md5-хэш пароля, а не сам пароль. В базе данных стараются не хранить пароли в открытом виде. | |
|
|
|
|
|
|
|
для: cheops
(13.04.2011 в 10:51)
| | А достаточно ли надежный такой скрипт? Скажите его обойти легко и что ему не хватает например каких то функций, проверок? Например на крупных сайтах такие скрипты авторизаций наверное намного сложней | |
|
|
|
|
|
|
|
для: ruslanaxti
(13.04.2011 в 21:06)
| | Сложность скрипта, говорит как правило о непрофессионализме или плохо поставленной задачи, требования к которой изменялись на всем протяжении разработки и после самой разработки. Надежные вещи простые и очень короткие. Если в силу причин этого сделать нельзя - сложность упаковывают в библиотеку, чтобы сам конечный скрипт был простым и легко мог быть подвергнут ревизии, а его правка не вызывала ошибок.
Обойти можно все. Украв пароль и войдя по паролю, поэтому пароли нельзя оставлять на видном месте, можно украсть хэш-пароля из cookie при помощи трояна, поэтому необходимо следить за обновлениями антивируса, можно украсть хэш-пароля из cookie при помощи XSS-инъекции, поэтому необходимо следить, чтобы их не было на сайте, можно укарасть пароль, подслушивая HTTP-трафик, поэтому желательно для критичных логинов/паролей страницу аутентификации располагать на SSL-страницах (https://).
Больше ничем "на крупных сайтах такие скрипты авторизаций" не отличаются от приведенного выше (самое большая модификация - сессия интенсивнее используется). | |
|
|
|