Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > Фильтрация данных


Автор: DioNiR 8.4.2007, 00:15
Проблема такова:

Есть POST запрос.
Если я данные отфильтрую например
Код

htmlspecialchars

то все мои BBкоды сбиваются.

Но это не одна фунция чем я фильтрую данные.

Собствено как надо фильтровать данные из БД или в БД. При этом не затрагивая BBкоды?

Автор: SelenIT 8.4.2007, 00:44
DioNiR, для самой БД вообще данные можно не фильтровать - главное, правильно составлять запрос, прослешивая строковые данные и не допуская данные от пользователя в управляющие элементы типа LIMIT. База умеет хранить что угодно, для нее не существует "опасных символов".

Htmlspecialchars имеет смысл только при выводе, для профилактики XSS и надругательств над дизайном. А что за bb-коды такие, которые от Htmlspecialchars ломаются? Что в них за символы из разряда спецсущностей - кавычки, что ли?

Автор: DioNiR 8.4.2007, 00:55
ББ коды у меня заменяются на HTML код.
Поэтому htmlspecialchars вместо место того чтобы HTML. Он его фильтрует и выводит как обычный код.

Автор: SelenIT 8.4.2007, 01:03
Так надо сначала делать htmlspecialchars, а только потом парсить bb-коды, логично? Не случайно ж для bb-кодов обычно выбирают символы, не пересекающиеся с HTML-спецсущностями...

Автор: DioNiR 8.4.2007, 01:12
в том то и дело он изночально изменят символы:
< > " и т.д

Что PHP код становится не читабельным.

Если поптыатся изменить в обратном типо:
Код

$text=str_replace( "&gt;"          ,'>'        ,$text);
$text=str_replace( "&lt;"          ,'<'        ,$text);


То HTML начинает выводиться не как код.

Автор: SelenIT 8.4.2007, 01:27
DioNiR, можно коротенький пример данных с "испорченным PHP-кодом" до и после преобразования?

Автор: DioNiR 8.4.2007, 01:32
До преобазования:
Код

<h1>Проверка :)</h1>
<?php
echo "dsgdf";
?>
[php]<?php 
echo "dsgdf"; 
?>[/php]


После:
Код

<font color="#333333">&lt;h1&gt;Проверка :)&lt;/h1&gt;
&lt;?php
echo &quot;dsgdf&quot;;
?&gt;

         <table border=0 width=100% id=table1 cellspacing=1 cellpadding=0 bgcolor=#000000>
                <tr>
                    <td bgcolor=#FFFFFF>Код PHP</td>
                </tr>
                <tr>
                    <td bgcolor=#EEEEEE><font size=2><code><span style="color: #000000">
&amp;lt;?php&nbsp;
<br />echo &amp;quot;dsgdf&amp;quot;;&nbsp;
<br />?&amp;gt;</span>
</code></font>



Собствено вот Функция:
Код

    function bbcodes($text) {

        $text = htmlspecialchars($text);

        $text = preg_replace("/\[php\](.*)\[\/php\]/Usie", "'
         <table border=0 width=100% id=table1 cellspacing=1 cellpadding=0 bgcolor=#000000>
                <tr>
                    <td bgcolor=#FFFFFF>Код PHP</td>
                </tr>
                <tr>
                    <td bgcolor=#EEEEEE><font size=2>'.highlight_string('$1', true).'</font></td>
                </tr>
            </table>'", $text);

        $text = preg_replace("/\[b\](.*)\[\/b\]/Usi", "<b>\\1</b>", $text);
        $text = preg_replace("/\[i\](.*)\[\/i\]/Usi", "<i>\\1</i>", $text);
        $text = preg_replace("/\[u\](.*)\[\/u\]/Usi", "<u>\\1</u>", $text);
        $text = preg_replace("/\[s\](.*)\[\/s\]/Usi", "<s>\\1</s>", $text);

        $text = preg_replace("/\[color=(\#[0-9a-f]{3,6}|[a-z]+)\](.*)\[\/color\]/Usi", "<span style=\"color:\\1;\">\\2</span>", $text);
        $text = preg_replace("/\[size=([1-2]?[0-9])\](.*)\[\/size\]/Usi", "<span style=\"font-size:\\1px;\">\\2</span>", $text);
        $text = preg_replace("/\[font=([a-z]+)\](.*)\[\/font\]/Usi", "<span style=\"font-family:\\1;\">\\2</span>", $text);

        $text = preg_replace("/\[quote\](.*)\[\/quote\]/Usi", "<table border=\"0\" width=\"100%\" id=\"table1\" cellspacing=\"1\" cellpadding=\"0\" bgcolor=\"#000000\"><tr><td bgcolor='#FFFFFF'><font color='#000000'>Цитата:</font></td></tr><tr><td bgcolor=\"#FFFFFF\"><font color='#000000'>\\1</font></td></tr></table>", $text);
        $text = preg_replace("/\[code\](.*)\[\/code\]/Usi", "<table border=\"0\" width=\"100%\" id=\"table1\" cellspacing=\"1\" cellpadding=\"0\" bgcolor=\"#FF0000\"><tr><td bgcolor='#FFFFFF'><font color='#000000'>Код:</font></td></tr><tr><td bgcolor=\"#FFFFFF\"><pre class=\"code\"><font color='#000000'>\\1</font></pre></td></tr></table>", $text);

        $text = preg_replace("/\[img=(.*?)\](.*)\.(gif|jpg|jpeg|png)\[\/img\]/Usi", "<img src=\"\\2.\\3\" align=\"\\1\" style=\"border: none;\" />", $text);
        $text = preg_replace("/\[img\](.*)\.(gif|jpg|jpeg|png)\[\/img\]/Usi", "<img src=\"\\1.\\2\" alt=\"\" />", $text);
        $text = preg_replace("/\[email\]([a-z0-9_\-]+@[a-z0-9_\-\.]+\.[a-z]{2,6})\[\/email\]/Usi", "<a href=\"mailto:\\1\">\\1</a>", $text);
        $text = preg_replace("/\[email=([a-z0-9_\-]+@[a-z0-9_\-\.]+\.[a-z]{2,6})\](.*)\[\/email\]/Usi", "<a href=\"mailto:\\1\">\\2</a>", $text);

        $text = preg_replace("/\[url\](http:\/\/[a-z0-9_\-\.\/]+)\[\/url\]/Usi", "<a href=\"\\1\">\\1</a>", $text);
        $text = preg_replace("/\[url\](www\.[a-z0-9_\-\.\/]+)\[\/url\]/Usi", "<a href=\"http://\\1\">\\1</a>", $text);
        $text = preg_replace("/\[url=(http:\/\/[a-z0-9_\-\.\/]+)\](.*)\[\/url\]/Usi", "<a href=\"\\1\">\\2</a>", $text);
        $text = preg_replace("/\[url=(www\.[a-z0-9_\-\.\/]+)\](.*)\[\/url\]/Usi", "<a href=\"http://\\1\">\\2</a>", $text);

        $text = preg_replace("/\[left\](.*)\[\/left\]/Usi", "<div style=\"text-align: left;\">\\1</div>", $text);
        $text = preg_replace("/\[right\](.*)\[\/right\]/Usi", "<div style=\"text-align: right;\">\\1</div>", $text);
        $text = preg_replace("/\[center\](.*)\[\/center\]/Usi", "<div style=\"text-align: center;\">\\1</div>", $text);

        $text = preg_replace("/\[indent\](.*)\[\/indent\]/Usi", "<div style=\"padding-left: 20px;\">\\1</div>", $text);

        preg_match_all("/\[list\](.*)\[\/list\]/Usi", $text, $lists);
        
        foreach ($lists[1] as $el) {

            $elems_array = explode("[*]", $el);

            for($i=1; $i<count($elems_array); $i++) {
                $elems_str .= "<li>".trim($elems_array[$i])."</li>";
            }

            $text = preg_replace("/\[list\]".preg_quote($el, "/")."\[\/list\]/Usi", "<ul>".$elems_str."</ul>", $text);
        }

        return $text;
    }

Автор: Хрипа 8.4.2007, 01:45
в базу пишеш сразу с BB кодом..
перед показом пропускаешь через фукнцию фильтра.
Ктомуже это позволит сделать редактирования сообщений.
К примеру простейшая оработка
$arr_match = array("b:");
$arr_match_close = array(":b");
for($m=0;$m<count($arr_match);$m++)
if(eregi($arr_match[$m]."(.*)".$arr_match_close[$m],$db_message,$regs)){
$size = sizeof($regs);
for($i=0;$i<$size;$i++)
{
$db_message = eregi_replace($arr_match[$m]."(.*)".$arr_match_close[$m],$arr_match[$m].$regs[$i].$arr_match_close[$m],$db_message );
}
}else{Континью}
}
print nl2br($db_message);
Чтонить типа такого ))

Автор: SelenIT 8.4.2007, 01:53
Ага. http://www.php.net/manual/ru/function.highlight-string.php, оказывается, сама по себе тоже заменяет спецсущности. Так что придется в строке 11 перед ней сделать обратную замену спецсущностей, что-то вроде такого...
Код

highlight_string(strtr('$1',array('&amp;'=>'&', '&quot;'=>'"', '&lt;'=>'<', '&gt;'=>'>')), true)

Автор: DioNiR 8.4.2007, 02:08
Работает почти как надо.

Только проблема стала другая. Из за чего всё и началась. Это сделать Подцветку кода.
Для чего я и юзал фунцию highlight_string.

Автор: SelenIT 8.4.2007, 02:12
Если юзать ее так, как в моем последнем посте (вместо просто highlight_string('$1', true) в строке 11), подцветка разве не работает?

Альтернативный вариант - сделать строчку 3 более "избирательной", наподобие такого:
Код

$text = preg_replace("/(^|\[\/php\])(.*)(\[php\]|$)/Usie", "'$1'.htmlspecialchars('$2').'$3'", $text);

А 11-ю вернуть как было. Наверное, так даже правильнее. smile

Автор: DioNiR 8.4.2007, 02:23
Ну если вместо моего:
Код
highlight_string('$1', true)


Вставить твой:
Код
highlight_string(strtr('$1',array('&amp;'=>'&', '&quot;'=>'"', '&lt;'=>'<', '&gt;'=>'>')), true)


То будет ошибка:
Цитата
Parse error: parse error, unexpected T_CONSTANT_ENCAPSED_STRING

Иммено на это строке.

Если моё изменить и вставить вместо:
Код
'.highlight_string('$1', true).'


Твоё:
Код
".highlight_string(strtr('$1',array('&amp;'=>'&', '&quot;'=>'"', '&lt;'=>'<', '&gt;'=>'>')), true)."


То работает без подцветки.

А вообще SelenIT, куда и как вставить это я уже знаю. основы я понимаю и знаю.

Автор: SelenIT 8.4.2007, 02:29
DioNiR, еще все работает с подцветкой (только что проверил), если в варианте, который вызывал parse error, прослешить двойную кавычку smile.

Автор: DioNiR 8.4.2007, 02:34
Вот теперь работает отлично.

Кстате если спользовать твой вариант:
Код
$text = preg_replace("/(^|\[\/php\])(.*)(\[php\]|$)/Usie", "'$1'.htmlspecialchars('$2').'$3'", $text);


То он выводит не корекную подцветку.

Если же использовать стандартную то всё норма.

Жалко не достаточно постов у меня. Я бы поставил тебе бы +

СПС тебе огромное.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)