投稿の目的は批判することです。ブログエンジンを作成して、Djangoを少し学びます。 ユーザーコンテンツの表示に問題がありました。 そのシールド。 私の機能を書きました。 ユーザーデータのスクリーニングのさまざまなイデオロギーを持つさまざまなサイトのコンテンツを作成した経験があります(どちらかと言えば否定的で、ほとんどのサイトは追加の作業を要求されます)。
発言。 私のブログでは、データベースは常に未処理の元のユーザー入力を保存します。 関数のタスクは、この入力からの表示にHTMLを適切にすることです。 最も単純なケースでは、コンテンツが(テンプレートまたはビューで)表示されている間に関数を呼び出すことができます。 パフォーマンスを向上させるために、データベースに別のフィールドを作成できます。これは、シールド機能の結果であり、コンテンツの更新中に更新されます。
したがって、機能の哲学:
- これが最初の原則です。ユーザーデータは最初は無効と見なされます。 したがって、許可されていないものはすべてスクリーニングされます。
- ユーザーの最小作業。 山かっこで構成を書きたい場合は、「<」について考えるのではなく山かっこを書きます。 など 関数自体が無効な文字を変換します。
- ただし、いくつかのタグを使用できます。 関数パラメーターによって設定されるもの、またはデフォルトのセットが使用されます。 各タグには有効な属性のセットがあります。 この関数は、有効なタグと有効な属性を残します。 無効な属性は単に出力から削除され、無効な属性はエスケープされます。
- 基本原則(および常識)に従って-オープンタグは自動的に閉じます。 開いていないタグを閉じるとエスケープされます。
- このブログは、プログラマー向けのテーマ、つまり ブログにはコードの断片があります。 これらのピースは完全にエスケープする必要があります(これはコードの一部であり、HTMLでさえもです)。 このタグは<pre> <code [class = "language"]> ... </ code> </ pre>です。 私はhighlight.jsコードハイライトライブラリに導かれ、コードフレーミングにこのようなフォーマットを使用しています。 このブロック内のすべてが完全にシールドされます。 強調表示されます。
- 私はkoloboksが大好きです:)したがって、この関数はオプションで絵文字を画像に置き換える必要があります。
それはユーザーにとって非常に簡単です-あなたが望むものを書くと、許可されたタグを除いてすべてがエスケープされます。
マークアップ、bbcode、マークダウンの準備ができていない理由:
- そのため、ユーザーはこの新しいマークアップを学習しません。
- 投稿のテキストが可能な限り「標準」(html)でポータブルであること。 投稿の元のテキストをコピーして貼り付け、コードでセクションを選別し、別のブログに貼り付けます-正しく表示されます。
かさばるhtmlタグに展開する独自のコンパクトなタグを作成することをお勧めしますが。 ほとんどの場合、ユーザー入力ごとにフィルターを割り当てることができるようにします。
テストから取られたいくつかの例はここにあります:
# New line test
text: 'New' + os.linesep + os.linesep + 'line'
html(text): 'New' + '<br/>' + os.linesep + '<br/>' + os.linesep + 'line')
# Simple smile test
text: ':)'
html(text): '<img src="/files/smile.gif"/>')
# Smile in code block test
text: '<pre><code>there will be no image :)</code></pre>'
html(text): '<pre><code>there will be no image :)</code></pre>')
# Plain text test
text: 'Some simple text without any tags'
html(text): 'Some simple text without any tags')
# Simple tags test
text: 'This is <b>important</b> information'
html(text): 'This is <b>important</b> information')
# Wrong tag test
text: 'This is <b>important</b> information and this is <h5>title</h5>'
html(text): 'This is <b>important</b> information and this is <h5>title</h5>')
# Wrong attributes test
text: 'This is <b onclick="javascript:alert();">probable XSS</b>'
html(text): 'This is <b>probable XSS</b>')
# Simple tags test
text: 'This is <img src="image.jpg" onclick="javascript:alert();"/>image'
html(text): 'This is <img src="image.jpg"/>image')
# Text without tags
text: 'Sample code: <?php print "Hello World"; ?>'
html(text): 'Sample code: <?php print "Hello World"; ?>')
# Code test
text: 'Sample code: <pre><code><a href="home.html">link</a></code></pre>'
html(text): 'Sample code: <pre><code><a href="home.html">link</a></code></pre>')
# Closing tag without opening tag
text: '</b>bold text ended'
html(text): '</b>bold text ended')
# Autoclosing tags test
text: '<b>bold and <i>italic</i> text'
html(text): '<b>bold and <i>italic</i> text</b>')
# Overlapping areas test
text: 'if 1 < 2 <b>only</b> then it is ok, but if 1 < 2 or 2 < 3 then <i>bad</i>'
html(text): 'if 1 < 2 <b>only</b> then it is ok, but if 1 < 2 or 2 < 3 then <i>bad</i>')
残念ながら、機能を表示できるサーバーはありません。
http://pastebin.com/f591d71e5にあります。
批判をお願いします、ありがとう。