Пожалуйста, оцените авторизацию

Spear

почемучка
Пожалуйста, оцените авторизацию

Написал авторизацию (ниже - код страницы, на которрую ссылается форма при авторизации).
Авотризирует вроде нормально, хотя ещё не тестил особо.

Хотелось бы узнать - насколько код взломоустойчивый?
Вроде и прослешил все, и спецсимволы нейтрализовал :)

ПОсмотрите, пожалуйста (правила читал, но урезать код некуда уже)
PHP:
<?php
removed
 

crocodile2u

http://vbolshov.org.ru
PHP:
if(!isset($HTTP_POST_VARS)) { Header("Location: no.php?e=2"); }
Вот эта строчка - к чему она?

Потом будем дальше разбирать :)
 

Фанат

oncle terrible
Команда форума
if(isset($_POST['login']) AND !empty($_POST['login']))
смешная шутка.
читай про емпти, исправляй
$login_incoming = htmlspecialchars($_POST['login'], ENT_QUOTES);
это ещё зачем?
$login_incoming = addslashes($login_incoming);
неправильно.
читай фак по слешам.
# проверяем наличие пароля
какой смысл проверять наличие пароля, если уже проверили логин.
назови хоть одну причину.
$password_incoming = htmlspecialchars($_POST['password'], ENT_QUOTES);
$password_incoming = addslashes($password_incoming);
$password_incoming = md5($password_incoming);
ХАХАХАХАХАХАХА!
Давно я так не смеялся!
Сначала мы заключённого свяжем. чтобы не убежал.
потом наденем наручники - чтобы не дрался.
а потом расстреляем. Для надёжности.

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

Spear

почемучка
crocodile2u
исправлю.

-~{}~ 26.08.05 10:41:

Фанат
Спасибо ! :)
Исправлю, почитаю ещё маны и опять сюда.
 

Фанат

oncle terrible
Команда форума
кстати, пассаж с паролем показывает ПОЛНУЮ неграмотность в вопросе - а зачем вообще делать аддслашес.
То есть, человек делает не потому, что понимает, как надо, а потому, что где-то слышал, что так надо
 

confguru

ExAdmin
Команда форума
Не будет работать такой пароль
PHP:
$password_incoming1="supp'erpass";
$password_incoming = addslashes($password_incoming1); 
echo md5($password_incoming)."\n";
echo md5($password_incoming1);
 

Spear

почемучка
Если я правильно понял замечание с addslashes и empty
PHP:
removed
лучше?
 

Фанат

oncle terrible
Команда форума
хуже
у тебя одна попытка
либо ты делаешь то, что тебе сказали, либо ищешь другое место для тестов.
понимать от тебя не требуется.
от тебя требуется пойти, ПРОЧЕСТЬ, и сделать, КАК НАПИСАНО

-~{}~ 26.08.05 11:17:

if(!isset($HTTP_POST_VARS))
заменить на реквест метод.

если ты проверяешь наличие поста, то проверки на существование логина и пароля не нужны вообще

пароль проверять прямо в запросе.

нумровс не нужно

и что у тебя там за сессии такие странные?
 

Spear

почемучка
Фанат
я прочел, серьезно. Не один раз :(
В мане написано, что любые данные ползователя нужно проверять.
Также сказано что вообще нужно убрать все слешы, НО Я НЕ ПОЙМУ ЗАЧЕМ, ведь чуть ниже пишут - что слешы нужны. я запутался окончательно.
Если уберу слеши, а зайдет пользователь Rock'n'Roll ?
Получается слешы нужны.
Сначала проверяю - не пославил ли сам РНР уже слешы (чтобы не делать двойное экранирование), и если не поставил - то ставлю.
Обьясни, пожалуйста - в чем ошибка.
 

Фанат

oncle terrible
Команда форума
про не один раз сказки бабушке своей расказывай.
один раз по диагонали

иди читай
не две строчки, а целиком.
там ВСЁ написано, ответы на ВСЕ твои вопросы.
почему надо убирать, почему надо добавлять
 

Spear

почемучка
заменить на реквест метод
можно по этому методу что-то почитать? непойму что это. Может и знаю но не знаючто оно так зовется.

если ты проверяешь наличие поста, то проверки на существование логина и пароля не нужны вообще
я, наверное, протсо не понимаю как работает эта проверка до конца.
В моем понимании - сначала я проверяю, есть ли вообще какие-то данные в ПОСТЕ (ведь там может быть или логин, или пароль, или они вместе)
Потом проверяю и логин и пароль - указали ли их при авторизации.
ОЧЕНЬ ПРОШУ - обхясни, если я не так понимаю.
 

Фанат

oncle terrible
Команда форума
REQUEST_METHOD

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

Spear

почемучка
Фанат
нумровс не нужно
как тогда узнать что запись только одна? вдруг произошла ошибка при регистрации или ещё что - и создалось две записи. Или все-таки не надо?

-~{}~ 26.08.05 12:17:

и что у тебя там за сессии такие странные?
это я из Invision взял генерацию сессии.
 

Фанат

oncle terrible
Команда форума
ошибку при регистрации и надо отлавливать при регистрации.

вот в инвизионе своём тогда и спрашива про дырявость аторизации.
 

Spear

почемучка
Фанат
нет, авторизацию я с нуля писал. В инвижене взял только код:
$session_id = md5(uniqid(microtime()));

даже не взял - просто он у меня "завалялся", я его и раскопал.
Ещё нужно в авторизацию дописать начало сессий.
 

Фанат

oncle terrible
Команда форума
ну так выкини этот код
ну так добавь старт сессии

что получилось в итоге?

кука, которую ты ставишь - дыра.
зачем код постановки куки вынесен в функцию?
 

Spear

почемучка
Фанат
я все-таки решил использовать сессии.
А насчет дырявости куки - можно по-подробнее? Какой вид лучше делать? Сейчас сессия делается так (также как делалась кука):

session_start();
$_SESSION['user']=base64_encode($setinfo['id'].":".$_POST['login'].":".$pass);
 

Фанат

oncle terrible
Команда форума
в сессии делай по-человечески.
зачем ты кодируешь?
зачем пишешь всё в строку?
зачем тебе вообще в сессии пароль?

что получилось в итоге?
 

Spear

почемучка
секундочку, разберусь с сессиями (я фак читаю, снова :)).
Зачем в сессии пароль - уже не нужен. И сессию буду по другому делать.

-~{}~ 26.08.05 13:17:

вот. По поводу слешей - прочитал фак от буквы до буквы. Сделал так, как понял (убрал, если были, прослешил "правильно" прямо при щзапросе в базу).

PHP:
<?php
require_once("general_conf.php");

   if(!$_SERVER["REQUEST_METHOD"]) { 
   Header("Location: index.php?e=no_vars");
   exit; }

    # как в мануале сказано - если РНР поставил, то убираю слеши
  	if (get_magic_quotes_gpc()) {
  	$_POST['password'] = stripslashes($_POST['password']);
	$_POST['login'] = stripslashes($_POST['login']); }
    # хеш, чтобы сравнить с паролем в базе - там хранятся хеши паролей
    $password_md5 = md5($_POST['password']);

    $sql = "SELECT password, id FROM users WHERE account='".mysql_real_escape_string($_POST['login'])."'";
    $result = $db->sql_query($sql);
    $setinfo = $db->sql_fetchrow($result);
    
    if (($setinfo['id'] != "") AND ($setinfo['password'] != ""))
    {
     	$pass=$setinfo['password']; // пароль этого акаунта в БД, md5
		# пароль неверный, бб
  		if ($pass !== $password_md5) { Header("Location: index.php?e=1"); return; exit; }	
		# пароль верный
		if ($pass == $password_md5)
		{
		 session_start();
		 $_SESSION['id']=$setinfo['id'];
		 $_SESSION['login']=$_POST['login'];
		 Header("Location: main.php");
		}
	} else { Header("Location: index.php?e=1"); return; exit; }	

?>
 

Фанат

oncle terrible
Команда форума
ты не читаешь целиком.
очень скучно повторять по два раза.

зачем ты слешишь пароль?
почему не проверяешь пароль сразу в запросе?

зачем проверка if (($setinfo['id'] != "")?
 
Сверху