11

StackExchange 站点使用 MarkDown 语法编写问题和答案。这是在客户端使用PageDown以及在服务器端使用MarkDownSharpJeff 的 HTML sanitizer构建的。我正在考虑自己构建一些非常相似的东西。

我明白为什么我需要在服务器端清理 HTML。但是 MarkDownSharp 的目的是什么?为什么我不能在客户端使用 PageDown 将 MarkDown 转换为 HTML 并将其发送到服务器?

4

1 回答 1

18

最重要的原因:

  1. 我们希望 Stack Exchange 网站的最基本(在“基本”意义上)功能,即提问和回答,在没有 JavaScript的情况下工作。最高级的东西,比如投票、标记、UI 细节、帮助文本、收藏、全局收件箱等等不需要 JavaScript,没关系。但是网站不能没有的一件事——问答——不应该有这样的要求,以尽可能降低摩擦。

    当然,当您没有 JavaScript 作为要求时,您不能要求客户端呈现 Markdown。

  2. 我们只存储最新版本的帖子呈现的 HTML 版本。对于过去的修订,我们只存储 Markdown 源。为每次编辑存储两个版本将是一种巨大的空间浪费,因为几乎不需要旧版本。但有时它们是需要的,例如在修订历史中。所以为此,无论如何我们都必须在服务器端进行渲染。

  3. 即使您在服务器端重新清理,允许客户端进行渲染显然也会消除您对真正由 Markdown 制作的渲染版本的信任。想象一下:

    我,一个邪恶的垃圾邮件发送者,发布以下答案:

    As you can sea on [this awesome site][1],
    
    ... (long text on thread-safe usage of the turtle in LOGO) ...
    
    Hope that helps!
    
     [1]: http://almost-real-rolex-watches.biz
    

    但是我提交了一个渲染版本,其中的链接实际上指向了有关海龟并发复杂性的相关站点。由于服务器需要我提供 Markdown 源和呈现的 HTML,它相信一个是由另一个创建的。

    随之而来的是 Sean Sceat,著名的 Stack Overflow 用户,仅在徽标标签中就有 120k 的声誉。他看到链接确实转到了相关页面,喜欢答案,点赞,发布“很好的答案;您链接到的网站有大量有用的内容!” 评论,当他这样做时,他修复了错字“sea”->“see”(垃圾邮件发送者故意制造的)。

    但是他点击“编辑”后编辑器中的 Markdown不再包含相关链接;它包含劳力士链接。因此——肖恩不知道——他不仅修正了错字,还更改了链接以转到垃圾邮件发送者的网站。

    现在您有一个帖子,其中最后一次编辑来自受信任的用户,支持答案,但带有一个我们不希望人们点击的链接。

    并且修订历史记录(见第 2 点)甚至不会显示链接已更改。

需要注意的是,WMD JavaScript 编辑器的原始版本实际上具有您描述的功能;您可以将其设置为将呈现的 HTML 提交到服务器。当我们以“PageDown”的名义发布我们的重构版本时,我们最终删除了该功能,因为我们从未使用过它,维护过它,老实说,我不知道它是否真的有用了。

于 2012-03-15T10:28:50.440 回答