Как отфильтровать текст перед сохранением в Mysql ?

Тема в разделе "PHP программирование", создана пользователем slavon-x86, 21 фев 2007.

  1. slavon-x86

    slavon-x86 Well-Known Member

    Регистрация:
    18 дек 2005
    Сообщения:
    216
    Симпатии:
    0
    <textarea name="comments" wrap="virtual" style="width:100%; height:140;></textarea>

    Как отфильтровать текст так, чтобы его можно было безопасно сохранить в MySQL, а затем вывести на сайте !?
     
  2. LIGHT

    LIGHT Гость

    untag
    ereg_reaplace
     
  3. GOsha

    GOsha Гость

    mysql_escape_string
     
  4. slavon-x86

    slavon-x86 Well-Known Member

    Регистрация:
    18 дек 2005
    Сообщения:
    216
    Симпатии:
    0
    Код (Text):
        $string = ereg_replace("<","&lt;",$string);
    $string = ereg_replace(">","&gt;",$string);
    $string = ereg_replace('\\\"',"&quot;",$string);
    $string = ereg_replace(":",":",$string);
    $string = ereg_replace("\r","",$string);
    $string = ereg_replace("\n","<br>",$string);
    $string = ereg_replace("%","%",$string); //если этого не сделать, то вас могут круто отыметь -)
    $string = ereg_replace("^ +","",$string);
    $string = ereg_replace(" +$","",$string);
    $string = ereg_replace(" +"," ",$string);
    А вот этого достаточно ?
     
  5. LIGHT

    LIGHT Гость

    Лучше написать ф-ию примерно такую, можно конечно красивейи придумать это как мысль

    а дальше

    $str=eregs($srt);

    и везде где понадобится делать проверку юзать

    $str=eregs($srt);
     
  6. MajestiC

    MajestiC Гость

    Зачем изобретать велосипед.

    mysql_real_escape_string для занесения.

    Если хочешь убрать все тэги - strip_tags

    При выводе используй htmlspecialchars
     
  7. GOsha

    GOsha Гость

    Для: MajestiC
    Полностью согласен...
    Они бы еще массив выводили, подбирая ключи
    aa
    ab
    ac
    ad
    ....
    Народ, купите себе учебник.
     
  8. slavon-x86

    slavon-x86 Well-Known Member

    Регистрация:
    18 дек 2005
    Сообщения:
    216
    Симпатии:
    0
    А вот я не согласен !

    Код (Text):
    mysql_real_escape_string для занесения.
    - делает прослэшивание и этим самым видоизменяет текст ! А это уже плохо !

    Код (Text):
    Если хочешь убрать все тэги - strip_tags
    - против этой функции я ничего не имею, но она мне не подходит, т.к. тоже оставляет не весь текст !

    Код (Text):
    При выводе используй htmlspecialchars
    - эта вобще неполноценная функция. Например вот это
    $string = ereg_replace("%","%",$string); //если этого не сделать, то вас могут круто отыметь -)
    оно не заменяет, а следовательно возможен хак !


    А если текст преобразовать этой функцией: "htmlentities", а потом сохранить и вывести, то это будет безопасно ?
     
  9. MajestiC

    MajestiC Гость

    >А вот я не согласен !
    Поздравляю, только вот надо сначала быть уверенным и знать элементарные функции php, а точнее то, что они делают.

    >>
    Код (Text):
    mysql_real_escape_string для занесения.
    >- делает прослэшивание и этим самым видоизменяет текст ! А это уже плохо !

    Бред. У вас в базе данных окажется именно тот текст который вы хотите занести в бд. mysql_real_escape_string лишь экранирует кавычки для взаимопонимания с БД когда вы вставляете запись. Например если ваш текст "я мега"хакер\и вообще я знаю PHP ", то SQL инсерта без него будет выглядеть как INSERT INTO table (text) VALUES ("я мега "хакер \и вообще я знаю PHP "), что естественно вызовет синтаксическую ошибку, а после использования экранирования (например mysql_real_escape_string) SQL запрос будет выглядеть как INSERT INTO table (text) VALUES ("я мега \" хакер \\и вообще я знаю PHP"), при этом в БД окажется именно тот текст, который вы хотели вставить.

    >>
    Код (Text):
    Если хочешь убрать все тэги - strip_tags
    >- против этой функции я ничего не имею, но она мне не подходит, т.к. тоже оставляет не весь текст !
    Дело ваше.

    >>
    Код (Text):
    При выводе используй htmlspecialchars
    >- эта вобще неполноценная функция. Например вот это
    >$string = ereg_replace("%","%",$string); //если этого не сделать, то вас могут круто отыметь -)
    >оно не заменяет, а следовательно возможен хак !
    Где вы вычитали такой бред. Ваша регулярка помоему (я просто всегда preg использую) ничего не делает.
    А теперь обьясните мне, как вы сделаете хак выведя текст через htmlspecialchars? JavaScript или что? Советую попробовать.

    >А если текст преобразовать этой функцией: "htmlentities", а потом сохранить и вывести, то это будет безопасно ?
    Вы русский текст htmlentities когда-нибудь кодировали?
     
  10. slavon-x86

    slavon-x86 Well-Known Member

    Регистрация:
    18 дек 2005
    Сообщения:
    216
    Симпатии:
    0
    Код (Text):
    Бред. У вас в базе данных окажется именно тот текст который вы хотите занести в бд. mysql_real_escape_string лишь экранирует кавычки для взаимопонимания с БД когда вы вставляете запись. Например если ваш текст "я мега"хакер\и вообще я знаю PHP ", то SQL инсерта без него будет выглядеть как INSERT INTO table (text) VALUES ("я мега "хакер \и вообще я знаю PHP "), что естественно вызовет синтаксическую ошибку, а после использования экранирования (например mysql_real_escape_string) SQL запрос будет выглядеть как INSERT INTO table (text) VALUES ("я мега \" хакер \\и вообще я знаю PHP"), при этом в БД окажется именно тот текст, который вы хотели вставить.
    "\n" будет "\\n" и т.д. Добавляет лишнюю черту к спец. тегам !

    Код (Text):
    >- эта вобще неполноценная функция. Например вот это
    >$string = ereg_replace("%","%",$string); //если этого не сделать, то вас могут круто отыметь -)
    >оно не заменяет, а следовательно возможен хак !
    Где вы вычитали такой бред. Ваша регулярка помоему (я просто всегда preg использую) ничего не делает.
    А теперь обьясните мне, как вы сделаете хак выведя текст через htmlspecialchars? JavaScript или что? Советую попробовать.
    $string = ereg_replace("%","&#37",$string); - вот так !
    printf("123%456", "<?php ... ?>"); Я не мастер в php, но думаю что процент нужно обязательно заменять кодом (это и написано кем-то в предыдущих сообщениях) !
     
  11. GOsha

    GOsha Гость

    В данном споре полностью поддерживаю маджестика.
    Если сам возьмешься за алгоритмы безопасности без специальных знаний, то фиг ты сделаешь его безопасным. Это еще 3 курс БГУ ФПМИ "Основы компьютерной безопасности".
    А если не сделаешь стриптагс, то я тебе в базу запишу яваскрипт, который при открытии данных будет отсылать юзера на мой сайт. Все просто, как 5 копеек.
     
  12. Artexoid

    Artexoid Гость

    А в базу запишется не \\n, а \n как нужно. :)
    А вот так будут все довольны :)

    Код (Text):
    <?
    function value_escape($value)
    {
    if (get_magic_quotes_gpc())
    {
    $value = stripslashes($value);
    }
    if (!is_numeric($value))
    {
    $value = "'".mysql_real_escape_string($value)."'";
    $value = ereg_replace("%","&#37",$value);
    }
    return $value;
    };
    ?>
    Решил внести свою лепту с учётом всех высказываний B)...
     
  13. MajestiC

    MajestiC Гость

    <!--QuoteBegin-slavon-x86+5:03:2007, 20:19 -->
    <span class="vbquote">(slavon-x86 @ 5:03:2007, 20:19 )</span><!--QuoteEBegin-->"\n" будет "\\n" и т.д. Добавляет лишнюю черту к спец. тегам !
    [snapback]58276" rel="nofollow" target="_blank[/snapback]​
    [/quote]
    Попытаюсь обьяснить.
    Когда вы пишите:
    $sString = "\ns\n";
    Это не значит что в строке содержится 2 символа "\" и "n", слэша и n там вообще нет. Сейчас в строке $sString сожержится символ с ASCII-кодом 13, буква 's', и еще 1 символ с ASCII-кодом 13.

    Если же вы напишите $sString = '\ns\n'; (В одинарных кавычках), то в строке $sString будут содержаться 5 символов: "\", "\n", "s", "\", "n".

    Так вот к чему я это всё, теперь давайте посмотрим как эти строки поведут себя при фильтрации через mysql_real_escape_string.
    1-ый пример chr(13).'s'.chr(13) преобразуется в строку '\ns\n'
    2-ой пример '\ns\n' = '\\ns\\n'
    Именно таким текстом они пойдут в SQL запрос.
    А дальше MySQL сам будет воспроизводить эти строки.
    INSERT INTO table VALUES ('\ns\n') = запись с символом 13, буквой 's', символом 13
    INSERT INTO table VALUES ('\\ns\\n') = запись с строкой '\ns\n'
    В итоге, то что мы хотели занести в БД, туда так и занеслось.

    Надеюсь понятно объяснил.

    <!--QuoteBegin-slavon-x86+5:03:2007, 20:19 -->
    <span class="vbquote">(slavon-x86 @ 5:03:2007, 20:19 )</span><!--QuoteEBegin-->$string = ereg_replace("%","&#37",$string); - вот так !
    printf("123%456", "<?php ... ?>"); Я не мастер в php, но думаю что процент нужно обязательно заменять кодом (это и написано кем-то в предыдущих сообщениях) !
    [snapback]58276" rel="nofollow" target="_blank[/snapback]​
    [/quote]
    Причем тут вообще printf?

    btw, давно на preg переходить надо.
     
  14. slavon-x86

    slavon-x86 Well-Known Member

    Регистрация:
    18 дек 2005
    Сообщения:
    216
    Симпатии:
    0
    Блин, вы все говорите что я ламер, а сами ничего толком написать не можете !

    Код (Text):
    mysql_real_escape_string($string)
    - если я сохраню вот так, это будет безопасно ?

    htmlspecialchars - не заменяет кавычку '
     
  15. MajestiC

    MajestiC Гость

    mysql_real_escape_string безопасно вставит ваши данные в БД.
    Но если данные содержат тэги и вы их потом будете выводить не фильтруя через htmlspecialchars, то это не безопасно.

    Насчет кавычек:
    Заменяет. Но нужно поставить флаг ENT_QUOTES.
    htmlspecialchars($sString, ENT_QUOTES);
     
  16. slavon-x86

    slavon-x86 Well-Known Member

    Регистрация:
    18 дек 2005
    Сообщения:
    216
    Симпатии:
    0
    Код (Text):
    htmlspecialchars($sString, ENT_QUOTES);
    - и этого будет достаточно для безопасного вывода ?

    p.s. - я ещё потом добавляю смайлики в этот текст вот так:
    Код (Text):
    $sString = str_replace(':-)', '<img width="20" height="24" src="images/smiles/ab.gif">', $sString);
    Это не повлияет на безопасность ?
     
  17. MajestiC

    MajestiC Гость

    1. Достаточно, лучше вообще делай еще и strip_tags перед вставкой в бд, если не нужно отображать тэги.
    2. Нет, не повлияет.
     
  18. slavon-x86

    slavon-x86 Well-Known Member

    Регистрация:
    18 дек 2005
    Сообщения:
    216
    Симпатии:
    0
    Немного разобрался !
    Код (Text):
    mysql_real_escape_string($string)
    - вот только эта функция добавляет к косой черете \ ещё одну ! Это происходит только с косой чертой или есть ещё какие-то видоизменения текста ? И возможно ли это исправить ?
     
  19. MajestiC

    MajestiC Гость

    Ну так все нормально =)))

    Она же предназначеная для формирования запроса.

    $sString = '\'; - Вот твоя черта.

    mysql_query('INSERT INTO table VALUES ("'.mysql_real_escape_string($sString).'")');

    сделает запрос

    INSERT INTO table VALUES ("\\")

    То есть в базу вставится 1 черта.
     
  20. slavon-x86

    slavon-x86 Well-Known Member

    Регистрация:
    18 дек 2005
    Сообщения:
    216
    Симпатии:
    0
    :( Да 2 вставляется !
    Ну 2 вставляется ! Вот: "\\" - две черты !

    __________________
    Вот так я вставляю

    Код (Text):
    $string = $_GET['comments'];

    $string = mysql_real_escape_string($string);
    $string = strip_tags($string);

    mysql_query("INSERT INTO comments VALUES ('" .

    $name . "', '" .                                     
    $string .                                    

    "')") or ($e = "Ошибка при добавлении записи в таблицу.");
     
Загрузка...

Поделиться этой страницей