Как я могу сохранить UTF8 в MySQL с PHP, очистить его, повторить с XML и преобразовать с помощью XSLT? - PullRequest
1 голос
/ 27 октября 2010

Я разрабатываю приложение MVC с PHP, которое использует XML и XSLT для печати представлений.Он должен быть полностью поддержан UTF-8.Я также использую MySQL, настроенный с помощью UTF8.Моя проблема заключается в следующем.

У меня есть <input type="text"/> со значением вроде àáèéìíòóùú "> <'@ # ~! ¡¿? </strong>. Это обрабатывается для добавления его в базу данныхЯ использую mysql_real_escape_string($_POST["name"]), а затем делаю MySQL INSERT. Это добавит косую черту \ before " и '.

База данных MySQL имеет DEFAULT CHARACTER SET utf8 и COLLOCATE utf8_spanish_ci.Поле таблицы является обычным VARCHAR.

Затем я должен напечатать это на XML, который будет преобразован с помощью XSLT.Я могу использовать PHP на XML, поэтому я повторяю его с <?php echo TexUtils::obtainSqlText($value_obtained_from_sql); ?>.Функция receiveSqlText () фактически возвращает то же самое, что обработанное значение $, ожидает окончательной структуры.

Одна из первых вещей, которые мне понадобятся для выбранного ввода, - преобразование> и <</strong> до &gt; и &lt;, поскольку это вызовет проблемы с тегами начала / конца.Это будет сделано с <?php htmlspecialchars($string, ENT_QUOTES, "UTF-8"); ?>.Это также преобразует & в &amp;, " в &quot; и ' в &#039;. Это большая проблема: XSLT начинает давать сбойпотому что он не распознает все специальные символы HTML.

Существует еще одна проблема. Я говорил о вводе àáèéìíòóùú "> <'@ # ~! ¡¿? * </strong>, но у меня будеткакой-нибудь текст из CKEditor <textarea />, который будет выглядеть так:

<p>
    <a href="http://stackoverflow.com/">àáèéìíòóùú"><'@#~!¡¿?</a>
</p>

Как мне управлять этим?Сначала, если я хочу напечатать это второе значение правильно, мне нужно будет использовать <xsl:value-of select="value" disable-output-escaping="yes" />.Будет ли "> <'</strong> печатать правильно?

Так что я действительно ищу, как мне нужно управлять этими значениями и как я должен печатать. Мне нужно что-то использовать, если естьисходящий из VARCHAR, который не позволяет использовать HTML, а другой - если TEXT (например) и разрешает HTML? Мне нужно будет использовать disable-output-escaping = "yes" каждый раз?

Я также хочу знать, действительно ли при этом я защищаю запрос от атак XSS.

Заранее спасибо!

1 Ответ

3 голосов
/ 27 октября 2010

Это будет сделано с <?php htmlspecialchars($string, ENT_QUOTES, "UTF-8"); ?>.

Fine.

Это большая проблема: XSLT начинает отказывать, потому что нераспознавать все специальные символы HTML.

Не должно произойти сбой при выводе htmlspecialchars().&amp; - это предопределенная сущность в XML, а &#39; - это символьная ссылка, которая всегда разрешена.htmlspecialchars() должен выдавать XML-совместимый вывод, в отличие от обычно ошибочной htmlentities().Какую ошибку вы видите?

<a href="http://stackoverflow.com/">àáèéìíòóùú"><'@#~!¡¿?</a>

Ух, редактор форматированного текста HTML создал эту недопустимую разметку?Что за хитрый редактор.

Если вам нужно разрешить пользователям вводить произвольный HTML, то потребуется некоторая обработка.Если вы действительно не доверяете этим пользователям, вам понадобится очиститель (чтобы они не использовали опасные элементы сценариев и XSS-совместимость друг с другом) и аккуратность (для удаления искаженной разметки либо из-за дерьма в редакторе rich-text, либо из-за умышленного саботажа).Если вы намереваетесь поместить контент непосредственно в XML, вам также понадобится преобразовать его в вывод XHTML и заменить ссылки на сущности HTML.

Простой способ сделать это в PHP - это DOMDocument->loadHTML, за которым следует обходдерево DOM удаляет все, кроме известных элементов / атрибутов / URL-схем, за которыми следуют DOMDocument->saveXML.

Будет ли "><' печатать правильно?

Ну,это напечатает как в вашем примере, да.Но это в равной степени неверно как HTML, так и XML.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...