За последние 24 часа нас посетили 16877 программистов и 1641 робот. Сейчас ищут 926 программистов ...

Обработка строки

Тема в разделе "Прочие вопросы по PHP", создана пользователем Nikolai_, 2 сен 2010.

  1. Nikolai_

    Nikolai_ Активный пользователь

    С нами с:
    27 авг 2010
    Сообщения:
    133
    Симпатии:
    0
    Читаю как надо обрабатывать данные от пользователя. Нашел уже готовую ф-ю, вроде разобрался что и как работает. Прошу опытных программистов взглянуть на нее и сказать - достаточно ли будет этой функции для обработки текста из формы?

    PHP:
    1. <?php
    2. public function parseString( $str ) {
    3.         $str = trim( $str );
    4.         $str = preg_replace("/[^\x20-\xFF]/","",@strval($str));
    5.         $str = strip_tags( $str );
    6.         $str = htmlspecialchars( $str, ENT_QUOTES );
    7.         $str = mysql_real_escape_string( $str );
    8.         return $str;
    9. }
    10. ?>
    11.  
    И скажите, пожалуйста, чем отличается public function от просто function?
     
  2. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    Достаточно :D
     
  3. Апельсин

    Апельсин Активный пользователь

    С нами с:
    20 мар 2010
    Сообщения:
    3.645
    Симпатии:
    2
    Nikolai_
    в функцию запихнули все что смогли в справочнике найти. для вставки в базу хватило бы mysql_real_escape_string, для вывода - htmlspecialchars.
     
  4. Nikolai_

    Nikolai_ Активный пользователь

    С нами с:
    27 авг 2010
    Сообщения:
    133
    Симпатии:
    0
    Апельсин

    Так что делать-то? Можно ли оставить ее как первом сообщении?

    Я только убрал вот эту строку - для меня она лишняя
    PHP:
    1.  <?php  $str = strip_tags( $str ); ?>
    И вот это что за "опасные символы" убирает, что-то нигде не могу найти?

    PHP:
    1.  <?php $str = preg_replace("/[^\x20-\xFF]/","",@strval($str));?>
     
  5. Апельсин

    Апельсин Активный пользователь

    С нами с:
    20 мар 2010
    Сообщения:
    3.645
    Симпатии:
    2
    Nikolai_
    Какие задачи должна выполнять твоя функция?
    если тупо добавить в базу, а потом вывести то что юзер ввел - то она излишне сложная.
    Перед добавлением в базу обрабатывай строку mysql_real_escape_string (по желанию можно еще trim, но если это текст, а не имя, например, то можно и без трим).
    Перед выводом на экран юзай htmlspecialchars - и все будет чики-пуки.

    все служебные и пр., кроме букв, чисел - и пробела.
     
  6. Nikolai_

    Nikolai_ Активный пользователь

    С нами с:
    27 авг 2010
    Сообщения:
    133
    Симпатии:
    0
    Спасибо, Апельсин, сделаю как Вы советуете, вот так как ниже. Я только одного не понял, зачем применять htmlspecialchars перед выводом текста из БД? Ни в одном примере такого не встречал. Перед записью в БД пишут, что надо проверять, а перед выводом - нигде нет такого.

    PHP:
    1. <?php
    2. function parseString( $str ) {
    3.          $str = trim( $str );
    4.          $str = mysql_real_escape_string( $str );
    5.          return $str;
    6.  }
    7.  ?>
    Еще прочитал, что надо обязательно проверять длину строки из поля "Имя". И приводится ф-я (см. ниже). А в других примерах эта длина не проверяется. Так надо ли ее проверять или нет? И если надо, то ф-я ниже вполне подойдет для этого?

    PHP:
    1. <?php
    2. function strings_stripstring($text, $wrap, $length)
    3. {
    4. $text = preg_replace('%(\S{'.$wrap.'})%', '\\1 ', $text);
    5. return substr($text, 0, $length);
    6. }
    7. ?>
     
  7. Апельсин

    Апельсин Активный пользователь

    С нами с:
    20 мар 2010
    Сообщения:
    3.645
    Симпатии:
    2
    иначе выводимый текст будет выполнятся. Например, напишет ктото такое <iframe src="www..." ></iframe> и укажет на страницу с голыми тетками. Глазу приятно, а коду уязвимость :)
    А htmlspecialchars меняет спец символы, такие как <>, кавычки и амперсанд на их хтмл-сущности. Иначе говоря - вот такой символ < на экране будет выглядеть так же, но в коде он будет уже как "&lt;", и ни один тег не будет работать.

    ну ясен пень что надо, если только обратное не задумано. Проверяй через strlen (или mb_strlen).
    Еще раз - определись что в итоге нужно получить. Проверка текста перед добавлением и проверка имени юзера - немного разные задачи.
     
  8. Nikolai_

    Nikolai_ Активный пользователь

    С нами с:
    27 авг 2010
    Сообщения:
    133
    Симпатии:
    0
    А не проще ли сразу эти спецсимволы менять перед записью в БД? Вот так, как ниже.
    PHP:
    1. <?php
    2.  public function parseString( $str ) {
    3.          $str = htmlspecialchars( $str, ENT_QUOTES );
    4.          $str = mysql_real_escape_string( $str );
    5.          return $str;
    6.  }
    7.  ?>
    Речь идет именно о длине строки в поле "Имя". Я итак ее задаю в форме (40 символов), но пишут, что все равно ее надо обрезать до заданного в форме, а то могут из своей формы послать большей длины строку. А в других примерах ничего про обрезку длины строки нет. Уже не знаешь кому верить. Так надо ли обрезать полученную из поля "Имя" строку, чтобы была длиной не более чем задано в форме?
     
  9. Апельсин

    Апельсин Активный пользователь

    С нами с:
    20 мар 2010
    Сообщения:
    3.645
    Симпатии:
    2
    Будешь понимать разницу - не будешь такого спрашивать. Обработай своей чудо-функцией такую строку

    $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 букв, не более и не менее, инече выведет ошибку. Зачем резать строку имени, пусть лучше юзер сам осознанно введет нормальное имя, иначе вывести ошибку.
     
  10. Nikolai_

    Nikolai_ Активный пользователь

    С нами с:
    27 авг 2010
    Сообщения:
    133
    Симпатии:
    0
    Апельсин

    Что-то не пашет приведенная Вами ф-я, показывает вот такую ошибку:
    Код (Text):
    1. Warning: preg_match() [function.preg-match]: Compilation failed: invalid UTF-8 string at offset 6
    В чем может быть проблема?

    Глянул поверхностно, что такое регулярные выражения, вроде все более-менее понятно, только я одного нигде ни нашел - зачем вот эти символы: iu?

    По поводу обработки строк htmlspecialchars. Апельсин, я что-то опять малость не допонял. Если мы будем обрабатывать данные выводимые из БД этой ф-ей, то она ведь все равно заменит спецсимволы на html-сущности и вместо картинки в коде будет просто &lt; img &gt; .Так зачем ее на выводе применять?
     
  11. Апельсин

    Апельсин Активный пользователь

    С нами с:
    20 мар 2010
    Сообщения:
    3.645
    Симпатии:
    2
    убери можификатор u, должно заработать. Это для юникодовской кодировки.

    Текст надо хранить в чистом виде не измененным, таким каким его отправлял юзер. Но а) безопасно вносить его в базу, б) безопасно его выводить на страницу.
    если тебе надо чтоб введенный текст вывелся без изменений (если ты его сам добавлял, например) то не используешь htmlspecialchars, а если это юзеровский текст - то применяешь htmlspecialchars, тогда у юзера не выйдет вставить какуюто каку тебе в код. А ники юзеров в регистрации не нужно обрезать, заменять и пр. Нужно просто проверять имя на соответствие (той регуляркой что я дал, например) и выводить ему ошибку что имя не такое как нужно.
     
  12. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    Nikolai_
    все очень сильно зависит от задачи. может и не нужно обрабатывать. нужно обрабатывать htmlspecialchars чтобы например вместо картинки тут был текст
    HTML:
    1. <img src='http://www.google.ru/images/srpr/nav_logo14.png'>
    А не [​IMG]

    А если хочешь именно картинку - то не надо обрабатывать.
     
  13. tenshi

    tenshi Активный пользователь

    С нами с:
    1 июн 2010
    Сообщения:
    191
    Симпатии:
    0
    пользовательские данные обрабатывать нужно всегда. но по разному ;-)
     
  14. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    tenshi
    Спасибо, КО! =)
     
  15. Nikolai_

    Nikolai_ Активный пользователь

    С нами с:
    27 авг 2010
    Сообщения:
    133
    Симпатии:
    0
    Прочитал, что тэги в сообщениях от посетителей нужно по-любому преобразовывать. Но для форматирования текста, вставки картинок и урлов в сообщениях использовать bbcode. Буду работать над этим вопросом.
     
  16. Nikolai_

    Nikolai_ Активный пользователь

    С нами с:
    27 авг 2010
    Сообщения:
    133
    Симпатии:
    0
    Теперь все понял про применение htmlspecialchars.

    Спасибо, Апельсин, ф-я заработала.