Модераторы: skyboy, MoLeX, Aliance, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Фильтрация данных 
V
    Опции темы
DioNiR
Дата 8.4.2007, 00:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 130
Регистрация: 30.12.2006

Репутация: нет
Всего: нет



Проблема такова:

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

htmlspecialchars

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

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

Собствено как надо фильтровать данные из БД или в БД. При этом не затрагивая BBкоды?
--------------------
Думали это конец? Ха, всё только начинается.
PM MAIL   Вверх
SelenIT
Дата 8.4.2007, 00:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


баг форума
****


Профиль
Группа: Завсегдатай
Сообщений: 3996
Регистрация: 17.10.2006
Где: Pale Blue Dot

Репутация: 32
Всего: 401



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

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


--------------------
Осторожно! Данный юзер и его посты содержат ДГМО! Противопоказано лицам с предрасположенностью к зонеризму!
PM MAIL   Вверх
DioNiR
Дата 8.4.2007, 00:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 130
Регистрация: 30.12.2006

Репутация: нет
Всего: нет



ББ коды у меня заменяются на HTML код.
Поэтому htmlspecialchars вместо место того чтобы HTML. Он его фильтрует и выводит как обычный код.
--------------------
Думали это конец? Ха, всё только начинается.
PM MAIL   Вверх
SelenIT
Дата 8.4.2007, 01:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


баг форума
****


Профиль
Группа: Завсегдатай
Сообщений: 3996
Регистрация: 17.10.2006
Где: Pale Blue Dot

Репутация: 32
Всего: 401



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


--------------------
Осторожно! Данный юзер и его посты содержат ДГМО! Противопоказано лицам с предрасположенностью к зонеризму!
PM MAIL   Вверх
DioNiR
Дата 8.4.2007, 01:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 130
Регистрация: 30.12.2006

Репутация: нет
Всего: нет



в том то и дело он изночально изменят символы:
< > " и т.д

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

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

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


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

--------------------
Думали это конец? Ха, всё только начинается.
PM MAIL   Вверх
SelenIT
Дата 8.4.2007, 01:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


баг форума
****


Профиль
Группа: Завсегдатай
Сообщений: 3996
Регистрация: 17.10.2006
Где: Pale Blue Dot

Репутация: 32
Всего: 401



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


--------------------
Осторожно! Данный юзер и его посты содержат ДГМО! Противопоказано лицам с предрасположенностью к зонеризму!
PM MAIL   Вверх
DioNiR
Дата 8.4.2007, 01:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 130
Регистрация: 30.12.2006

Репутация: нет
Всего: нет



До преобазования:
Код

<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;
    }

--------------------
Думали это конец? Ха, всё только начинается.
PM MAIL   Вверх
Хрипа
Дата 8.4.2007, 01:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 227
Регистрация: 11.12.2006

Репутация: -6
Всего: нет



в базу пишеш сразу с 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);
Чтонить типа такого ))

Это сообщение отредактировал(а) Хрипа - 8.4.2007, 01:57
--------------------
<Вырезана, как не соответствующая правилам форума >
PM MAIL   Вверх
SelenIT
Дата 8.4.2007, 01:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


баг форума
****


Профиль
Группа: Завсегдатай
Сообщений: 3996
Регистрация: 17.10.2006
Где: Pale Blue Dot

Репутация: 32
Всего: 401



Ага. highlight_string, оказывается, сама по себе тоже заменяет спецсущности. Так что придется в строке 11 перед ней сделать обратную замену спецсущностей, что-то вроде такого...
Код

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



--------------------
Осторожно! Данный юзер и его посты содержат ДГМО! Противопоказано лицам с предрасположенностью к зонеризму!
PM MAIL   Вверх
DioNiR
Дата 8.4.2007, 02:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 130
Регистрация: 30.12.2006

Репутация: нет
Всего: нет



Работает почти как надо.

Только проблема стала другая. Из за чего всё и началась. Это сделать Подцветку кода.
Для чего я и юзал фунцию highlight_string.
--------------------
Думали это конец? Ха, всё только начинается.
PM MAIL   Вверх
SelenIT
Дата 8.4.2007, 02:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


баг форума
****


Профиль
Группа: Завсегдатай
Сообщений: 3996
Регистрация: 17.10.2006
Где: Pale Blue Dot

Репутация: 32
Всего: 401



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

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

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

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

Это сообщение отредактировал(а) SelenIT - 8.4.2007, 02:23


--------------------
Осторожно! Данный юзер и его посты содержат ДГМО! Противопоказано лицам с предрасположенностью к зонеризму!
PM MAIL   Вверх
DioNiR
Дата 8.4.2007, 02:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 130
Регистрация: 30.12.2006

Репутация: нет
Всего: нет



Ну если вместо моего:
Код
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, куда и как вставить это я уже знаю. основы я понимаю и знаю.

Это сообщение отредактировал(а) DioNiR - 8.4.2007, 02:27
--------------------
Думали это конец? Ха, всё только начинается.
PM MAIL   Вверх
SelenIT
Дата 8.4.2007, 02:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


баг форума
****


Профиль
Группа: Завсегдатай
Сообщений: 3996
Регистрация: 17.10.2006
Где: Pale Blue Dot

Репутация: 32
Всего: 401



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


--------------------
Осторожно! Данный юзер и его посты содержат ДГМО! Противопоказано лицам с предрасположенностью к зонеризму!
PM MAIL   Вверх
DioNiR
Дата 8.4.2007, 02:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 130
Регистрация: 30.12.2006

Репутация: нет
Всего: нет



Вот теперь работает отлично.

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


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

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

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

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

Это сообщение отредактировал(а) DioNiR - 8.4.2007, 02:35
--------------------
Думали это конец? Ха, всё только начинается.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0657 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.