Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Запрет комментирования статьи
 
 автор: SpiderNet   (28.04.2011 в 15:07)   письмо автору
 
 

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

1. Вывожу текст статьи.
2. Вывожу комментарии.
3. Если поле 'state' (тип bool) в БД имеет значение "0", вывожу форму для отправки комментариев. Иначе, формирую подвал страницы.

Немного подумав, я понял что хакер может сохранить страницу на компьютер и дописать HTML-код формы. Затем успешно отправить комментарий.

Можно ли как-то защититься от "нелегального" комментирования?

  Ответить  
 
 автор: cheops   (28.04.2011 в 15:22)   письмо автору
 
   для: SpiderNet   (28.04.2011 в 15:07)
 

Вероятно вы сохраняя комментарий передаете в обработчик идентификатор статьи? Используя этот идентификатор, запросите информацию о состоянии поля state статьи, если он отличен от нуля - ничего не делайте.

  Ответить  
 
 автор: SpiderNet   (28.04.2011 в 15:37)   письмо автору
 
   для: cheops   (28.04.2011 в 15:22)
 

Да, так и есть. У меня есть две таблицы: для статей и для комментариев.
В качестве идентификатора статьи, у меня ест поле "parent", в которое заносится значение, соответствующее номеру статьи в таблице.

Сейчас я попытался воспроизвести возможные действия хакера. Результат:
- комментарий отправляется успешно.
- в поле "parent" попадает значение "0", которое при "легальной" отправке комментария должно содержать номер статьи, например "245".

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

  Ответить  
 
 автор: cheops   (28.04.2011 в 15:40)   письмо автору
 
   для: SpiderNet   (28.04.2011 в 15:37)
 

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

  Ответить  
 
 автор: SpiderNet   (28.04.2011 в 15:47)   письмо автору
 
   для: cheops   (28.04.2011 в 15:40)
 

Спасибо за подсказку. Буду писать функцию проверки.

  Ответить  
 
 автор: SpiderNet   (28.04.2011 в 16:10)   письмо автору
 
   для: cheops   (28.04.2011 в 15:40)
 

Написал вот такой код функции:

<?php
function check_commenting($id_article)
{
    require_once(
"config.php");//Соединение с БД
    
$query "SELECT status FROM article WHERE id = '$id_article';";
    
$disablecomments mysql_query($query);
    
$status mysql_fetch_array($disablecomments);
    if (
$status['status'] == 0) return 0;
    else return 
1;
}
?>


Бред или можно использовать такой код?

  Ответить  
 
 автор: cheops   (28.04.2011 в 16:44)   письмо автору
 
   для: SpiderNet   (28.04.2011 в 16:10)
 

Все нормально, только
1) $id_article стоит явно привести к целому числу при помощи intval()
2) Лучше всегда обратывать ситуацию неправильного выполнения запроса - съэкомите массу времени при отладке.
3) Подключение config.php лучше вынести за пределы функции, чтобы не привязываться к уровню вложения файла относительно config.php - пусть лучше файл, использующий функцию check_commenting() обеспечивает соединение с базой данных. В противном случае у вас или у другого разработчика будет соблазн поправить путь к config.php, выводя из строя другие части системы (о которых вы или другой разработчик не будете помнить или подозревать при работе с этой функцией спустя некоторое время). На худой конец, если подключение базы данных важно реализовать именно в функции - лучше для этих целей создать еще одну специальную функцию, а не использовать включаемый файл, который зависит от относительного пути.

  Ответить  
 
 автор: SpiderNet   (28.04.2011 в 19:21)   письмо автору
 
   для: cheops   (28.04.2011 в 16:44)
 

Обязательно учту замечания.
Скажите пожалуйста, как мне теперь использовать эту функцию. Мне еще не приходилось работать с самописными функциями.

  Ответить  
 
 автор: cheops   (28.04.2011 в 19:38)   письмо автору
 
   для: SpiderNet   (28.04.2011 в 19:21)
 

Я бы использовал вашу функцию следующим образом
<?php
  
if(!check_commenting($id_article))
  {
     
// Здесь код обслуживания комментариев
  
}
?>

PS У вас правда есть одно архитектурное неудобство: 0 (false) разрешает комментирование, а значение отличное от 0 (true) запрещает. Намучаетесь с такой логикой, так как обычно поступают, да и удобнее действовать наоборот (не потребуются отрицания при помощи знака ! в операторе if).

  Ответить  
 
 автор: SpiderNet   (28.04.2011 в 19:56)   письмо автору
 
   для: cheops   (28.04.2011 в 19:38)
 

Спасибо Игорь Вячеславович.

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования