富文本格式的标记语言是什么?

12

在开发基于Web的应用程序并且希望允许用户输入丰富格式文本时,您需要选择如何允许该输入。因为清洗HTML可能更加困难,所以已经创建了许多不同的标记语言。

不同的标记语言的优缺点是什么,例如:

或者换句话说,当选择使用特定的标记语言时,您考虑哪些因素。

4个回答

11

Markdown、BBCode、Textile和MediaWiki标记语言实质上都是相同的概念,因此我会将它们归为两个类别:HTML和纯文本标记。

HTML

HTML的内容已经处于适合Web内容的“可呈现”形式。这很好,可以节省处理时间,并且它是一种易于解析的语言。几乎任何编程语言中都有数十个库可处理HTML内容,将其转换为其他格式等等。主要缺点是由于早期Web日的松散标准,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中是一个合理的做法。


5

1
这篇文章(http://www.codinghorror.com/blog/archives/001116.html)是你所指的文章吗? - Zoredache
是的,他几周后进行了跟进。 - Lawrence Dol
猴子:请将此链接添加到您的答案中 :) - Aaron Digulla

1

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

唯一的问题是最终呈现可能会被用户插入的HTML破坏。例如,用户可以打开一个<li>标签但从未关闭它,这取决于页面结构,可能会潜在地破坏其后的整个布局。或者另一个例子是打开一个<strong>标签而没有关闭它,使得所有剩余内容都变成粗体。

因此,不仅必须验证允许的标记,还必须确切地确定如何允许某些标记而不允许其他标记?因为使用htmlspecialchars() PHP方法很容易防止解析所有HTML标记,但是当涉及到允许某些标记时,您将不得不寻找其他方法。有strip_tags() PHP函数可用,它会删除(完全删除)非允许标记,但这意味着以不良方式更改用户的内容,防止用户发布简单的代码(用于共享/显示,而不是用于处理的代码)。

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

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


-1

许多不同的标记语言被创建出来,因为清理HTML可能更加困难。

真的吗?为什么会这么难呢?有函数可以删除潜在危险的属性或标签,并在将其输入数据库或文件之前验证HTML。你能给我举一些清理HTML的困难例子吗?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接