[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Покритикуйте систему авторизации
Fredrich
Ребят поросьба покретикуйте систему авторизации, покажите или расскажите какие есть дыры и как можно ее модернизировать для сайта с одной точкой входа


<?php 
if (isset($_SESSION['id']))
{

header("Location: index.php"); exit();
}


if(isset($_POST['login']) && isset($_POST['password']))
{
$login = trim(htmlspecialchars($_POST['login']));
$password =trim(htmlspecialchars($_POST['password']));

if(!empty($login) && !empty($password))
{
$query = "SELECT id
FROM users
WHERE login = '"
.mysql_real_escape_string($login)."' and password = '".mysql_real_escape_string($password)."'";

$select_user = mysql_query($query) or die(mysql_error());
$num_user = mysql_num_rows($select_user);
if($num_user == '1')
{
$result_user = mysql_fetch_assoc($select_user);
$_SESSION['id'] = $result_user['id'];
header("Location: index.php"); exit();
}
else
{
echo('Логин или пароль введен не верно!');
}
}


else
{
echo('Логин или пароль не введен!');
}
}

else
{
echo ('Авторизируйтесь пожалуйста');
}




Спустя 1 час, 20 минут, 23 секунды (7.05.2011 - 22:42) inpost написал(а):
Fredrich
Стиль ужасный, подправь и выложи ещё раз уже с нормальным стилем.
Вот требования: http://irbis-team.com/15/1/8 , примеры хорошего стиля можешь посмотреть на конкурсе, там в первых работах показано.
Действия внутри цикла выделяются на +4 пробела.
echo - это не функция, поэтому скобки не нужны.
не надо выводить на белом экране echo, тебе надо отправить в переменную данные и вывести именно в нужном месте на странице эту переменную.
Пароли нельзя хранить без md5.
htmlspecialchars для логина нельзя применять, иначе логин будет существенно отличаться от того, который пожелал автор, что в своём роде неправильно.

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

Спустя 11 минут, 55 секунд (7.05.2011 - 22:53) alex12060 написал(а):

<?php
if (isset($_SESSION['id']))
header("Location: index.php"); exit;

if (isset($_POST['login']) && isset($_POST['password'])) {
$login = trim($_POST['login']);
$password = trim($_POST['password']);

$query = "SELECT `id`
FROM `users`
WHERE `login` = '"
.mysql_real_escape_string($login)."'
AND `password` = '"
.mysql_real_escape_string($password)."'";

$select_user = mysql_query($query) or die(mysql_error());
$num_user = mysql_num_rows($select_user);

if ($num_user > 0) {
$result_user = mysql_fetch_assoc($select_user);
$_SESSION['id'] = (int)$result_user['id'];
header("Location: index.php");
exit;
} else {
die('Логин или пароль введен не верно!');
}
}
else {
die('Логин или пароль не введен!');
}
?>


По мне так красивей и лучше.

Спустя 8 минут, 16 секунд (7.05.2011 - 23:02) neadekvat написал(а):
alex12060, зачем два и более пробелов между переменной и равно?
Лишние фигурные скобки.
Каждый новый оператор писать лучше на новой строке (первый exit), на одном горизонтальном отступе (второй exit)
В запросе AND выглядит как самостоятельная команда, а не часть WHERE.
Для одной строки нет смысла использовать mysql_num_rows.

В целом код выглядит как пример или небольшая библиотека.
Настоящий код так хрен выровняешь - нервов не хватит на пробел столько жать.

Спустя 7 минут, 10 секунд (7.05.2011 - 23:09) alex12060 написал(а):
neadekvat

Цитата
зачем два и более пробелов между переменной и равно?
Цитата
Лишние фигурные скобки.


Где?

Цитата
В запросе AND выглядит как самостоятельная команда, а не часть WHERE.


Соглашусь.

Цитата
Для одной строки нет смысла использовать mysql_num_rows.


А что лучше использовать?

Спустя 3 минуты, 6 секунд (7.05.2011 - 23:12) neadekvat написал(а):
1. При объявлении свойств это, может, нормально смотрится. Но в текущем коде не стоит доходить до фанатизма, имхо.

2.
else {
die('Логин или пароль введен не верно!');
}

=>
else
die(...);


4. Ничего. Делаешь mysql_fetch_assoc и проверяешь вернувшийся массив.

Спустя 3 минуты, 8 секунд (7.05.2011 - 23:15) alex12060 написал(а):
Конечно, филосовский вывод, но по-моему, лучше проверить, есть ли что из запроса, а потом собирать массив, а не проверять массив.

с num_rows() жить легче, но она увеличивает код.

Хм, я думал не прокатит без скобок на else , но реально работает. Ух, форум форум, опыт бесценный.

Спустя 7 минут, 23 секунды (7.05.2011 - 23:22) neadekvat написал(а):
Цитата (alex12060 @ 8.05.2011 - 00:15)
Хм, я думал не прокатит без скобок на else , но реально работает. Ух, форум форум, опыт бесценный.

Без скобок работает все, что работает со скобками. Почти. И только "в течение" одного оператора.

Цитата (alex12060 @ 8.05.2011 - 00:15)
Конечно, филосовский вывод, но по-моему, лучше проверить, есть ли что из запроса, а потом собирать массив, а не проверять массив.

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

Спустя 1 час, 31 минута, 1 секунда (8.05.2011 - 00:53) inpost написал(а):
neadekvat
Ну что ж, критика на критику критики, то есть тебя критикуем :)
Ну для начала, мог бы всю свою критику на конкурс отправить, она там очень нуждается в тебе :)

В запросе AND выглядит как самостоятельная команда, а не часть WHERE.
Я всегда пишу:
WHERE `
AND `
AND `
AND `

То есть 2 пробела от WHERE, тогда видно, что она и внутри WHERE, а не как отдельный, но и с новой строчки.

Для одной строки нет смысла использовать mysql_num_rows.
Если таблица пустая, а ты сразу mysql_fetch_assoc сделаешь, то получешь error или warning, по крайней мере у меня постоянно апач возвращает, поэтому я использую mysql_num_rows.

Лишние фигурные скобки.
Тут ты абсолютно неправ, это разные стили кодирования, оба, кстати, считаются правильными. При этом у сокращенного вида, как ты показал, куда больше минусов, чем плюсов. Я его использую только при самой глубокой вложенности, где нет внутри других циклов.


А теперь критикую критикующего:
Если $num_user = 0, это false, если не 0, значит true, поэтому достаточно писать:
if($num_user) , без знаков > 0.
В добавок, так лучше вообще без лишней переменной:
if(mysql_num_rows($select_user)) {

$_SESSION['id'] = (int)$result_user['id'];
- тут (int) лишнее, так как мускул не пропустит не INT в ячейку integer в БД.

if (isset($_SESSION['id'])) header("Location: index.php"); exit; - всегда вернёт exit, потому что ты написал бурду:
if (isset($_SESSION['id'])) {
header("Location: index.php");
}
exit;


Ну и последнее, isset($_POST,$_POST) - можно объединять.

Спустя 7 часов, 35 секунд (8.05.2011 - 07:54) Fredrich написал(а):
Ну а что можно с безопасностью сделать?

Спустя 2 часа, 41 минута, 38 секунд (8.05.2011 - 10:36) neadekvat написал(а):
Цитата (inpost @ 8.05.2011 - 01:53)
Ну для начала, мог бы всю свою критику на конкурс отправить, она там очень нуждается в тебе smile.gif

Там таких мыслей не рождается ввиду большого количества кода.

Цитата (inpost @ 8.05.2011 - 01:53)
То есть 2 пробела от WHERE, тогда видно, что она и внутри WHERE, а не как отдельный, но и с новой строчки.

А вот тут как раз видно, что команда входит в WHERE, да, а разве я не за это выступаю?)

Цитата (inpost @ 8.05.2011 - 01:53)
Если таблица пустая, а ты сразу mysql_fetch_assoc сделаешь, то получешь error или warning, по крайней мере у меня постоянно апач возвращает, поэтому я использую mysql_num_rows.

И какая же там ошибка? Приведи ее текст.

Цитата (inpost @ 8.05.2011 - 01:53)
Тут ты абсолютно неправ, это разные стили кодирования, оба, кстати, считаются правильными.

Нет, я еще не встречал стиль, в котором было бы сказано: "Обязательно используйте фигурные скобки". Есть принцип расстановки этих скобок, но ставить их или нет - решает программист.
Так вот, если будет вложенная структура if..else, каждый по одной строке, и везде будут стоять эти скобки - ты на стену полезешь. Больше хлама на экране, чем полезной информации. Горизонтальный отступ прекрасно справляется с обозначение кода, который надо выполнить.

Цитата (inpost @ 8.05.2011 - 01:53)
- тут (int) лишнее, так как мускул не пропустит не INT в ячейку integer в БД.

Не согласен. Это привычка, и очень хорошо, когда ее не нарушают. От одного вызова (int) хуже не станет.

Спустя 6 часов, 13 минут, 19 секунд (8.05.2011 - 16:49) Mirexzpalich написал(а):
Я б вот это чучуть переписал б

$num_user = mysql_num_rows($select_user);

if ($num_user > 0) {
$result_user = mysql_fetch_assoc($select_user);
$_SESSION['id'] = (int)$result_user['id'];// Такое насильственно привидение типов для CИ полезно
// тут и без него все норм будет

header("Location: index.php");
exit;
} else {
die('Логин или пароль введен не верно!');
}
}
else {
die('Логин или пароль не введен!');
}

на

if (mysql_num_rows($select_user)) {
$result_user = mysql_fetch_assoc($select_user);
$_SESSION['id'] = $result_user['id'];
header("Location: index.php");
exit;
} else
die('Логин или пароль введен не верно!');
} else
die('Логин или пароль не введен!');

Кста, что сессию-то не стартуешь? Или подключаешь файл куда-то?

Спустя 1 час, 29 минут, 20 секунд (8.05.2011 - 18:18) inpost написал(а):
neadekvat
Я её уже приводил ранее на форуме, под рукой нет кода, где её могу показать, так что код не покажу.
Я знаю эксперта, который никогда сокращенно без скобок не использует, и это его право, зачем навязывать свою мысль, если ему так удобнее?

Спустя 4 минуты, 21 секунда (8.05.2011 - 18:23) neadekvat написал(а):
Цитата (inpost @ 8.05.2011 - 19:18)
Я знаю эксперта, который никогда сокращенно без скобок не использует, и это его право, зачем навязывать свою мысль, если ему так удобнее?

А я знаю эксперта, который не использует скобки, когда их можно не использовать и считает, что для читабельности это очень важно, и я с ним полностью согласен и тоже отстаиваю это мнение.
Бывают случаи, когда я специально ставлю эти скобки - но читабельности ради. Правда, это бывает редко, я даже воссоздать ситуацию не смогу.

Спустя 7 минут, 11 секунд (8.05.2011 - 18:30) inpost написал(а):
neadekvat
Ты слишком категоричен в этом вопросе, хотя вопрос не относится к программированию, а к вопросу удобства.

Спустя 4 минуты, 3 секунды (8.05.2011 - 18:34) neadekvat написал(а):
Цитата (inpost @ 8.05.2011 - 19:30)
Ты слишком категоричен в этом вопросе, хотя вопрос не относится к программированию, а к вопросу удобства.

Код фанатика кавычек:
if (cond) {
if (cond) {
if (cond) {
echo 0;
} else {
echo 1;
}
}
else {
echo 0;
}
}
else {
if (cond) {
if (cond) {
echo 0;
} else {
echo 1;
}
}
else {
echo 0;
}
}


Мой вариант:
if (cond)
if (cond) {
if (cond)
echo 0;
else
echo 1;
} else
echo 0;
else
if
(cond) {
if (cond)
echo 0;
else
echo 1;
} else
echo 0;


Если ты скажешь, что первый вариант читабельнее - то ты скажешь это только из принципа :)

Спустя 33 минуты, 28 секунд (8.05.2011 - 19:07) Fredrich написал(а):
Ребята Вы отклонились от сути вопроса!!! Вопрос был не о качестве внешнего вида кода, а о его работоспособности. Так как я делаю проект первый раз и для себя о красоте кода не может быть и речи.

Спустя 3 минуты, 55 секунд (8.05.2011 - 19:11) neadekvat написал(а):
Fredrich, во-первых, речь не только может быть, а должна быть. Во-вторых, в первом же ответе тебе предложили ссылку, по которой можно выровнять нормально код. От тебя мы так его и не увидели - поэтому обсуждаем другие темы.
Невозможно, пойми, что-то сказать о коде, который непонятно написан.

Спустя 10 минут, 3 секунды (8.05.2011 - 19:21) Fredrich написал(а):
Цитата (neadekvat @ 8.05.2011 - 16:11)
От тебя мы так его и не увидели - поэтому обсуждаем другие темы.
Невозможно, пойми, что-то сказать о коде, который непонятно написан.

насчет этого я согласен полностью



У меня вот еще вопрос такого плана как лучше сделать переклячатель по модулям:

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

такого вида
?page=main&action=login 

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

Спустя 9 минут, 56 секунд (8.05.2011 - 19:31) Игорь_Vasinsky написал(а):
Цитата
?page=main&action=login

а вчём проблема?
назание модуля тебе известно dry.gif

Спустя 1 минута, 40 секунд (8.05.2011 - 19:33) ИНСИ написал(а):
Fredrich Я бы наверное так сделал бы:

if($_SESSION['id']) {
header("Location: index.php");
exit();
}

if($_POST['login'] && $_POST['password']) {
function safesql($source) {
$source = trim($source);
if(get_magic_quotes_gpc()) $source = stripslashes($source);
return htmlspecialchars(mysql_real_escape_string($source));
}

$query = mysql_query("
SELECT `id`
FROM `users`
WHERE `login` = '"
.safesql($_POST['login'])."' AND `password` = '".safesql($_POST['password'])."'
LIMIT 1
"
) or die(mysql_eror());

if(mysql_num_rows($query) > 0) {

$data = mysql_fetch_assoc($query);
$_SESSION['id'] = (int)$data['id'];

header("Location: index.php");
exit();

} else {
exit('Логин или пароль не введен!');
}
}

Спустя 1 минута, 47 секунд (8.05.2011 - 19:35) Игорь_Vasinsky написал(а):
Цитата
WHE0RE `login` = '".safesql

подкорректируй wink.gif

Спустя 1 минута, 33 секунды (8.05.2011 - 19:36) ИНСИ написал(а):
Игорь_Vasinsky да ) Я тоже заметил, скопировал код автора smile.gif

Спустя 20 минут, 5 секунд (8.05.2011 - 19:56) Fredrich написал(а):
Цитата (velbox @ 8.05.2011 - 16:36)
а вчём проблема?
назание модуля тебе известно


Я имею ввиду как правильно или это личная фантазия

Спустя 5 минут, 35 секунд (8.05.2011 - 20:02) Игорь_Vasinsky написал(а):
Цитата
Я имею ввиду как правильно или это личная фантазия

только не переусердствуй wink.gif


Спустя 1 минута, 54 секунды (8.05.2011 - 20:04) Fredrich написал(а):
я имел ввиду в главном индексе распределить по блоком переклячения модулей

Спустя 19 минут, 13 секунд (8.05.2011 - 20:23) Игорь_Vasinsky написал(а):
switch -> case, на irbis-team.ru есть пример, не примере паттерна mvc

Спустя 12 минут, 24 секунды (8.05.2011 - 20:35) Fredrich написал(а):
Я по нему и делаю но там только 2 модуля в котором подключаеться только один контроллер, а у меня более сложная структура

Спустя 15 минут, 24 секунды (8.05.2011 - 20:51) Игорь_Vasinsky написал(а):
а для чего? чтоб скучно не было?

Спустя 3 минуты, 55 секунд (8.05.2011 - 20:55) Fredrich написал(а):
Цитата (Игорь_Vasinsky @ 8.05.2011 - 17:51)
а для чего? чтоб скучно не было?

В смысле? Для того что бы более структурно понятнее было

Спустя 9 минут, 45 секунд (8.05.2011 - 21:05) Игорь_Vasinsky написал(а):
покажи схематично как переключаешь модули, что подключаешь, как подключаешь

Спустя 25 минут, 58 секунд (8.05.2011 - 21:31) Fredrich написал(а):
первый модуль отвечает за работу с пользователями которые не зарегистрированные
Второй работает с зарегистрироваными
Третий Это администраторский модуль


Я хочу сделать таким способом

1 модуль будет подключен по параметру page=main

и тут проводит пользовалетель манипуляции по средству нажатия ссылок с параметром action = (к примеру) FAQ и ссылка будет иметь вид
index.php?page=main&action=faq
и так все остальные

Где то вот так

Спустя 6 минут, 26 секунд (8.05.2011 - 21:37) Игорь_Vasinsky написал(а):
Цитата
первый модуль отвечает за работу с пользователями которые не зарегистрированные
Второй работает с зарегистрироваными
Третий Это администраторский модуль


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

Зачем делать копии самих себя, когда можно и нужно писать 1 модуль, который с не авторизированными работает так, а с авторизиренными - расширенно, а надо то всего сделать проверку на наличие логина в сессии ;)

index.php?page=main&action=faq


а ссылки
index.php?page=main
index.php?page=faq
index.php?page=admin


или ты весь php решил в сайт вложить, только пользователь то ни чего не увидит ;)

Спустя 18 минут, 17 секунд (8.05.2011 - 21:55) Fredrich написал(а):
да конечно есть проверка на существование сесии она и являеться переключателем с модуля работы с не авториризированого пользователя на залогиного, а что с сылками не так?

Спустя 21 минута, 43 секунды (8.05.2011 - 22:17) inpost написал(а):
Fredrich
Для пароля: md5

Velbox
Не надо ни пароль, ни логин обрабатывать htmlspecialchars, потому что входящие данные надо либо на уровне формы фиксировать, либо заносить их именно такими, какие сделал автор. Уж тем более для пароля, так как его всё равно через md5 прогоняют.

Спустя 15 минут, 17 секунд (8.05.2011 - 22:32) Fredrich написал(а):
а насчет структуризации что скажешь, см. выше

Спустя 3 минуты, 23 секунды (8.05.2011 - 22:36) inpost написал(а):
Fredrich
я написал всё на первой странице. Когда ПОЛНОСТЬЮ всё исправишь и перепишешь, тогда можно говорить дальше.

Спустя 8 часов, 4 минуты, 55 секунд (9.05.2011 - 06:41) ИНСИ написал(а):
inpost согласен с тобой, что надо использовать вариант автора при занесении данных в БД, но если мы вытаскиваем определенную запись, надо обезопасить через htmlspecialchars, ведь данные можно подставить при выборке.

Спустя 38 минут, 13 секунд (9.05.2011 - 07:19) inpost написал(а):
velbox
ну это уже при выводе: echo htmlspecialchars($row['login']);


_____________
Видео уроки по Yii
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.