PythonリッチテキストXSSフィルター

はじめに:その日、私はウェブサイトの最も重要な部分であるXSSフィルターを開発していましたが、女神は突然電話をかけて、「それはとても難しいので、開発をやめて、私の家に遊びに来てください!」と言いました。私は自分のウェブサイトにXSSの脆弱性を漏らさせようとして、「ポップ」で電話を切りました。

Pythonは徐々にWeb開発の主流の1つになりましたが、関連するサードパーティのモジュールとライブラリの中には、PHPやNode.jsほど多くないものもあります。

たとえば、XSSフィルターコンポーネントであるPHPには、有名な「HTML Purifier」([http://htmlpurifier.org/](http://htmlpurifier.org/))と、有名ではないフィルターコンポーネント「XssHtml」([http://phith0n.github.io/XssHtml](http://phith0n.github.io/XssHtml))がありますが、後者はもちろん自分で開発したものです。

「html-purifier」という名前のライブラリもpythonのpipの下にインストールできますが、このpurifierはphpの下のものとはかなり異なります。このライブラリは、htmlのホワイトリスト外のタグと属性を除外する役割を果たします。

XSSはフィルタリングせず、ホワイトリストにないタグと属性のみをフィルタリングすることに注意してください。つまり、同様のJavaScriptはフィルタリングされません。

そのため、自分でpython xssフィルターを開発し、将来のpythonプロジェクトで使用する必要がありました。

特定の実装原則について話します。

[ 1. HTMLを解析](https://www.leavesongs.com/#html)##

HTMLを解析するには、pythonに付属のHTMLParserクラスを使用します。 python2では名前はHTMLParserであり、python3ではhtml.parserと呼ばれます。

HTMLParserを使用するには、HTMLParserを継承し、handle_starttag、handle_startendtag、handle_endtag、handle_data、およびその他のメソッドを実装するための独自のクラスが必要です。

たとえば、タグを入力すると、handle_starttagメソッドが呼び出されます。このメソッドを実装すると、この時点で処理されているタグとすべての属性属性を取得できます。

タグと属性がホワイトリストにあるかどうかを確認し、次のように、いくつかの特別なタグと属性に対して特別な処理を行うことができます。

[ 2.リンクの特別な処理](https://www.leavesongs.com/#_1)##

埋め込みのhrefやsrcなど、一部の属性はjavascript疑似プロトコルで実行できるため、特別な処理が必要です。http| https | ftp://で始まるかどうかを判断し、そうでない場合は、前に強制します。 http://を追加

このようにして、潜在的なXSS注入に対して。

[ 3、特殊処理を埋め込む](https://www.leavesongs.com/#embed)##

Embedは、swfなどのメディアファイルを埋め込むためのタグです。理論的には、リッチテキストエディタでフラッシュを挿入できる場合があります。ただし、任意のjavascriptコードをフラッシュで実行したり、一部のHTTP要求を実行したりできないようにする必要があります(これにより、CSRF攻撃が簡単に発生します)。

したがって、embedタグのallowscriptaccess = neverおよびallownetworking = noneを設定する必要があります。

[ 4.タグと属性をつなぎ合わせるときは、二重引用符が消えて新しいタグにならないようにします](https://www.leavesongs.com/#_2)##

Roundcube WebmailでXSSの脆弱性(CVE-2015-1433)を見つけたことがあります。その理由は、ホワイトリストのチェックが完了した後にhtmlタグと属性がスプライスされたときに二重引用符がフィルタリングされなかったため、属性値が消えて新しいものになりました。属性名によりXSSが発生します。

そこで、self .__ htmlspecialcharsを使用して属性値を処理し、属性値が消えないようにします。

最後に、このモジュールの方が使いやすく、最も簡単なデモは次のとおりです。

import pxfilter
parser = pxfilter.XssHtml()
parser.feed('<html code>')
parser.close()
html = parser.getHtml()
print html

次に、ソースコードの指示に従って変更します。 githubプロジェクトアドレス:[https://github.com/phith0n/python-xss-filter](https://github.com/phith0n/python-xss-filter)

web.pyを使用してデモを作成しました。問題のテストと送信を歓迎します:[http://python-xss-filter.leavesongs.com/](http://python-xss-filter.leavesongs.com/)、機能と安全性に関するいくつかの提案が必要です。

Recommended Posts

PythonリッチテキストXSSフィルター
Pythonはテキストバージョンのminesweeperを実装しています
pythonで数値をフィルタリングする方法