У меня очень простая проблема. делаю доску обявленний, и столкнулся с такой проблемой, если юзер вводит вместо обявления такой код: <iframe src='http://rambler.ru'></Fiframe> то в итоге вместо обявления у меня викидывает рамблер. Как нужно правельно вкидывать данние в БД и как их правельно выводить чтобы разные скрипты и кавычки не портили жизнь? И где можно об этом почитать ?
\"Кавычки \". Cоставление запросов, слеши, SQL Injection а в вашем случае надо htmlspecialchars() при выводе использовать
мне кажется, что на этот вопрос не проследует ответа, так же как и на вопрос "почему не нужно приводить к типу числа переменную, содержащую число".
Clone Обычно потому, что данные из базы используются не только для генерации HTML, но и для других целей - для отправки текстовых почтовых уведомлений, для поиска и пр.
Для высоконагруженных проектов да, для 99.9% сайтов наоборот нельзя так делать. Для того чтоб если потом ты захочешь расширить движок (а такое часто бывает, например разрешить некоторые тэги) чтоб ты мог это сделать. (и само собой по причине которую привёл Dagdamor) Собственно недавно думал на эту тему, и "про реферировал" пару моих постов на этом форуме http://dkflbk.nm.ru/php_basic_err_1.html
Есть хорошие пословицы, которые стоит помнить даже при разработке сайтов. Например, "Ломать не строить". Обработать данные htmlspecialchars при выводе проще, чем потом пытаться вернуть исходный код по каким либо причинам. А вообще, всем стоит понять, что нет единственных и идеальных решений, и часто каждый случай надо рассматривать отдельно.
А если проект станет вдруг высоконагруженым? В данном случае - доска объявлений. Это значит что если повезет - то она станет посещаемой. А вот как раз то, что в ней когда-то администаротор разрешит использовать в объявлениях HTML - очень мала (не видел таких досок).
Vladson По-моему, лучше уж, чтобы выдало id 12, чем скрипт умер. Тем более, что сайт не будет перенаправлять на неправильные ссылки. Неправильный айдишник может сделать лишь пользователь, либо случайно, после вставки ссылки дописав букву, либо намеренно. Для воторого способа подходит вариант выдачи ошибки, а для первого - нет. Я сам раньше проверял числовые параметры функцией ctype_digit, но потом перешел на приведение типа, так как посчитал это более выгодным.
Тогда придется каждый раз фильтровать данные на выходе. Не легче один раз профильтровать данные и засунуть их в БД в чистом и нужном нам виде? Зачем мне хранить всякий мусор, который ввел пользователь (\, <script>alert();</script>, " и прочее). Оно мне надо? Лучше продумать функционал движка проекта с самого начала - если планируешь разрешить какие-то теги, лучше писать свой обработчик текстовых полей - с возможностей разрешения тегов (аналог strip_tags). Если точно знаешь что в этом поле НИКОГДА не должно быть ничего похожего на код - зачем париться? Kreker +1. Update: Просто у меня привычка: PHP: <?php $name = clean($_POST['name']); $age = clean($_POST['age']); ... // Здесь была форма # ?> Пишу это уже на автомате
Это опять таки ошибка, скрипт не умрёт а сработает именно так-как надо, даст ответ что "странички с адресом 12рапг7124 не существует" потому что её не существует и ссылок на неё нигде ты не найдёшь.
andriuch_a Всё что тебе нужно - описано в посте Elkaz mysql_real_escape_string() при записи в базу и htmlspecialschars при выводе в браузер.
Вдруг не бывает. (99% высоконагруженых проектов с самого начала были таковыми, а 99% обычных никогда не превосходят по требовательности описанную схему)
Вы оба правы и оба неправы. ИМХО. Привести к типу нужно, но вырывать тип - нет. Код (Text): $id = (int)$_POST['id'];
Kreker Кстати спасибо за очередной миф про "смерть скрипта", я и забыл про это заблуждение. Обязательно освещу в следующий раз.
Так и думается, что словосочетания "для того чтобы если" было написано чтобы не использовать слово "вдруг"