Добрый вечер, столкнулся с проблемой, а точнее с уязвимостью,которая не даёт мне покоя. В любую форму на моём сайте можно вставить сторонний php или html код. Короче, вот страница до: Теперь вставляем сторонний код: А после отправки в БД и вывода обратно получаем: Подскажите, как от этого защититься ? Код добавления данных в БД: PHP: if (isset($_POST['comm_sub'])) { if ($_POST['comm_text'] == '') { $err[] = 'Введите Комментарий'; } if (empty($err)) { $comment = R::dispense('comments'); $comment -> author = $_SESSION['id_user']; $comment -> text = $_POST['comm_text']; $comment -> id_stories = $ids; R::store($comment); }else{ echo '<div id="error">' . array_shift($err). '</div>';; } }
Можно strip_tags сделать.. тогда html и php теги вырежет.. --- Добавлено --- Это у Вас какой-то фреймворк?
Нет, не можно. Это вандализм и порча данных. Человек может просто угловые скобочки туда пихнуть и все, кирдык. Автор, вот тебе алгоритм: 1) Сохраняем данные в базу как есть, не забывая, конечно, про эскейпинг, чтобы от SQL-инъекции защититься. 2) Потом вытаскиваем данные из базы как есть. 3) Протом прогоняем их через htmlspecialchars и выводим. --- Добавлено --- @MouseZver меня опередил чуток)
isset ( ... ) поддерживает проверку сразу нескольких переменных. --- Добавлено --- на работе, решил заглянуть на огонек --- Добавлено --- так что 2ая строка не ок, словим нотис, а если в БД по дефолту не ставить определенное значение, то вовсе отрыгнет фатал еррор помоему или варнинг --- Добавлено --- в 12 строке можно снести срезку первого ключа на implode ( '<br>', $err )
Русский текст тоже бывает в <угловых скобках>. Просто надо принять как факт, что strip_tags - это детская болезнь PHP и пережиток максимализма первых разработчиков, который до сих пор сохраняется в языке разве что для обратной совместимости и является исторически сложившимся недоразумением. И никогда им не пользоваться. Вообще. Ладно бы эта функция именно HTML-теги выпиливала, или умела бы выпиливать какой-то конкретный, так нет, она режет все без разбору, что угодит промеж угловых скобок.
@Алекс8 @Fell-x27 @DarkGod▲ а еще можно с этой функцией htmlspecialchars использовать: addslashes (экранирует строку с помощью слешей) ну наверное, в проекте видел не давно, посмотрел что эта функция делает и себе добавил в заметку.
@_ne_scaju_, вот ты реально думаешь, что ты, с опытом php без году неделя, можешь что-то ценное посоветовать @Fell-x27? Тем более писать про addslashes, которая практически никогда не должна использоваться...
Для чего? Если для защиты от sql-инъекций, то она неэффективна по причине того, что не учитывает кодировку базы, и сурикат знает правильные строчки, чтоб пробить такую "защиту". От sql-инъекций надо использовать подготовленные запросы и специализированные функции библиотек по работе с базой данных.
Увы, в PHP до сих пор полно legacy-дури. По этому, когда читаешь описание какой-нибудь функции, первое, что нужно сделать - подумать, "а не делает ли она какую-то противоестественную хрень?". А потом протестить, если есть сомнения, на предмет хрени в результате работы. Но, с другой стороны, разрабы PHP почуть эту дурь выпиливают. Register globals, например. Или short-tags. Или mysql_ расширение...