【问题标题】:HTML Sanitization in C++C++ 中的 HTML 清理
【发布时间】:2010-10-20 08:32:42
【问题描述】:

是否有任何可用的 C++(或者可能是 C)函数/类/库仅用于清理可能包含 HTML 的字符串?

我发现很多用于清理 C# 或其他在 Web 应用程序中更常用的语言的源代码,但在 C++ 中没有。

如果我找不到任何可用的功能,我会尝试实现自己的功能,但我认为经过大量测试的解决方案会好得多。

edit> 更精确地满足我的需求:

我在 C++ 应用程序中从键盘获取文本输入。然后我需要在将其用作 javascript 函数调用中的参数之前对其进行清理。该javascript在加载的html页面中运行,该页面在我通过库(Navi)显示的纹理中自动呈现(通过Chromium)。 因此,我使用的 javascript 函数将简单地获取给定的文本,在文本周围放置 P 标签并将其注入到这样的 div 中:

text_display.innerHTML += text_to_add;

我需要在将文本发送到网页之前对其进行清理,无论是用于此功能还是其他功能。只需在输入 Chromium 之前对其进行消毒。

【问题讨论】:

  • 你为什么要用 C++ 实现一个 Web 应用程序?
  • 我不是。我正在使用一个从 html/javascript/css 生成纹理的库。我目前在页面中调用(从c++)一些javascript,参数来自我的(c++)应用程序中的字符串。该字符串是通过键盘输入的,所以我需要在注入代码之前进行清理。
  • 意思是“注入文本”,而不是代码。

标签: c++ html sanitization


【解决方案1】:

HTML Tidy 是用 c 编写的,但几乎所有语言/平台都有绑定,including c++

【讨论】:

  • 我不太明白,你建议我使用一些 Tidy 的代码吗?
  • @Klaim 清理 HTML 理想情况下是一个两步过程 - 首先确保标记标准化并符合规范。其次是剥离 HTML。如果我们试图一次性完成所有操作,我们必须考虑到 HTML 可能被破坏并仍然由浏览器解析/执行的无数种方式。如果您通过 HTML Tidy 之类的东西运行潜在标记,它会变得如此干净和规范化,您可以安全地针对简单的白名单运行它。
  • 感谢您的精确,我会试试看。
【解决方案2】:

This 是几小时前发布的。这只是一篇关于正则表达式的文章,但它恰好包含您想要的内容:) 我认为 this 可能也很有趣。

【讨论】:

  • 嗯...您的第一个链接是近一年前写的一篇文章。也许“几个小时”是个误会? ;-)
  • 哈哈,我的意思是它是在几小时前发布的here on SO。我想我应该解释得更好——但话说回来,请原谅我,土耳其现在是凌晨 4 点,我一直在努力编写一个压缩程序几个小时 :)
  • 那些正则表达式存在已知漏洞。另外,我怀疑您是否想将其加载到 PCRE 中。
【解决方案3】:

【讨论】:

  • 有趣,我会试试的。我遇到的问题是添加这样一个“大”依赖项只是为了清理。但如果它运行良好,我可以尝试隔离代码并为我的项目获取它。
【解决方案4】:

你在这里问了很多问题。在你得到一个好的答案之前,你需要清楚你想要从你的输入中“解析”出什么。例如,您可以查找任何“

或者,您可以搜索 的模式,然后是 模式。 (对不起,我不得不把它放在这里,这样 HTML 解析器 HERE 就不会吃掉它)。然后,您还需要查找“”。

您实际上可以查找有效/已知的 HTML 标记并将其删除。

那么,问题就变成了,哪种方法适合您的解决方案?知道如果您制作一个简单的解析器,您实际上可能会撕掉包含大于和小于符号的有效文本。

所以,到目前为止,这是我给你的答案。

如果您只想删除任何 HTML 风格的文本,我建议您使用正则表达式引擎 (PCRE),并使用它来解析您的输入,并删除所有匹配的字符串。这可能是一个简单的解决方案,但它确实需要您获取并构建 PCRE,并且您需要为您的项目了解 GPL 问题。解析可能真的很容易实现,并且运行速度很快。

第二种选择是通过遍历缓冲区,寻找打开的 HTML 字符 (),然后再次开始行走,根据您刚刚解析的内容寻找匹配的 CLOSING 标记。 (比如说,它是一个 DIV 标签,你要查找 /DIV。)

我有在 STL HTML 解析器中执行此操作的代码,但也有很多问题需要考虑走这条路。例如,您需要处理实体代码,例如 IMG、P 和 BR 等单元素标签。

如果您想查看一些非常棒的 C 代码,请查看 ClamAV 项目。他们有一个 HTML 解析器,可以去除页面中的所有标签,只剩下剩下的文本。 (除其他外它确实..)。在文件 libclamav\htmlnorm.c 中查看有关“缓冲行走”和解析的一个很好的示例。这不是世界上最快的东西,但它确实有效......最新的 Clam 甚至可能有很多东西与 HTML 解析器相关联,实际上可能很难理解。如果是这样,请返回并查看早期版本,例如 .88.4 左右。请注意那些旧代码库中的错误,有一些好的。 :)

希望这会有所帮助。

【讨论】:

  • 我根据自己的需要添加了一些精度。我会尝试你的最后一个建议,希望我能足够隔离代码。
  • 看来您只需要“过滤” 字符...所以,只需编写一个简单的解析器来删除它们!唯一的小问题是合法输入中可能需要这些,所以你需要澄清如果是这样的话,那么你手上的问题就更大了。我有兴趣帮助您解决这个问题,因为我喜欢 C/++,现在永远停留在 C# 世界中,这将是一个不错的项目。 :)
  • 我会先尝试这里提出的解决方案,然后再考虑制作一个自制的解决方案,因为这似乎是一个复杂的问题(条目也可能包含 javascript...)。然后我会考虑你的帮助。无论如何,现在问题似乎清楚了吗?如果你愿意,我猜你已经可以着手解决了。我开始研究一些东西,并认为问题很复杂,并且已经通过在 C# anr ROR 上运行的 Web 应用程序解决了。现在我需要一个等效的强大的 C++ 解决方案。
【解决方案5】:

使用 Qt 的 QWebkit 并解析 HTML 树。然后用它吐出输出。这会稍微清理一下 html。

【讨论】:

  • 是不是有点矫枉过正? QT 不是我项目的依赖项,仅为此添加它似乎不是一个好主意...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-12-22
  • 1970-01-01
  • 1970-01-01
  • 2011-03-05
  • 1970-01-01
  • 2010-11-05
  • 2017-12-31
相关资源
最近更新 更多