Читаю как надо обрабатывать данные от пользователя. Нашел уже готовую ф-ю, вроде разобрался что и как работает. Прошу опытных программистов взглянуть на нее и сказать - достаточно ли будет этой функции для обработки текста из формы? PHP: <?php public function parseString( $str ) { $str = trim( $str ); $str = preg_replace("/[^\x20-\xFF]/","",@strval($str)); $str = strip_tags( $str ); $str = htmlspecialchars( $str, ENT_QUOTES ); $str = mysql_real_escape_string( $str ); return $str; } ?> И скажите, пожалуйста, чем отличается public function от просто function?
Nikolai_ в функцию запихнули все что смогли в справочнике найти. для вставки в базу хватило бы mysql_real_escape_string, для вывода - htmlspecialchars.
Апельсин Так что делать-то? Можно ли оставить ее как первом сообщении? Я только убрал вот эту строку - для меня она лишняя PHP: <?php $str = strip_tags( $str ); ?> И вот это что за "опасные символы" убирает, что-то нигде не могу найти? PHP: <?php $str = preg_replace("/[^\x20-\xFF]/","",@strval($str));?>
Nikolai_ Какие задачи должна выполнять твоя функция? если тупо добавить в базу, а потом вывести то что юзер ввел - то она излишне сложная. Перед добавлением в базу обрабатывай строку mysql_real_escape_string (по желанию можно еще trim, но если это текст, а не имя, например, то можно и без трим). Перед выводом на экран юзай htmlspecialchars - и все будет чики-пуки. все служебные и пр., кроме букв, чисел - и пробела.
Спасибо, Апельсин, сделаю как Вы советуете, вот так как ниже. Я только одного не понял, зачем применять htmlspecialchars перед выводом текста из БД? Ни в одном примере такого не встречал. Перед записью в БД пишут, что надо проверять, а перед выводом - нигде нет такого. PHP: <?php function parseString( $str ) { $str = trim( $str ); $str = mysql_real_escape_string( $str ); return $str; } ?> Еще прочитал, что надо обязательно проверять длину строки из поля "Имя". И приводится ф-я (см. ниже). А в других примерах эта длина не проверяется. Так надо ли ее проверять или нет? И если надо, то ф-я ниже вполне подойдет для этого? PHP: <?php function strings_stripstring($text, $wrap, $length) { $text = preg_replace('%(\S{'.$wrap.'})%', '\\1 ', $text); return substr($text, 0, $length); } ?>
иначе выводимый текст будет выполнятся. Например, напишет ктото такое <iframe src="www..." ></iframe> и укажет на страницу с голыми тетками. Глазу приятно, а коду уязвимость А htmlspecialchars меняет спец символы, такие как <>, кавычки и амперсанд на их хтмл-сущности. Иначе говоря - вот такой символ < на экране будет выглядеть так же, но в коде он будет уже как "<", и ни один тег не будет работать. ну ясен пень что надо, если только обратное не задумано. Проверяй через strlen (или mb_strlen). Еще раз - определись что в итоге нужно получить. Проверка текста перед добавлением и проверка имени юзера - немного разные задачи.
А не проще ли сразу эти спецсимволы менять перед записью в БД? Вот так, как ниже. PHP: <?php public function parseString( $str ) { $str = htmlspecialchars( $str, ENT_QUOTES ); $str = mysql_real_escape_string( $str ); return $str; } ?> Речь идет именно о длине строки в поле "Имя". Я итак ее задаю в форме (40 символов), но пишут, что все равно ее надо обрезать до заданного в форме, а то могут из своей формы послать большей длины строку. А в других примерах ничего про обрезку длины строки нет. Уже не знаешь кому верить. Так надо ли обрезать полученную из поля "Имя" строку, чтобы была длиной не более чем задано в форме?
Будешь понимать разницу - не будешь такого спрашивать. Обработай своей чудо-функцией такую строку $str = '<img src="http://www.php.ru/forum/templates/subSilver/images/lang_russian/post.gif">'; добавь в базу и попробуй теперь вывести на экран эту картинку. И хер там, потому что тег уже не будет тегом, а набором обычных символов. Это хорошо, когда так и задумывалось, чтоб ниодин тег не отобразился. А если это ты добавил через админку статью, то вся твоя хтмл разметка не отобразится, так как эта чудо-функция сожрала все теги. function getName ($name) { return preg_match('/^[a-zа-я0-9\-_]{3,40}$/iu',$name); } в коде проверяешь так: if(getName($user_name)) echo 'Имя норм'; else 'Некорректное имя'; регулярка что в функции не пропустит любых других символов кроме a-zа-я0-9\-_ (верх и ниж регистр), потому и вырезать уже там нечего. Если имя прошло такую проверку - его можно смело добавлять в базу. С trim еще поиграться можно. И имя будет здесь от 3 до 40 букв, не более и не менее, инече выведет ошибку. Зачем резать строку имени, пусть лучше юзер сам осознанно введет нормальное имя, иначе вывести ошибку.
Апельсин Что-то не пашет приведенная Вами ф-я, показывает вот такую ошибку: Код (Text): Warning: preg_match() [function.preg-match]: Compilation failed: invalid UTF-8 string at offset 6 В чем может быть проблема? Глянул поверхностно, что такое регулярные выражения, вроде все более-менее понятно, только я одного нигде ни нашел - зачем вот эти символы: iu? По поводу обработки строк htmlspecialchars. Апельсин, я что-то опять малость не допонял. Если мы будем обрабатывать данные выводимые из БД этой ф-ей, то она ведь все равно заменит спецсимволы на html-сущности и вместо картинки в коде будет просто < img > .Так зачем ее на выводе применять?
убери можификатор u, должно заработать. Это для юникодовской кодировки. Текст надо хранить в чистом виде не измененным, таким каким его отправлял юзер. Но а) безопасно вносить его в базу, б) безопасно его выводить на страницу. если тебе надо чтоб введенный текст вывелся без изменений (если ты его сам добавлял, например) то не используешь htmlspecialchars, а если это юзеровский текст - то применяешь htmlspecialchars, тогда у юзера не выйдет вставить какуюто каку тебе в код. А ники юзеров в регистрации не нужно обрезать, заменять и пр. Нужно просто проверять имя на соответствие (той регуляркой что я дал, например) и выводить ему ошибку что имя не такое как нужно.
Nikolai_ все очень сильно зависит от задачи. может и не нужно обрабатывать. нужно обрабатывать htmlspecialchars чтобы например вместо картинки тут был текст HTML: <img src='http://www.google.ru/images/srpr/nav_logo14.png'> А не А если хочешь именно картинку - то не надо обрабатывать.
Прочитал, что тэги в сообщениях от посетителей нужно по-любому преобразовывать. Но для форматирования текста, вставки картинок и урлов в сообщениях использовать bbcode. Буду работать над этим вопросом.