12

当您开发基于 Web 的应用程序并希望允许来自用户的格式丰富的文本时,您必须选择如何允许该输入。已经创建了许多不同的标记语言,因为可以说清理 HTML 更加困难。

各种不同的标记语言有哪些优缺点,例如:

或者换一种说法,您在选择使用特定标记语言时会考虑哪些因素。

4

4 回答 4

10

Markdown、BBCode、Textile、MediaWiki 标记基本上都是相同的通用概念,所以我真的只是将其归为两类:HTML 和纯文本标记。

HTML

与 HTML 的处理是内容已经是 Web 内容的“可呈现”形式。这很棒,节省了处理时间,而且它是一种易于解析的语言。几乎任何语言都有几十个库来处理 HTML 内容,将 HTML 转换为/从 HTML 转换为其他格式等。主要的缺点是,由于早期网络时代的松散标准,HTML 可能会非常多变,你可以在接受来自用户的 HTML 时,并不总是依赖于理智的输入。正如所指出的,整理或净化 HTML 通常是非常困难的,尤其是因为它无法像 XML 那样遵循正常的标记规则(即不正确的闭合标签很常见)。

纯文本标记

由于以下原因,经常使用此类别:

  • 易于从一个来源解析为多种形式 - PDF、HTML、RTF
  • 如果以后需要,内容存储在可读的纯文本中(通常比原始 HTML 更容易阅读),而不是需要从 HTML 中提取
  • 遵循特定的定义规则,其中 HTML 可能是令人讨厌的变量和非结构化
  • 允许您强制使用在许多情况下更合适的内容格式子集,而不是简单地允许完整的 HTML
  • 除了强制使用 HTML 子集之外,还可以轻松清理输入并防止跨站点脚本问题等。
  • 以抽象格式保存“原始”数据意味着在以后,例如,如果您想将您的网站从 HTML 4 转换为 XHTML,您只需要更改解析代码。使用 HTML 格式的用户输入,您现在不得不将所有 HTML 单独转换为 XHTML,正如 HTML Tidy 所示,这并不总是一项简单的任务。同样,如果在某个时候出现了一种新的标记语言,或者您需要迁移到另一种格式(RTF、PDF、TeX),那么文本格式选项的抽象受限子集会使这项任务变得更加简单。

底线是用户输入的用途。如果您打算保留数据并且可能需要改组格式等,那么使用谨慎的抽象格式来存储信息是有意义的。如果您出于任何原因需要手动处理原始数据,那么如果该格式易于人类阅读,则可以加分。如果您只在网页(或用于报告的 HTML 文档等)中显示内容,并且您不担心对其进行转换或对其进行未来验证,那么将其存储在 HTML 中是一种合理的做法。

于 2008-12-05T05:25:44.637 回答
5

Jeff讨论了codinghorror.com 上的一些利弊,当时他们还处于整合 SO 的初始阶段。我认为这是一本值得一读的书。

于 2008-12-05T05:34:04.043 回答
0

@netrox 数据库不是问题,浏览器输出才是。

唯一需要担心的是最终呈现可能会被用户插入的 HTML 破坏。例如,用户可以打开一个<li>标签但从不关闭它,这取决于页面的结构,可能会破坏随后的整个布局。或者另一个例子打开一个<strong>标签而不关闭它,使所有剩余的内容变为粗体。

因此,不仅必须验证允许的标签,而且您究竟如何允许某些标签而不是其他标签?因为使用 PHP 方法很容易阻止所有 HTML 标签的解析htmlspecialchars(),但是当涉及到允许某些标签时,您将不得不寻找其他方法。有一个strip_tags()PHP 函数可以删除(完全删除)不允许的标签,但这意味着以一种不好的方式改变用户的内容,例如阻止用户发布简单的代码(共享/显示的代码,而不是处理的代码) .

除了破坏布局外,您还必须考虑 XSS 攻击,例如将 javascript 插入链接的 href 属性,例如可以将用户重定向到另一个站点。查看这个可能的 XSS 攻击的长列表:https ://www.owasp.org/index.php/XSS_Filter_Evasion_Cheat_Sheet

如您所见,防止所有 HTML 标记被解释非常容易,但仅防止某些标记要复杂得多。要理解这一点,你可以看看巨大的“ HTML Purifier ”框架,它的唯一目的是允许一些 HTML 标签并确保输出的 HTML 是有效的(即不会破坏页面)并且没有 XSS 攻击。

于 2013-07-14T14:45:18.077 回答
-1

“已经创建了许多不同的标记语言,因为可以说清理 HTML 更加困难。”

真的吗?有多难?有一些功能可以删除潜在危险的属性或标签,并在将 HTML 输入数据库或文件之前对其进行验证。你能给我举例说明清理 HTML 有多困难吗?

于 2010-10-21T18:15:26.783 回答