0

セキュリティ関連の質問があります。私の Web アプリケーションでは、ユーザーが URL を入力できます。URL はすぐにデータベースに保存されます (この時点ではサニタイズは行われていません。これは間違っていますか?)。Linq to SQL を使用しているため、既にパラメーター化されています。ユーザーにハイパーリンクを表示するときは、リピーターを使用しています。ツールチップや href プロパティだけでなく、ハイパーリンク テキストもエンコードする必要がありますか? または、(表示される) テキストをエンコードするだけでよいのでしょうか。また、ここでは URL エンコードが必要だと思いますが、HTML エンコードも使用する必要がありますか?

Server.UrlEncodeテキストがあった3つのプロパティすべてを試して<script> alert("hello") </script>みましたが、hrefとテキストが台無しになっているようです。これは、完全に保護されていないことを意味していると思いますか?

編集 - 出力時にエンコードする場合、「%2」の代わりに「/」が表示されるようにするにはどうすればよいですか? ありがとう

4

3 に答える 3

1

入力時にすぐにサニタイズする必要があります (これはエスケープとは異なります)。これは、データが URL であること、または少なくとも URL に許可された文字のみが含まれていることを確認する何らかの検証を実行することを意味します。これを行うには Regex を使用するか、URL 解析ライブラリを使用します (申し訳ありませんが、.NET の API に詳しくありません)。

HTML 要素内の URL として使用する場合を除いて (そうします!)、出力時にエンコードする必要があります。ツールチップとリンク タグの本文のテキストを必ずエンコードする必要があります。データベースに入力する前に、入力をサニタイズする方法について、私は特に一生懸命考えます。XSS攻撃の例のこの素晴らしいリソースを参照することをお勧めします。

データベースに保存するときではなく、出力時にエンコードする理由は、出力メディアごとに異なるエンコード/エスケープ規則がある可能性があるためです。たとえば、HTML は JavaScript とは異なります。JavaScript は、PDF、Flash、CSS などとは異なります。

また、SQL インジェクションを避けるために、データベースに保存するときに準備済みステートメントを使用していると思いますか?

于 2010-02-26T13:32:06.373 に答える
1

これは間違っていますか?YES 出力ではなく、入力時にサニタイズします。

dbに保存する前にサニタイズすれば、出力時にエンコードする必要はありません。経験則: すべてのレイヤーまたはアプリのデータを信頼して、早期にサニタイズします。

于 2010-02-26T02:00:56.210 に答える