0

lxml.html.cleanを使用して、htmlコード内の信頼できない入力を削除します。lxmlがdata:コード内のタグを削除することに気づきました。ただし、base64形式で画像を挿入したいので(データベースから、ファイルがありません)、このタグが必要です。たとえば、

from lxml.html.clean import Cleaner
cleaner = Cleaner()
cleaner.clean_html("""
    <img src="http://test.com/img.png"/>
    <img src="data:image/png;base64,aGVsbG8="/>
""")

結果は'<span><img src="http://test.com/img.png"><img src=""></span>'です。最初の画像はエスケープされません。2番目の画像はエスケープされます。

脆弱性を通過させずにbase64コードを受け入れるようにする方法はありますか?

4

1 に答える 1

1

lxml 3.1.0をインストールした後、この動作を再現することができました。これが「モンキーパッチ」に基づく解決策です。lxml.html.cleanモジュール内のルックアップ正規表現パターンを置き換えて、data:image/.*;base64を持つリンクを削除から除外します。

import re
import lxml
from lxml.html.clean import Cleaner
new_pattern = '\s*(?:javascript:|jscript:|livescript:|vbscript:|data:[^(?:image/.+;base64)]+|about:|mocha:)'

print(new_pattern)

lxml.html.clean._javascript_scheme_re = re.compile(new_pattern, re.I)


cleaner = Cleaner()
dochtml = """
    <img src="http://test.com/img.png"/>
    <img src="data:image/png;base64,aGVsbG8="/>
    <img src="data:unsafe/contents;base64,aGVsbG8="/>
    <img src="data:text/html;base64,PGh0bWw+PHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPmFsZXJ0KC‌​doaScpPC9zY3JpcHQ+PC9odG1sPg=="/>
"""
r = cleaner.clean_html(dochtml)
print(r)

結果

<span><img src="http://test.com/img.png">
    <img src="data:image/png;base64,aGVsbG8=">
    <img src="">
    <img src="">
</span>

その欠点は、Cleanerのパブリックインターフェイスでアナウンスされていない内部変数名に依存していることです。したがって、モジュール開発者は、変数の名前を変更したり、正規表現のバージョンを改善したりできます。

安全のために、Webサーバー上にURLハンドラーを作成して、データベースからIDで画像コンテンツを返します。したがって、HTMLドキュメントでは次のようになります<img src="http://myserver/showimg?id=123213">。ただし、これには、Webサーバーなど、多くの可動部分を追加する必要があります。また、全世界がこれらの画像にアクセスすることが望ましくない場合は、機能しません。

古い答え:

これらのタグを保持するようにCleanerを構成することは可能ですが、私はあなたのケースを再現することはできません-それは私にとってはうまくいきます。私はpython2.7.2とlxml2.2.8win-32を使用しています。Pythonとlxmlのバージョンを明確にしてください。

私はあなたの例を実行しようとしましたが、削除されなかった2番目の画像タグの内容を取り戻しました

于 2013-03-20T15:54:28.397 に答える