11

StackExchangeサイトは、質問と回答を書き込むためにMarkDown構文を使用します。これは、クライアント側でPageDownを使用し、サーバー側でMarkDownSharpJeffのHTMLサニタイザーを使用して構築されています。自分とよく似たものを作ろうと思っています。

サーバー側でHTMLをサニタイズする必要がある理由を理解しています。しかし、MarkDownSharpの目的は何ですか?クライアント側でPageDownを使用してMarkDownからHTMLに変換し、それをサーバーに送信しないのはなぜですか?

4

1 に答える 1

18

最も重要な理由:

  1. Stack Exchangeサイトの最も基本的な(「基本的な」意味での)機能である質問と応答がJavaScriptなしで機能することを望んでいます。投票、フラグ付け、UIの便利さ、ヘルプテキスト、お気に入り、グローバル受信トレイなど、JavaScriptを必要としないものなど、最も高度な機能は問題ありません。しかし、サイトがなくてはならないことの1つであるQ&Aには、摩擦をできるだけ低く保つために、その要件を含めるべきではありません。

    もちろん、JavaScriptが要件としてない場合は、クライアントにMarkdownのレンダリングを要求することはできません。

  2. 投稿の最新バージョンのレンダリングされたHTMLバージョンのみを保存します。過去のリビジョンについては、Markdownソースのみを保存します。古いバージョンはほとんど必要ないため、編集を行うたびに両方のバージョンを保存すると、スペースが大幅に浪費されます。ただし、改訂履歴などで必要になる場合もあります。そのためには、とにかくサーバー側でレンダリングする必要があります。

  3. サーバー側で再サニタイズしたとしても、クライアントにレンダリングを許可すると、実際にマークダウンから作成されたレンダリングバージョンで持つことができる信頼が明らかに失われます。次のことを想像してみてください。

    邪悪なスパマーである私は、次の回答を投稿します。

    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の両方を私から期待しているので、一方が他方から作成されたと信頼します。

    ロゴタグだけで120kの評判を持つ有名なStackOverflowユーザーであるSeanSceatが登場します。彼は、リンクが実際に関連するページに移動し、回答を高く評価し、賛成し、「すばらしい回答です。リンク先のサイトには役立つコンテンツがたくさんあります」と投稿していることを確認しました。コメント、そして彼がそれにいる間、彼はタイプミス「海」->「見る」(スパマーが故意に作った)を修正します。

    しかし、彼が「編集」をクリックした後にエディターにあったマークダウンには、関連するリンクが含まれていませんでしたロレックスのリンクが含まれていました。したがって、ショーンには知られていないが、彼はタイプミスを修正しただけでなく、スパマーのサイトに移動するためのリンクも変更した。

    これで、信頼できるユーザーからの最後の編集を含む投稿があり、回答を承認していますが、ユーザーにクリックさせたくないリンクが含まれています。

    また、改訂履歴(ポイント2を参照)では、リンクが変更されたことさえ示されません。

WMD JavaScriptエディターの元のバージョンには、実際には説明した機能が含まれていることに注意してください。レンダリングされたHTMLをサーバーに送信するように設定できます。リファクタリングされたバージョンを「PageDown」という名前で公開したときに、この機能を最終的に削除しました。これは、これを使用したことがなく、保守していたためです。正直なところ、実際に機能するかどうかはわかりません。

于 2012-03-15T10:28:50.440 に答える