В различной литературе выделяют следующие 4 функции - addslashes, htmlspecialchars, strip_tags, mysql_escape_string. При этом каждый автор использует по-разному. Кто-то всего одну, кто парочку. Вот и вопрос - сколько точно надо использовать и в какой последовательности, чтобы на 100% защититься от всякой гадости, вводимой в форму и адресную строку через get? Кто как использует?
ВСЁ зависит от того, куда пойдут строки из формы - в sql бд, на страницу или в аргументы какой-нибудь функции...
А чтобы сразу все три варианта предусмотреть - БД, страница, аргумент? Или так универсально сделать нельзя?
it depends. Если полученное значение используется как параметр для запроса в базу, то я использую mysql_real_escape_string для текстовых полей и прямое приведение типа для числовых. addslashes имеет смысл использовать только если у тебя какая-нибудь бд в которой нет аналога mysql_real_escape_string Если полученное значение выводится в браузер (неважно напрямую или сначала сохраняется куда-то а потом выводится), то используется htmlspecialchars - против xss и просто чтобы верстка не скривилась от введенных пользователем тегов. strip_tags стоит использовать вместо htmlspecialchars если ты хочешь именно отрезать теги напрочь, а не показывать их как теги. То есть если пользователь введет "привет, Вася", то после htmlspecialchars результат будет "привет, <b>Вася</b>", а после strip_tags "привет, Вася". Но и в том и в другом случае тег не выделит васю болдом.
nikolay чтобы на 100% защититься от всякой гадости mysql_real_escape_string - для записи в бд. для вывода на страницу - там надо смотреть, чтобы не перестараться. т.е. во втором случае строка '&' может превратиться в & а может даже в &amp;
PHP: function check_str($str){ $str=htmlspecialchars($str); $str=stripslashes($str); $str=mysql_real_escape_string($str); return $str; } ну например так
Я бы в б.д. хранил как прислали текст (т.е. только через escape_string), а при выводе записей из б.д. в браузер - уже делал бы htmlspecialchars()
rainarr, садись двойка! не надо таких "!универсальных" штучек. функции экранирования символов надо выбирать в зависимости от назначения данных. мы защищаем базу от sql-инъекции или мы защищаем пользователя от js-инъекции - ввод или вывод. перед подстановкой значения в SQL-запрос - mysql_real_escape_string перед подстановкой в input или textarea - htmlspecialchars ВСЕГДА! при выводе данных, которые вводил пользователь и где недопустим html/js - htmlspecialchars stripslashes может понадобиться только как workaround если включены magic quotes — тогда проходимся им по _GET, _POST и _COOKIE в начале скрипта. (для свежих версий PHP неактуально). больше stripslashes нафиг не нужно, одни непонятные проблемы словишь. следствие: про addslashes насрать и забыть.
Правильно. В БД надо хранить текст в оригинальном виде. Не будете же вы в вручную написанном запросе писать & вместо &.
artoodetoo мой пример это пример текст в БД надо сохранять в исходном виде, если хочешь организовать поиск и всё такое, но тут вроде не спрашивали.
Кстати, возник такой вопрос - mysql_real_escape_string гарантирует отсутствие взлома через SQL-инъекции при условии, что использована во всех местах, где это нужно?