Всегда при держивался логики: всё гениальное, просто.
К данной пословице частично подходит авторизация, которую сделал Кот Да Винчи в своём личном кабинете.
Изначально выглядит так:
Код:
if (isset($_POST['auth_name']))
{
$par= SHA1(strtoupper($_POST['auth_name']).':'.strtoupper($_POST['auth_pass']));
$cont = mysql_connect($r_ip, $r_userdb, $r_pw);
mysql_select_db($r_db, $cont);
mysql_query("SET NAMES '$encoding'");
$res = mysql_query('SELECT * FROM `account` WHERE `username`="'.strtoupper(addslashes($_POST['auth_name'])).'" AND sha_pass_hash ="'.$par.'"');
if ($row = mysql_fetch_assoc($res))
{
session_start();
$_SESSION['user_id'] = (int)$row['id'];
$_SESSION['ip'] = $_SERVER['REMOTE_ADDR'];
$_SESSION['kito'] = strtoupper($_POST['auth_name']);
$_SESSION['slovo'] = strtoupper($par);
$_SESSION['gnom'] = (int)$row['gmlevel'];
$_SESSION['modul'] = 'news';
$_SESSION['acpskin'] = $acpskin;
}
header("Location: http://".$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI']);
exit;
}
Ничего сверхъестественного, всё просто и доступно.
Ну особые параноики (я сам оказался таковым
) могут добавить ещё некий хеш (допустим, добавим к таблице account поле hash) + DBSimple и получим такой вариант:
Код:
session_start();
if( isset( $_POST['accountName'] )) {
$passw = SHA1(strtoupper(trim($_POST['accountName'])).':'.strtoupper(trim($_POST['password'])));
$name = strtoupper(trim($_POST['accountName']));
$member_check = $realmd->selectRow('SELECT `id`, `gmlevel` FROM `account` WHERE `username` = ? AND sha_pass_hash= ?', $name, $passw);
if ($member_check['id']) {
$_SESSION['user_id'] = $member_check['id'];
$_SESSION['user_ip'] = $_SERVER['REMOTE_ADDR'];
$_SESSION['gmlevel'] = $member_check['gmlevel'];
$_SESSION['template'] = $config['templates'];
$_SESSION['hash'] = md5($member_check['id'].'_'.$_SERVER['REMOTE_ADDR'].date('d.m', time()));
$realmd->query('UPDATE `account` set `hash` = ? WHERE `id`= ?', $_SESSION['hash'], $member_check['id']);
}
header("Location: http://".$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI']);
}
При использовании проверяем ещё и наличие такового хеша в базе. Для ещё больших фанатиков можно предложить контролить изменение IP адреса + какого-нибудь случайного "довеска" к нему. Но на самом деле, на фоне того, что сессии подделать/украсть невозможно, всё это как-то даже не смотрится...
p.s. Само собой все введённые данные (логин и пароль) должны дополнительно проверяться на валидность с помощью регулярных выражений.