web-dev-qa-db-ja.com

Djangoの<a href='{{ my_model.some_url }}'>を保護しています

私のDjangoテンプレートには、次のようなリンクがあります:

<a href='{{ my_model.some_url }}'>

some_urlビットはDjango URLFieldであり、ユーザーが影響を与えることができます。

これは何らかの方法で悪用される可能性がありますか? (頭に浮かぶのは、URLに引用符を含め、次に任意のHTMLを含めることです。)

このコードを保護するにはどうすればよいですか?

3
Ram Rachum

一般に、危険な有効なURLスキームがあります。明らかに[javascript:]は、疑似URLとして新しい場所ではなく、現在のページで実行するコマンドを指します。 javascript: URLをページに追加できるようにすると、クロスサイトスクリプティングの問題が発生します。

他のスクリプトエイリアス(vbscript:mocha:など)だけでなく、data:や、サードパーティソフトウェアがクライアントにインストールした任意の数の任意のプロトコルハンドラーもあります。したがって、通常はURLスキームをホワイトリストに登録する必要があります。

DjangoのURLFieldのデフォルトURLValidatorはこれを行い、http、https、ftpおよびftpsリンクのみを許可します。バリデーターを置き換えていない限り、問題ありません。 (必要なスキームのセットでない場合は、そうすることをお勧めします。)通常のフィールド/バリデーターを通過しないsome_urlフィールドを設定する他の方法がある場合は、それも検証されていることを確認します。

(頭に浮かぶのは、URLに引用符を含め、次に任意のHTMLを含めることです。)

autoescapeを無効にしていない限り、{{...}}テンプレートによって提供されるデフォルトのHTMLエスケープはそれを防ぎます(単一引用符を&#39;に正しくエンコードします)。

2
bobince