2009-04-19 1 views
2

Есть ли какая-либо доступная C++ (или, возможно, C) функция/класс/библиотека, только для того, чтобы дезинформировать строку, которая может содержать HTML?HTML Sanitization in C++

Я нахожу много исходного кода для дезинфекции на C# или других языках, более используемых в веб-приложении, но ничего в C++.

Я попытаюсь реализовать свою собственную функцию, если не найду какой-либо доступной, но я думаю, что проверенное решение будет намного лучше.

редактировать> Некоторые больше уточнения на моих потребностях:

Я получаю ввод текста с клавиатуры в моем приложении C++. Затем мне нужно дезинфицировать его, прежде чем использовать его в качестве параметра в вызове функции javascript. Этот javascript запускается на загруженной странице html, которая автоматически отображается (через Chromium) в текстуре, которую я показываю через библиотеку (Navi). Таким образом, Javascript функции я использую просто взять данный текст, положить P тег вокруг текста и ввести его в DIV, как это:

text_display.innerHTML += text_to_add; 

мне нужно дезинфицировать текст перед отправкой его на веб-странице , будь то для этой функции. Его просто нужно дезинфицировать перед входом в Chromium.

+0

Почему вы внедряете веб-приложение на C++? –

+0

Я не. Я использую библиотеку, которая генерирует текстуру из html/javascript/css. В настоящее время я вызываю (из C++) некоторый javascript на страницах с аргументами из строки в моем (C++) приложении. Эта строка вводится с клавиатуры, поэтому мне нужно санировать, прежде чем вводить код. – Klaim

+0

В документе подразумевается «ввод текста», а не код. – Klaim

ответ

6

HTML Tidy написан на c, но есть привязки для практически любого языка/платформы, including c++.

+0

Я не уверен, что понимаю, вы предлагаете мне использовать код из Tidy? – Klaim

+2

@ Отказ от дезинфекции HTML - это идеальный двухэтапный процесс - сначала обеспечение стандартизации стандартизации и соответствия спецификации. Во-вторых, он лишает HTML. Если мы попытаемся сделать все за один проход, мы должны учитывать множество способов, которыми HTML может быть искажен и все еще разобран/выполнен браузером. Если вы запускаете потенциальную разметку через что-то вроде HTML Tidy, она получается настолько чистой и нормализованной, что вы можете безопасно запускать ее против простого белого списка. –

+0

Спасибо за уточнения, я попробую. – Klaim

-1

This был размещен несколько часов назад. Это всего лишь статья о регулярных выражениях, но она точно содержит то, что вы хотите :) и я думаю, что this также может представлять интерес.

+2

Ум ... ваша первая ссылка на сообщение, написанное почти год назад. Может быть, «несколько часов» был промахом? ;-) –

+0

Ха-ха, я на самом деле имел в виду, что он был отправлен * здесь, на SO * несколько часов назад. Думаю, я должен был объяснить лучше, но опять же, простите меня, что здесь было 4 часа ночи в Турции, и я изо всех сил пытался написать программу сжатия в течение нескольких часов :) –

+0

Эти регулярные выражения обнаружили в них уязвимости. Кроме того, я сомневаюсь, что вы захотите загрузить его в PCRE. –

1

Вы можете использовать libxml2's xmlEncodeSpecialChars.

+0

Интересно, я попробую. Проблема, с которой я сталкиваюсь, добавляет такую ​​«большую» зависимость только для дезинфекции. Но если он работает хорошо, я могу попытаться изолировать код и получить его для моего проекта. – Klaim

1

Вы задаете здесь свой вопрос. Прежде чем вы получите хороший ответ, вам нужно четко указать, что именно вы хотите «разобрать» вне вашего ввода. Например, вы можете искать любые символы «<» и преобразовывать их в нечто другое, поэтому они не анализируются никаким парсером HTML.

Или вы могли бы найти образец < и> затем < /> узор. (Извините место, я должен был положить его здесь, так что HTML-парсер ЗДЕСЬ не съел бы его). Затем вам также нужно найти « теги одного элемента />».

Фактически вы можете найти допустимые/известные HTML-теги и удалить THOSE.

Итак, возникает вопрос, какой метод подходит для вашего решения? Зная, что если вы сделаете простой парсер, вы можете на самом деле разорвать действительный текст, содержащий символы большего и меньшего размера.

Итак, вот мой ответ для вас до сих пор.

Если вы хотите просто УДАЛИТЬ любой текст в стиле HTML, я бы рекомендовал использовать механизм регулярных выражений (PCRE) и использовать его для анализа вашего ввода и удаления всех совпадающих строк. Вероятно, это простое решение, но для этого требуется создание и создание PCRE, а также проблемы с GPL, о которых вам нужно знать, для вашего проекта. Разбор, вероятно, будет очень прост в реализации и быстро выполняется.

Второй вариант заключается в том, чтобы сделать это, пройдя буфер, ища открытый HTML-символ (<), затем разобравшись до тех пор, пока вы не нажмете первое пустое пространство, затем начните движение, ищите закрывающий HTML-символ (>), затем снова начните ходить, ища соответствующий тег CLOSING, основываясь на том, что вы только что разобрали. (Скажем, это тег DIV, который вы хотите искать/DIV.)

У меня есть код, который делает это в HTML-анализе STL, но есть много проблем, чтобы подумать и о том, чтобы идти по этому маршруту. Например, у вас есть коды сущностей для обработки, теги с одним элементом, такие как IMG, P и BR, чтобы назвать несколько.

Если вы хотите какой-то ДЕЙСТВИТЕЛЬНЫЙ отличный код на C, посмотрите на проект ClamAV. У них есть синтаксический анализатор HTML, который удаляет все теги из страницы и оставляет вас с ТОЛЬКО текстом. (между прочим это делает ..). Посмотрите в файле libclamav \ htmlnorm.c отличный пример «буфера хождения» и разбора. Это не самая быстрая вещь в мире, но она действительно работает ... У последнего Clam может быть даже столько всего, что связано с парсером HTML, это может быть трудно понять. Если да, вернитесь назад и посмотрите на более раннюю версию, например .88.4 или около того. Просто имейте в виду ошибки в тех старых кодовых базах, есть хорошие. :)

Надеюсь, это поможет.

+0

Я добавил некоторую точность по моим потребностям. Я попробую ваше последнее предложение, надеясь, что я смогу достаточно изолировать код. – Klaim

+0

Кажется, вам просто нужно «фильтровать» символы < and > ... Итак, просто напишите простой синтаксический анализатор, чтобы удалить их! Единственный сбой заключается в том, что они МОГУТ понадобиться на законном вводе, поэтому вам нужно уточнить, что если это так, то у вас гораздо большая проблема на ваших руках. Мне было бы интересно помочь вам решить эту проблему, так как я люблю C/++ и теперь навсегда застрял в мире C#, это будет хороший проект для работы. :) – LarryF

+0

Сначала я попробую предлагаемые здесь решения, прежде чем рассматривать создание домашнего решения, поскольку это кажется сложной проблемой (запись может содержать javascript тоже ...). Я подумаю, что вы поможете. Так или иначе, теперь проблема кажется ясной? Вы можете уже работать над решением, если хотите, я думаю. Я начал работать над чем-то и понял, что проблема была сложной и уже разрешена веб-приложениями, запущенными на C# anr ROR, например.Теперь мне нужно эквивалентное надежное решение для C++. – Klaim

0

Используйте QWeb Qtekit и проанализируйте дерево HTML. Затем вытолкните вывод. Это позволит немного очистить html.

+0

Разве это не слишком перебор? QT не является зависимостью моего проекта и добавляет его просто для этого не кажется хорошей идеей ... – Klaim

 Смежные вопросы

  • Нет связанных вопросов^_^