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