|
|
|
| Верна ли логика скрипта авторизации (файл index.php):
<?php
session_start();
if (!empty($_POST['login']) && !empty($_POST['passw']))
{
if (!get_magic_quotes_gpc())
{
$_POST['login'] = mysql_escape_string($_POST['login']);
$_POST['passw'] = mysql_escape_string($_POST['passw']);
}
$query = "SELECT user, pass FROM auth WHERE id=1";
$usr = mysql_query($query);
if (!$usr) exit('Ошибка авторизации');
if ($_POST['login'] == mysql_result($usr, 0, 'user'))
{
$pass = mysql_result($usr, 0, 'pass');
$result = md5($_POST['passw']);
if ($result == mysql_result($usr, 0, 'pass'))
{
$_SESSION['id'] = md5(mysql_result($usr, 0, 'user').$result);
header('Location: edit.php');
}
else
echo "Ошибка";
}
else
echo "Ошибка";
}
else
echo "Ошибка";
?>
|
В файле edit.php примерно будет так:
1. начать сессию
2. проверить, совпадает ли хеш логина и пароля. Если нет, то функцией exit() прерываем работу скрипта. Если все правильно, то пускаем дальше. | |
|
|
|
|
|
|
|
для: Manwen
(07.04.2011 в 15:20)
| | Хм... а у вас будет только один пользователь (c id = 1)? | |
|
|
|
|
|
|
|
для: cheops
(07.04.2011 в 15:29)
| | Да. Это небольшой блог. Думаю не нужно будет много записей, поэтому я вбил в базу одного пользователя. | |
|
|
|
|
|
|
|
для: Manwen
(07.04.2011 в 15:30)
| | Может тогда вообще id исключить из системы (и пользоваться LIMIT 1)?
Нарушений логики вроде нет, но не понятно зачем хэш пароля в сессии (вы же не будете его нигде на странице подставлять)? | |
|
|
|
|
|
|
|
для: cheops
(07.04.2011 в 16:22)
| | Хеш в сессии наверно плохая идея, но лучше я ничего пока не придумал, чтобы на другой странице определить авторизован ли админ или нет.
Я пробовал подставлять константу при успешной авторизации, к примеру так: if(!defined("IN_ADMIN")) die; , но другой файл не видит что я авторизовался и прерывает выполнение. | |
|
|
|
|
|
|
|
для: Manwen
(07.04.2011 в 16:41)
| | Сессия только вам доступна для редактирования - поместите в неё флаг, просто цифру 1. Без авторизации этот флаг не получить и хэш храниться не будет, а то мало ли где выведется случайно. | |
|
|
|
|
|
|
|
для: cheops
(07.04.2011 в 17:08)
| | А можно в сессию константу загнать? Например, в этой статье http://www.softtime.ru/info/articlephp.php?id_article=34 используется константа define("IN_ADMIN", TRUE); и она проверяется в каждом файле.
Вот только как бы мне эту проверку "элегантней" реализовать. | |
|
|
|
|
|
|
|
для: Manwen
(07.04.2011 в 19:17)
| | Константу нет, но можно использовать переменную. Присвойте ей любое значение, хотя бы тоже true и проверяйте. | |
|
|
|
|
|
|
|
для: cheops
(07.04.2011 в 19:37)
| | Если я в таблице сделаю еще одно поле, например "code" и при успешной проверке я буду в $_SESSION['id'] загонять хеш поля "code", а в другом фале буду проверять: есть ли этот хеш в $_SESSION['id'].
Это будет глупо или можно прибегнуть даже к такому способу? | |
|
|
|
|
|
|
|
для: Manwen
(07.04.2011 в 21:42)
| | А зачем такие сложности? Злоумышленники все-равно до значений внутри сессии добраться не смогут. | |
|
|
|
|
|
|
|
для: cheops
(07.04.2011 в 22:32)
| | Думал как лучше :)
Спасибо Игорь Вячеславович за помощь. Буду теперь дальше двигаться. | |
|
|
|
|
|
|
|
для: Manwen
(07.04.2011 в 15:20)
| | Вот этот блок я все-таки считаю лишним,
<?php
if (!get_magic_quotes_gpc())
{
$_POST['login'] = mysql_escape_string($_POST['login']);
$_POST['passw'] = mysql_escape_string($_POST['passw']);
}
|
так как вы в запросе не используете ни
$_POST['login'] ни $_POST['passw'] , более того если вы храните в базе какой-нибудь не стандартный логин(d'artanyan, допустим) и будете в форме указывать его, то в $_POST['login'] вы получите d\'artanyan, а из базы вытащите d'artanyan, и в итоге долго будете мучаться и думать почему не срабатывает условие
<?
if ($_POST['login'] == mysql_result($usr, 0, 'user'))
|
Думаю это можно считать ошибкой в логике
Есть еще пару замечаний, но они не очень существенные | |
|
|
|
|
|
|
|
для: tvv123456
(07.04.2011 в 18:29)
| | Да, точно. Я же базе данных не передаю значения из полей ввода. Хотя эта проверка не помешает, мало ли.
А какие замечания? | |
|
|
|
|
|
|
|
для: Manwen
(07.04.2011 в 21:23)
| | >Да, точно. Я же базе данных не передаю значения из полей ввода.
> Хотя эта проверка не помешает, мало ли.
Ну, я написал какая пакость может быть от этого "мало ли", и вообще когда составляете запросы к базе лучше в этом запросе и обрабатывать все входящие данные(предварительно почистив от маг. кавычек)
<?
//чистим POST от маг. кавычек если такие включены
//так как ПОСТ чистый, то спокойно можем делать всякие проверки
$sql = "SELECT * FROM table WHERE filed1=".(int)$_POST['integer']."
OR filed2=".mysql_real_escape_string($_POST["string"]);
$query = mysql_query($sql);
//и дальше можем использовать ПОСТы так как они не захламлены экранирующими слешами
|
-и никогда не будет конфликта при сравнении(то что я выше написал)
>А какие замечания?
Несущественные:
mysql_escape_string уже вроде как устарел
Очень много else подряд: для меня привычней, если условие не выполняеться(сравнение логинов вернуло false), то просто формируем отчет об ошибочке и завершаем работу скрипта. И не будет ни одного else и проще логику проследить. Но это мое субъективное мнение | |
|
|
|