Модераторы: skyboy, MoLeX, Aliance, ksnk

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Авторизация на форуме, оцените, посоветуйте что исправить 
:(
    Опции темы
sugee
Дата 22.5.2006, 17:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 423
Регистрация: 12.6.2005

Репутация: 1
Всего: 4



Привет всем. Есть у меня одна небольшая просьба.
Вот начал форум писать, закончил вроде систему регистрации-авторизации,  но есть сомнения...
Насколько всё это надёжно, какие есть дыры в безопасности, что нужно исправить или улучшить?

Посмотреть и потестировать можно здесь http://restoran-kaz.ho.com.ua/forum/ 

Исходный код я присоединил, так что сами скрипты я сюда постить не буду, покажу только
структуру БД
Код

use `forum`;

CREATE TABLE `header`
(
  `parent` INT NOT NULL, 
  `author` char(25) NOT NULL,
  `title` char(50) NOT NULL,
  `child` INT DEFAULT 0 NOT NULL,
  `view` INT DEFAULT 0 NOT NULL,
  `area` INT DEFAULT 1 NOT NULL,
  `posted` INT(10) not null,
  `postid` SMALLINT NOT NULL AUTO_INCREMENT, 
   PRIMARY KEY ( `postid` )
);


CREATE TABLE `message`
(
  `postid` INT UNSIGNED NOT NULL AUTO_INCREMENT,
  `posted` INT(10) not null,
  `mess` TEXT, 
   PRIMARY KEY ( `postid` ) 
);


CREATE TABLE `members` 
(
  `id` SMALLINT NOT NULL AUTO_INCREMENT,
  `name` varchar(40) NOT NULL,
  `time` INT(14) NOT NULL,
  `securid` TINYTEXT NOT NULL,
  `password` TINYTEXT NOT NULL,
  `messages` INT DEFAULT 0 NOT NULL,   
   PRIMARY KEY ( `id` ) 
);


Для авторизации используется таблица members.

Код я подробно прокомментировал, особо меня интересует вот этот момент
Код

//хэш безопасности который формируется из логина и уникального //времени регистрации  при регистрации он записывается в БД и в //cookie, а при авторизации используется для  извлечения имени //пользователя из БД (имя присваивается переменной сессии)  
//**************************************************************************************
function getsecurid( $user_name , $reg_time )
 {  return sha1( $user_name ) . sha1( $reg_time );  }



Я основывался на алгоритме описанном вот здесь http://vingrad.ru/PHP-PHPSCRIPTS-002849, но насколько эффективно
у меня эта идея реализована?  Я не вводил ограничений на браузер или на IP, но хотел по возможности исключить
возможность подмены куки.



P.S. Естественно дальше всё будет усложняться, поскольку будут разные уровни доступа: админы,  модераторы, обычные пользователи.   

Присоединённый файл ( Кол-во скачиваний: 25 )
Присоединённый файл  forum.rar 9,37 Kb
PM MAIL   Вверх
smartov
Дата 22.5.2006, 18:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


свой собственный
****


Профиль
Группа: Экс. модератор
Сообщений: 4225
Регистрация: 2.2.2006
Где: NJ

Репутация: 7
Всего: 259



Мне кажется что те скрипты что ты выложил не отвечают тем, что реально есть.
Потому что в выложенный есть дырка в авторизации.
На сайте же она не проявляется.

Добавлено @ 18:35 
Или у тебя magic_quotes включены 
PM MAIL   Вверх
smartov
Дата 22.5.2006, 18:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


свой собственный
****


Профиль
Группа: Экс. модератор
Сообщений: 4225
Регистрация: 2.2.2006
Где: NJ

Репутация: 7
Всего: 259



А не smile
Я просто запрос неверно составлял smile

После правильного пустило под админом smile
Создал тему "В форуме дырка" smile 

mysql_real_escape_string не забывай 
PM MAIL   Вверх
sugee
Дата 22.5.2006, 19:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 423
Регистрация: 12.6.2005

Репутация: 1
Всего: 4



smartov,  ладно,  авторизацию мою ты сломал,  может расскажешь где та дырка,  которой ты воспользовался?

Цитата(smartov @  22.5.2006,  18:35 Найти цитируемый пост)
Мне кажется что те скрипты что ты выложил не отвечают тем, что реально есть.

Да нет,  только что самую свежую версию закачал на сервак и её же здесь
выложил.

Добавлено @ 19:04 
Цитата(smartov @  22.5.2006,  18:54 Найти цитируемый пост)
mysql_real_escape_string не забывай  
Только это?
 
PM MAIL   Вверх
smartov
Дата 22.5.2006, 19:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


свой собственный
****


Профиль
Группа: Экс. модератор
Сообщений: 4225
Регистрация: 2.2.2006
Где: NJ

Репутация: 7
Всего: 259



Дырка в запросе на авторизацию, куда ты пихаешь $name предварительно не взяв его в mysql_real...

Цитата(sugee @  22.5.2006,  18:03 Найти цитируемый пост)
Только это?

Да. Этого достаточно чтобы тот mysql-injection (погугли эту тему если интересно) не сработал.  

Это сообщение отредактировал(а) smartov - 22.5.2006, 19:17
PM MAIL   Вверх
sugee
Дата 22.5.2006, 20:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 423
Регистрация: 12.6.2005

Репутация: 1
Всего: 4



Так,  это я поправил.   Про mysql_real_escape_string я конечно знал,  но 
не понимал до конца.   Буду разбираться.   
PM MAIL   Вверх
madFobos
Дата 22.5.2006, 21:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 102
Регистрация: 7.12.2005

Репутация: 1
Всего: 3



1. Если posted - это дата, то лучше использовать тип DATETIME или TIMESTAMP вместо INTEGER
2. Все char лучше заменить на varchar (в твоем конкретном случае БД будет меньше места занимать)
3. И совет на будущее, не называй идентификаторы таблиц одинакого (postid), потом запутаешься... Лучше сделай header_id и message_id. Хотя я вобще недопонял в твоей структуре через какую переменную идет связь таблицы header и message (надеюсь не postid)  
PM MAIL   Вверх
sugee
Дата 22.5.2006, 22:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 423
Регистрация: 12.6.2005

Репутация: 1
Всего: 4



Цитата(madFobos @  22.5.2006,  21:14 Найти цитируемый пост)
я вобще недопонял в твоей структуре через какую переменную идет связь таблицы header и message (надеюсь не postid)   

Вообще-то именно через postid.  
Вот так я выбираю сообщение из базы
Код

select  h.`parent`, h.`author`, h.`title`, h.`child`, h.`postid`, 
  h.`posted`, m.`mess`
  from `header` h, `message` m where m.`postid`=' ".$CurrentId." ' and h.`postid`=' ".$CurrentId." '

Причём хотя это поле я первоначально задумывал как AUTO_INCREMENT (оно и сейчас AUTO_INCREMENT),  но я в него вставляю предварительно
вычисленное значение,  которое не совпадает ни с одним из уже существующих postid.  Абсурд конечно,  но работает.  Я просто не придумал другого способа связать header и message.   Так что AUTO_INCREMENT у поля postid можно смело убрать, он не нужен  но вроде и не мешает.


 
Цитата(madFobos @  22.5.2006,  21:14 Найти цитируемый пост)
Если posted - это дата, то лучше использовать тип DATETIME или TIMESTAMP вместо INTEGER

Я  как-то уже привык хранить TIMESTAMP в поле типа INT. 
PM MAIL   Вверх
-=Ustas=-
Дата 22.5.2006, 23:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ustix IT Group
****


Профиль
Группа: Участник Клуба
Сообщений: 2222
Регистрация: 21.1.2005
Где: Краснодар

Репутация: 32
Всего: 69



Цитата(sugee @  22.5.2006,  22:19 Найти цитируемый пост)
Я  как-то уже привык хранить TIMESTAMP в поле типа INT.  

И правильно делаешь ;) 


--------------------
В искаженном мире все догмы одинаково произвольны, включая догму о произвольности догм.
-----
PM WWW ICQ Skype   Вверх
smartov
Дата 23.5.2006, 10:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


свой собственный
****


Профиль
Группа: Экс. модератор
Сообщений: 4225
Регистрация: 2.2.2006
Где: NJ

Репутация: 7
Всего: 259



sugee, 
p.s. Не знаю обращал ли кто твое внимание, но у тебя код практически нечитаемый из-за отсутствия форматирования.
Потом сам же не сможешь прочитать.
Очень советую почитать вот это: http://pear.php.net/manual/en/standards.php
(пройди по всем ссылкам)
Эти стандарты форматирования можно сказать классические. 
PM MAIL   Вверх
sugee
Дата 23.5.2006, 11:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 423
Регистрация: 12.6.2005

Репутация: 1
Всего: 4



А я,  между прочим,  на этот раз старался уделять внимание форматированию.   Значит недостаточно.  Хорошо,  почитаю стандарты -  пройдусь по коду ещё раз.


Цитата(smartov @  22.5.2006,  19:16 Найти цитируемый пост)
достаточно чтобы тот mysql-injection (погугли эту тему если интересно) не сработал

Нагуглил интересный факт, оказывается mysql_escape_string и mysql_real_escape_string не экранируют '%' и '_'.   
В SQL это любая строка и любой одиночный символ.
 
PM MAIL   Вверх
smartov
Дата 23.5.2006, 12:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


свой собственный
****


Профиль
Группа: Экс. модератор
Сообщений: 4225
Регистрация: 2.2.2006
Где: NJ

Репутация: 7
Всего: 259



Цитата(sugee @  23.5.2006,  10:15 Найти цитируемый пост)
Нагуглил интересный факт, оказывается mysql_escape_string и mysql_real_escape_string не экранируют '%' и '_'.   
В SQL это любая строка и любой одиночный символ.

На твою систему аторизации это никак не повлияет 
PM MAIL   Вверх
madFobos
Дата 24.5.2006, 21:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 102
Регистрация: 7.12.2005

Репутация: 1
Всего: 3



Цитата(sugee @  22.5.2006,  22:19 Найти цитируемый пост)
Причём хотя это поле я первоначально задумывал как AUTO_INCREMENT (оно и сейчас AUTO_INCREMENT),  но я в него вставляю предварительно
вычисленное значение,  которое не совпадает ни с одним из уже существующих postid.  Абсурд конечно,  но работает.  Я просто не придумал другого способа связать header и message.   Так что AUTO_INCREMENT у поля postid можно смело убрать, он не нужен  но вроде и не мешает.


В таком случае нужно оставлять AUTOINCREMENT только у одной таблицы (в данном случае думаю у header). И не придется делать лишних вычислений (СУБД ведь для этого и создаются, чтобы делать работу за программистов smile.

Цитата(-=Ustas=- @  22.5.2006,  23:11 Найти цитируемый пост)
Я  как-то уже привык хранить TIMESTAMP в поле типа INT.  

И правильно делаешь ;)  


Спорный вопрос, особенно при использовании MySQL ближе к пятому. Там куча функций для работы с датами, которые к типу  INT не применить никак... К тому же При TIMESTAMP можно вобще о дате не забоиться при вставке (и апдейте при желании)...
 
PM MAIL   Вверх
sugee
Дата 24.5.2006, 22:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 423
Регистрация: 12.6.2005

Репутация: 1
Всего: 4



Цитата(madFobos @  24.5.2006,  21:06 Найти цитируемый пост)
В таком случае нужно оставлять AUTOINCREMENT только у одной таблицы 
 smile 
Блин точно ведь,  как я сам не додумался! 
А не додумался,  потому что забыл о существовании функции mysql_insert_id().  

А я смотри что делал 
Код

function NewPostid() 
{
//выбираем postid всех уже существующих постов
$post_exists_query = mysql_query("select `postid` from `header`");
 
 //создаём массив всех существующих postid
   $post_exists_array = array();
  while($post_exist = mysql_fetch_assoc($post_exists_query)) { 

     $post_exists_array[] = $post_exist['postid'];
     
  }

  if(count($post_exists_array) !== 0)  {
//находим максимальный номер поста
     $MaxPostid = max($post_exists_array);

//задаём postid добавляемого поста 
     $NextPostid = ++$MaxPostid;
}  
  else
    {  $NextPostid = 1;  }

       return $NextPostid;
}
 smile 
  

Это сообщение отредактировал(а) sugee - 24.5.2006, 22:38
PM MAIL   Вверх
sugee
Дата 24.5.2006, 23:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 423
Регистрация: 12.6.2005

Репутация: 1
Всего: 4



Цитата(sugee @  24.5.2006,  22:37 Найти цитируемый пост)
А я смотри что делал 

К тому же у меня могла бы получиться коллизия, в случае если бы два
юзера одновременно добавили сообщение.
Могли бы получиться два поста с одинаковым postid.
Хотя поскольку поля postid всё-таки AUTO_INCREMENT, мускул 
не пропустил бы два одинаковых значения. Один из одновременно выполняющихся  инсертов просто бы не прошёл.

 
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0608 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.