|
|
|
| Делаю сайт, на котором можно комментировать статьи, однако в некоторых статьях можно отключить комментирование. Все это делаю это следующим образом:
1. Вывожу текст статьи.
2. Вывожу комментарии.
3. Если поле 'state' (тип bool) в БД имеет значение "0", вывожу форму для отправки комментариев. Иначе, формирую подвал страницы.
Немного подумав, я понял что хакер может сохранить страницу на компьютер и дописать HTML-код формы. Затем успешно отправить комментарий.
Можно ли как-то защититься от "нелегального" комментирования? | |
|
|
|
|
|
|
|
для: SpiderNet
(28.04.2011 в 15:07)
| | Вероятно вы сохраняя комментарий передаете в обработчик идентификатор статьи? Используя этот идентификатор, запросите информацию о состоянии поля state статьи, если он отличен от нуля - ничего не делайте. | |
|
|
|
|
|
|
|
для: cheops
(28.04.2011 в 15:22)
| | Да, так и есть. У меня есть две таблицы: для статей и для комментариев.
В качестве идентификатора статьи, у меня ест поле "parent", в которое заносится значение, соответствующее номеру статьи в таблице.
Сейчас я попытался воспроизвести возможные действия хакера. Результат:
- комментарий отправляется успешно.
- в поле "parent" попадает значение "0", которое при "легальной" отправке комментария должно содержать номер статьи, например "245".
Теоретически, хакер не может узнать какое поле я использую для идентификации номера статьи, чтобы потом попытаться добавить его в форму отправки комментария? | |
|
|
|
|
|
|
|
для: SpiderNet
(28.04.2011 в 15:37)
| | >Теоретически, хакер не может узнать какое поле я использую для идентификации номера
>статьи, чтобы потом попытаться добавить его в форму отправки комментария?
Почему? Оно наверняка у вас где-то в строке запроса или в HTML-коде фигурирует. Лучше явно проверить права доступа при добавлении комментария. Просто напишите функцию, которая по идентефикатору статьи будет сообщать - можно её комментировать или нет, а потом используйте её везде - при выводе формы, при добавлении комментария в базу данных, при выводе добавленных комментариев и вообще везде, где идет работа с комментированием. | |
|
|
|
|
|
|
|
для: cheops
(28.04.2011 в 15:40)
| | Спасибо за подсказку. Буду писать функцию проверки. | |
|
|
|
|
|
|
|
для: 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;
}
?>
|
Бред или можно использовать такой код? | |
|
|
|
|
|
|
|
для: SpiderNet
(28.04.2011 в 16:10)
| | Все нормально, только
1) $id_article стоит явно привести к целому числу при помощи intval()
2) Лучше всегда обратывать ситуацию неправильного выполнения запроса - съэкомите массу времени при отладке.
3) Подключение config.php лучше вынести за пределы функции, чтобы не привязываться к уровню вложения файла относительно config.php - пусть лучше файл, использующий функцию check_commenting() обеспечивает соединение с базой данных. В противном случае у вас или у другого разработчика будет соблазн поправить путь к config.php, выводя из строя другие части системы (о которых вы или другой разработчик не будете помнить или подозревать при работе с этой функцией спустя некоторое время). На худой конец, если подключение базы данных важно реализовать именно в функции - лучше для этих целей создать еще одну специальную функцию, а не использовать включаемый файл, который зависит от относительного пути. | |
|
|
|
|
|
|
|
для: cheops
(28.04.2011 в 16:44)
| | Обязательно учту замечания.
Скажите пожалуйста, как мне теперь использовать эту функцию. Мне еще не приходилось работать с самописными функциями. | |
|
|
|
|
|
|
|
для: SpiderNet
(28.04.2011 в 19:21)
| | Я бы использовал вашу функцию следующим образом
<?php
if(!check_commenting($id_article))
{
// Здесь код обслуживания комментариев
}
?>
|
PS У вас правда есть одно архитектурное неудобство: 0 (false) разрешает комментирование, а значение отличное от 0 (true) запрещает. Намучаетесь с такой логикой, так как обычно поступают, да и удобнее действовать наоборот (не потребуются отрицания при помощи знака ! в операторе if). | |
|
|
|
|
|
|
|
для: cheops
(28.04.2011 в 19:38)
| | Спасибо Игорь Вячеславович. | |
|
|
|