73

セキュリティの高いアプリケーションがあり、他のユーザーに表示されるURLをユーザーが入力できるようにしたいと考えています。

これにより、XSSハッキングのリスクが高くなります。ユーザーがJavaScriptを入力して、別のユーザーが実行する可能性があります。私たちは機密データを保持しているので、これが決して起こらないことが不可欠です。

これに対処するためのベストプラクティスは何ですか?セキュリティホワイトリストまたはエスケープパターンだけで十分ですか?

リダイレクトの処理に関するアドバイス(たとえば、リンクをたどる前に警告ページに「このリンクはサイト外に出ます」というメッセージが表示されます)

ユーザーが入力したリンクをまったくサポートしないという議論はありますか?


明確化:

基本的に、ユーザーは次のように入力します。

stackoverflow.com

そして、それを別のユーザーに出力させます。

<a href="http://stackoverflow.com">stackoverflow.com</a>

私が本当に心配しているのは、XSSハックでこれを使用していることです。つまり、彼らは入力します:

alert('ハッキング!');

したがって、他のユーザーはこのリンクを取得します。

<a href="javascript:alert('hacked!');">stackoverflow.com</a>

私の例は、リスクを説明するためだけのものです。JavaScriptとURLは異なるものであることはよく知っていますが、後者を入力させることで、前者を実行できる可能性があります。

このトリックで壊すことができるサイトの数に驚かれることでしょう-HTMLはさらに悪いです。彼らがリンクを扱うことを知っているなら、彼らはまた、サニタイズ<iframe>し、<img>賢いCSS参照を知っていますか?

私は高度なセキュリティ環境で作業しています。1回のXSSハッキングで、非常に高い損失が発生する可能性があります。考えられるすべてのものを除外できる正規表現を作成できる(またはこれまでの優れた提案の1つを使用できる)ことができてうれしいですが、それで十分でしょうか?

4

12 に答える 12

59

URL にコードを含めることはできないと思われる場合は、考え直してください。

https://owasp.org/www-community/xss-filter-evasion-cheatsheet

それを読んで、泣いてください。

Stack Overflow での方法は次のとおりです。

/// <summary>
/// returns "safe" URL, stripping anything outside normal charsets for URL
/// </summary>
public static string SanitizeUrl(string url)
{
    return Regex.Replace(url, @"[^-A-Za-z0-9+&@#/%?=~_|!:,.;\(\)]", "");
}
于 2008-10-15T18:56:39.607 に答える
17

リンクを「安全」にするプロセスは、次の 3 つまたは 4 つのステップを経る必要があります。

  • 与えられた文字列をアンエスケープ/再エンコードします (RSnake は、エスケープと UTF エンコーディングを使用するhttp://ha.ckers.org/xss.html )。
  • リンクをクリーンアップします: 正規表現は良い出発点です - 必ず文字列を切り捨てるか、文字列に " (または出力の属性を閉じるために使用するもの) が含まれている場合は破棄してください; リンクを参照としてのみ実行している場合他の情報に対して、このプロセスの最後にプロトコルを強制することもできます - 最初のコロンの前の部分が 'http' または 'https' でない場合は、先頭に 'http://' を追加します。ユーザーがブラウザに入力する不完全な入力からのリンクを表示し、誰かがこっそり侵入しようとしたいたずらをつまずかせる最後の一撃をあなたに与えます。
  • 結果が整形式の URL (protocol://host.domain[:port][/path][/[file]][?queryField=queryValue][#anchor]) であることを確認します。
  • サイトのブラックリストと照らし合わせて結果を確認するか、何らかのマルウェア チェッカーを使用して結果を取得してみてください。

セキュリティが優先されるのであれば、ユーザーがこのプロセスで多少のパラノイアを許してくれることを願っています。

于 2008-10-16T20:08:37.043 に答える
4

出力時にリンクを HTML エンコードするだけです。javascript:リンクを許可しないようにしてください。(http、https、mailto など、受け入れられるプロトコルのホワイトリストを用意しておくことをお勧めします。)

于 2008-10-15T18:57:01.417 に答える
3

アプリケーションの言語を指定しない場合は、ASP.NETを想定します。これには、Microsoft Anti-Cross SiteScriptingLibraryを使用できます。

使い方はとても簡単です。必要なのはインクルードだけです。それだけです:)

このトピックについて話している間、安全なWebアプリケーションの設計ガイドラインを読んでみませんか。

他の言語の場合....ASP.NETのライブラリがある場合は、他の種類の言語(PHP、Python、RORなど)でも使用できる必要があります。

于 2008-10-15T18:51:47.883 に答える
1

リンクとして表示しないのはどうですか?テキストを使用してください。

自己責任で続行するための警告と組み合わせると十分な場合があります。

さらに、ホストされているCMSのHTMLマークアップをサニタイズする必要がありますか?も参照してください。ユーザー入力のサニタイズに関するディスカッション

于 2008-10-15T18:49:15.393 に答える
-2

16 進コードを使用して URL 全体を変換し、サーバーに送信できます。そうすれば、クライアントは一見しただけではコンテンツを理解できません。コンテンツを読み取った後、コンテンツ URL = ? をデコードできます。そしてそれをブラウザに送信します。

于 2013-07-26T08:14:19.317 に答える
-8

URLを許可することとJavaScriptを許可することは2つの異なることです。

于 2008-10-15T18:48:21.900 に答える