私のDjangoテンプレートには、次のようなリンクがあります:
<a href='{{ my_model.some_url }}'>
some_url
ビットはDjango URLField
であり、ユーザーが影響を与えることができます。
これは何らかの方法で悪用される可能性がありますか? (頭に浮かぶのは、URLに引用符を含め、次に任意のHTMLを含めることです。)
このコードを保護するにはどうすればよいですか?
一般に、危険な有効なURLスキームがあります。明らかに[javascript:
]は、疑似URLとして新しい場所ではなく、現在のページで実行するコマンドを指します。 javascript:
URLをページに追加できるようにすると、クロスサイトスクリプティングの問題が発生します。
他のスクリプトエイリアス(vbscript:
、mocha:
など)だけでなく、data:
や、サードパーティソフトウェアがクライアントにインストールした任意の数の任意のプロトコルハンドラーもあります。したがって、通常はURLスキームをホワイトリストに登録する必要があります。
DjangoのURLFieldのデフォルトURLValidatorはこれを行い、http、https、ftpおよびftpsリンクのみを許可します。バリデーターを置き換えていない限り、問題ありません。 (必要なスキームのセットでない場合は、そうすることをお勧めします。)通常のフィールド/バリデーターを通過しないsome_url
フィールドを設定する他の方法がある場合は、それも検証されていることを確認します。
(頭に浮かぶのは、URLに引用符を含め、次に任意のHTMLを含めることです。)
autoescape
を無効にしていない限り、{{...}}
テンプレートによって提供されるデフォルトのHTMLエスケープはそれを防ぎます(単一引用符を'
に正しくエンコードします)。