当您开发基于 Web 的应用程序并希望允许来自用户的格式丰富的文本时,您必须选择如何允许该输入。已经创建了许多不同的标记语言,因为可以说清理 HTML 更加困难。
各种不同的标记语言有哪些优缺点,例如:
或者换一种说法,您在选择使用特定标记语言时会考虑哪些因素。
Markdown、BBCode、Textile、MediaWiki 标记基本上都是相同的通用概念,所以我真的只是将其归为两类:HTML 和纯文本标记。
与 HTML 的处理是内容已经是 Web 内容的“可呈现”形式。这很棒,节省了处理时间,而且它是一种易于解析的语言。几乎任何语言都有几十个库来处理 HTML 内容,将 HTML 转换为/从 HTML 转换为其他格式等。主要的缺点是,由于早期网络时代的松散标准,HTML 可能会非常多变,你可以在接受来自用户的 HTML 时,并不总是依赖于理智的输入。正如所指出的,整理或净化 HTML 通常是非常困难的,尤其是因为它无法像 XML 那样遵循正常的标记规则(即不正确的闭合标签很常见)。
由于以下原因,经常使用此类别:
底线是用户输入的用途。如果您打算保留数据并且可能需要改组格式等,那么使用谨慎的抽象格式来存储信息是有意义的。如果您出于任何原因需要手动处理原始数据,那么如果该格式易于人类阅读,则可以加分。如果您只在网页(或用于报告的 HTML 文档等)中显示内容,并且您不担心对其进行转换或对其进行未来验证,那么将其存储在 HTML 中是一种合理的做法。
Jeff讨论了codinghorror.com 上的一些利弊,当时他们还处于整合 SO 的初始阶段。我认为这是一本值得一读的书。
@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 攻击。
“已经创建了许多不同的标记语言,因为可以说清理 HTML 更加困难。”
真的吗?有多难?有一些功能可以删除潜在危险的属性或标签,并在将 HTML 输入数据库或文件之前对其进行验证。你能给我举例说明清理 HTML 有多困难吗?