Покритикуйте код авторизации

skeletor

Новичок
Покритикуйте код авторизации

Скажу сразу, код работает, просто интересно, может стоит где-то оптимизировать или поправить, как нужно.

Собственно имеем такую структуру:
connect.php - подключение к БД
functions.php - описание функций для обработки вводимых данных
index.php - страница с формой авторизации
login.php - авторизация
logout.php - выход
main.php - главная страница

Интересует правильно ли провожу авторизацию и выход.

login.php

PHP:
<?php

include 'functions.php';
include 'connect.php';

if (isset($_COOKIE['name'])) 
{
    header("Location: main.php");
    exit(0);
} 

if (!isset($fPassword) or !isset($fUsername))
{
    header("Location: index.php");
    exit(0);   
}

$table_admin = "admin";
$table_domain_admins = "domain_admins";

$result = mysql_query ("SELECT password FROM $table_admin WHERE username='$fUsername' AND active='1'");
$row = mysql_fetch_row($result);   
     
$password = pacrypt ($fPassword,$row['0']);
       
    if ($password == $row['0'])
    {
        session_start();
        session_regenerate_id();
        $sessid = session_id();
        setcookie("name",$fUsername,time()+3600);
        setcookie("sessid",$sessid,time()+3600);       
        header("Location: main.php");
        exit(0);
    }

    else die('error set cookies');

mysql_close();

if (!isset($_COOKIE['name'])) 
{
    header("Location: index.php");
    exit(0);
} 

?>

logout.php

PHP:
<?php

if (isset($_COOKIE['name']))
{
    session_start();
    setcookie('name', '', -1);
    session_destroy();  
}

header("Location: index.php"); 

?>
 

Вурдалак

Продвинутый новичок
PHP:
if (!isset($fPassword) or !isset($fUsername))
— и где они определяются?

PHP:
$result = mysql_query ("SELECT password FROM $table_admin WHERE username='$fUsername' AND active='1'")
— тут SQL injection, либо крайне грязно опеределяется $fUsername.

Native сессии сами устанавливают cookie с sid (точнее могут).

И наличие cookie name не является гарантом того, что пользователь прошёл авторизацию. Должна быть некая переменная в сессии, которую и следует проверять.
 

skeletor

Новичок
Добавил проверку:
PHP:
$fUsername = mysql_real_escape_string($fUsername);
$fPassword и $fUsername передаются из формы.

Должна быть некая переменная в сессии, которую и следует проверять.
А можно подробнее об этом?
 

Вурдалак

Продвинутый новичок
Автор оригинала: skeletor
Добавил проверку:
PHP:
$fUsername = mysql_real_escape_string($fUsername);
— это не проверка, но, в целом, правильно.

Автор оригинала: skeletor
$fPassword и $fUsername передаются из формы
http://phpfaq.ru/globals
http://php.net/manual/en/language.variables.superglobals.php

Автор оригинала: skeletor
А можно подробнее об этом?
PHP:
$_SESSION['logged_in'] = true;
А сейчас пользователь можно послать cookie и всё.
http://phpfaq.ru/sessions
http://php.net/manual/en/reserved.variables.session.php

Что за pacrypt()? На пустую строку что выдаёт? В любом случае нужно запрещать пустой пароль.
 

skeletor

Новичок
А если обработать через preg_replace? Например, так:
PHP:
$fUsername = preg_replace('/[^A-Za-z\s]/ui', '', $fUsername);
Тогда инъекции уже не будет. Так?
 
Сверху