Учебный скрипт авторизации

Фанат

oncle terrible
Команда форума
Учебный скрипт авторизации

подумал тут недавно, что факу по сессиям не хватает практической части.
ну и решил наваять скриптец авторизации.
удовлетворяющий несколько противоречивым требованиям: предельная простота и при этом при этом возможность реального использования
получилось
PHP:
<?
if (isset($_POST['auth_name'])) {
  $name=mysql_real_escape_string($_POST['auth_name']);
  $pass=mysql_real_escape_string($_POST['auth_pass']);
  $query = "SELECT * FROM users WHERE name='$name' AND pass='$pass'";
  $res = mysql_query($query) or trigger_error(mysql_error().$query);
  if ($row = mysql_fetch_assoc($res)) {
    session_start();
    $_SESSION['user_id'] = $row['id'];
    $_SESSION['ip'] = $_SERVER['REMOTE_ADDR'];
  } 
  header("Location: http://".$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI']);
  exit;
}
if (isset($_GET['action']) AND $_GET['action']=="logout") {
  session_start();
  session_destroy();
  header("Location: http://".$_SERVER['HTTP_HOST']."/");
  exit;
}
if (isset($_REQUEST[session_name()])) session_start();
if (isset($_SESSION['user_id']) AND $_SESSION['ip'] == $_SERVER['REMOTE_ADDR']) return;
else {
?>
<form method="POST">
<input type="text" name="auth_name"><br>
<input type="password" name="auth_pass"><br>
<input type="submit"><br>
</form>
<? 
}
exit;
?>
Вставляется, соответственно, в защищаемый скрипт строчкой
require "auth.php";

приветствуются критические замечания по очевидным и неочевидным дырам
особо приветствуются предложения по упрощению структуры или кода.
усложнения принимаются только с весьма вескими обоснованиями.
 

HraKK

Мудак
Команда форума
Насколько я понимаю чтоб МуСкуль не искал дальше после нахождения совпадения.(см ман 5.2.8)
 

Фанат

oncle terrible
Команда форума
ну, то есть, если на name стоит уникальный индекс, то необязательно? вычеркиваем.
 

berkut

Новичок
говорят) что даже при наличии уникального индекса, LIMIT при выборке и изменении данных по этому индексу ускоряет запрос...
 

Фанат

oncle terrible
Команда форума
неверный логин и пароль влечет за собой сильное усложнение скрипта...
Хотя юзабилити требует, конечно, чтобы не молча форма перезагружалась, а была эта надпись...
 

AmdY

Пью пиво
Команда форума
не, и так хватит, а то народ не любит читать много буков.
нуна полезную информацию дробить и давать мелкими порциями, чтобы переваривали.
 

Beavis

Banned
нормальный скрипт, и не надо его делать сложнее) это же просто учебный пример а не полнофункциональный скрипт
 

fixxxer

К.О.
Партнер клуба
я так думаю что в целях обучения вполне.
если пихать всякие проверки, то они займут 80% кода и потеряется суть
 

rotoZOOM

ACM maniac
предельная простота и при этом при этом возможность реального использования
Насчет предельно простоты соглашусь, насчет реального использования ....
Может не надо новичков сразу пускать по весьма спорному пути и сохранять пароль в базе в открытом виде ?
может вместо
$pass=mysql_real_escape_string($_POST['auth_pass']);
ввести
$pass=md5($_POST['auth_pass']);
?
Ну и как говорил товарищ HraKK в виде ворчания:
SSL что-то не учитывается совсем ...
 

Gas

может по одной?
rotoZOOM
HraKK имел ввиду html-валидатор, не ssl. Да и далеко не всегда нужен/используется ssl для авторизованных пользователей.

Фaнат
хороший тестовый пример, но поддерживаю показ error msg
 

fixxxer

К.О.
Партнер клуба
>>говорят) что даже при наличии уникального индекса, LIMIT при выборке и изменении данных по этому индексу ускоряет запрос...

слышал звон :)
смотри explain да прибудет с тобой знание =)
 

berkut

Новичок
fixxxer
согласен, про селект уже даже и не вспомню где читал. а вот в недавней ветке про антиконфу кто-то головитый(на самом съезде) поделился сокровенным знанием, что DELETE ... WHERE id IN(..) - при id - PK, с LIMIT ом работает быстрее. обманул? или я тоже с эксплейном чёто не догоняю?

-~{}~ 23.02.08 21:26:

вот http://michael.mindmix.ru/294-007-vebovrubka.zhtml
т.е. афтар высказывания заблуждается ибо несмотрел в эксплейн??? каттед, вахх
 

fixxxer

К.О.
Партнер клуба
ну головой то надо думать ;)
там речь идет о
select * from table where id in (1,2,3,4)
vs
select * from table where id in (1,2,3,4) limit 4
тут in по сути разворачивается в or, и каждый id проходит 4 сравнения, потому без лимита перебор не остановится
в explain тут мы видим type=range

в случае же выборки по unique key и так понятно, что результат в единственном числе, и сразу дергается нужная строка
на что указывает type=const в explain
 

berkut

Новичок
спасибо за информацию) а почему where id in (1,2,3,4) по primary key перебор не остановится, хоть он разворачивается в or, ведь и так понятно, что может вернуться только 4 строки.
 

fixxxer

К.О.
Партнер клуба
ну потому что кол-во типов выборок ограничено. теоретически конечно оно понятно, что 4, но mysql все сводит к одному из типов. возможно какой-нибудь оракл такое и учитывает.
 
Сверху