セキュリティを処理し、ユーザーが入力した URL による XSS を回避する最良の方法
-
03-07-2019 - |
質問
セキュリティの高いアプリケーションを使用しているため、ユーザーが他のユーザーに表示される URL を入力できるようにしたいと考えています。
これにより、XSS ハッキングの高いリスクが生じます。ユーザーが入力した JavaScript を別のユーザーが実行してしまう可能性があります。私たちは機密データを保持しているため、このようなことが決して起こらないことが重要です。
これに対処するベストプラクティスは何ですか?セキュリティ ホワイトリストやエスケープ パターンだけで十分ですか?
リダイレクトへの対処に関するアドバイス (たとえば、リンクをたどる前の警告ページに「このリンクはサイト外に出ます」というメッセージが表示される)
ユーザーが入力したリンクをまったくサポートしないという議論はありますか?
説明:
基本的にユーザーは次のことを入力したいと考えています。
スタックオーバーフロー.com
そして、それを別のユーザーに出力させます。
<a href="http://stackoverflow.com">stackoverflow.com</a>
私が本当に心配しているのは、彼らがこれを XSS ハックに使用していることです。つまり、彼らは次のように入力します。
アラート('ハッキングされました!');
したがって、他のユーザーは次のリンクを取得します。
<a href="alert('hacked!');">stackoverflow.com</a>
私の例はリスクを説明するためのものです。JavaScript と URL が別のものであることはよく知っていますが、後者を入力させることで前者を実行できる可能性があります。
このトリックでどれだけ多くのサイトを破壊できるか驚かれるでしょう - HTML はさらに悪質です。リンクの扱い方を知っているなら、サニタイズすることも知っていますか <iframe>
, <img>
賢い CSS リファレンスはどうでしょうか?
私は高度なセキュリティ環境で作業しています。XSS ハッキングが 1 つ発生すると、非常に大きな損失が発生する可能性があります。考えられるすべてを除外できる正規表現を作成できたこと (または、これまでの優れた提案の 1 つを使用できたこと) に満足していますが、それだけで十分でしょうか?
解決
URLにコードを含めることができないと思われる場合は、もう一度考えてみてください!
https://www.owasp.org/index.php/XSS_Filter_Evasion_Cheat_Sheet
それを読んで、泣きます。
スタックオーバーフローで行う方法は次のとおりです。
/// <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+&@#/%?=~_|!:,.;\(\)]", "");
}
他のヒント
リンクを「安全」にレンダリングするプロセスは、次の 3 つまたは 4 つのステップを経る必要があります。
- 指定された文字列をエスケープ/再エンコードします (RSnake は、次の URL で多くのトリックを文書化しています)。 http://ha.ckers.org/xss.html エスケープと UTF エンコーディングを使用します)。
- リンクをクリーンアップします。正規表現は良いスタートです。文字列に " (または出力内の属性を閉じるために使用したもの) が含まれている場合は、必ず文字列を切り詰めるか、破棄してください。他の情報への参照としてのみリンクを実行している場合は、このプロセスの最後にプロトコルを強制することもできます。最初のコロンの前の部分が「http」または「https」でない場合は、「http://」を追加します。最初に。これにより、ユーザーがブラウザに入力するのと同じように、不完全な入力から使用可能なリンクを作成でき、誰かが忍び込もうとした悪戯を阻止する最後の手段となります。
- 結果が正しい形式の URL (protocol://host.domain[:port][/path][/[file]][?queryField=queryValue][#anchor]) であることを確認します。
- おそらく、結果をサイトのブラックリストと照合するか、ある種のマルウェア チェッカーを通じて結果を取得しようとします。
セキュリティが優先されるのであれば、たとえ安全なリンクをいくつか破棄することになったとしても、このプロセスでユーザーが多少の被害妄想を抱いても許してほしいと思います。
OWASP-ESAPI APIなどのライブラリを使用します:
- PHP- http://code.google.com/p/owasp- esapi-php /
- Java- http://code.google.com/p/owasp- esapi-java /
- .NET- http://code.google.com/p/owasp -esapi-dotnet /
- Python- http://code.google.com/p/owasp- esapi-python /
次をお読みください:
- https://www.golemtechnologies .com / articles / prevent-xss#how-to-prevent-cross-site-scripting
- https://www.owasp.org/
- http://www.secbytes.com/blog/?p=253
例:
$url = "http://stackoverflow.com"; // e.g., OWASP-ESAPI APIなどのライブラリを使用します:
- PHP- http://code.google.com/p/owasp- esapi-php /
- Java- http://code.google.com/p/owasp- esapi-java /
- .NET- http://code.google.com/p/owasp -esapi-dotnet /
- Python- http://code.google.com/p/owasp- esapi-python /
次をお読みください:
- https://www.golemtechnologies .com / articles / prevent-xss#how-to-prevent-cross-site-scripting
- https://www.owasp.org/
- http://www.secbytes.com/blog/?p=253
例:
$url = "http://stackoverflow.com"; // e.g., OWASP-ESAPI APIなどのライブラリを使用します:
- PHP- http://code.google.com/p/owasp- esapi-php /
- Java- http://code.google.com/p/owasp- esapi-java /
- .NET- http://code.google.com/p/owasp -esapi-dotnet /
- Python- http://code.google.com/p/owasp- esapi-python /
次をお読みください:
- https://www.golemtechnologies .com / articles / prevent-xss#how-to-prevent-cross-site-scripting
- https://www.owasp.org/
- http://www.secbytes.com/blog/?p=253
例:
$url = "http://stackoverflow.com"; // e.g., OWASP-ESAPI APIなどのライブラリを使用します:
- PHP- http://code.google.com/p/owasp- esapi-php /
- Java- http://code.google.com/p/owasp- esapi-java /
- .NET- http://code.google.com/p/owasp -esapi-dotnet /
- Python- http://code.google.com/p/owasp- esapi-python /
次をお読みください:
- https://www.golemtechnologies .com / articles / prevent-xss#how-to-prevent-cross-site-scripting
- https://www.owasp.org/
- http://www.secbytes.com/blog/?p=253
例:
<*>
別の例は、組み込み関数を使用することです。 PHPの filter_var 関数は例です:
<*>
filter_var
の使用許可 JavaScript呼び出し、および除外 http
でも https
でもないスキーム。 OWASP ESAPI Sanitizer はおそらく最良のオプションです。
さらに別の例は、 WordPress のコードです:
さらに、URLリンクの場所を知る方法がないため(つまり、有効なURLかもしれませんが、URLの内容はいたずらな場合があります)、Googleにはセーフブラウジング呼び出すことができるAPI:
衛生のために独自の正規表現をローリングすることには、いくつかの理由で問題があります:
- Jon Skeetでない限り、コードにエラーが発生します。
- 既存のAPIには多くの時間のレビューとテストがあります。
- 既存のURL検証APIは国際化を考慮しています。
- 既存のAPIは、新しい標準に合わせて最新の状態に保たれます。
考慮すべきその他の問題:
- どのスキームを許可しますか(
file:///
および telnet://
は受け入れ可能ですか)
- URLのコンテンツにどのような制限を設定しますか(マルウェアURLは受け入れ可能ですか?)
GET["user-homepage"];
$esapi = new ESAPI( "/etc/php5/esapi/ESAPI.xml" ); // Modified copy of ESAPI.xml
$sanitizer = ESAPI::getSanitizer();
$sanitized_url = $sanitizer->getSanitizedURL( "user-homepage", $url );
別の例は、組み込み関数を使用することです。 PHPの filter_var 関数は例です:
<*>
filter_var
の使用許可 JavaScript呼び出し、および除外 http
でも https
でもないスキーム。 OWASP ESAPI Sanitizer はおそらく最良のオプションです。
さらに別の例は、 WordPress のコードです:
さらに、URLリンクの場所を知る方法がないため(つまり、有効なURLかもしれませんが、URLの内容はいたずらな場合があります)、Googleにはセーフブラウジング呼び出すことができるAPI:
衛生のために独自の正規表現をローリングすることには、いくつかの理由で問題があります:
- Jon Skeetでない限り、コードにエラーが発生します。
- 既存のAPIには多くの時間のレビューとテストがあります。
- 既存のURL検証APIは国際化を考慮しています。
- 既存のAPIは、新しい標準に合わせて最新の状態に保たれます。
考慮すべきその他の問題:
- どのスキームを許可しますか(
file:///
および telnet://
は受け入れ可能ですか)
- URLのコンテンツにどのような制限を設定しますか(マルウェアURLは受け入れ可能ですか?)
GET["user-homepage"];
$sanitized_url = filter_var($url, FILTER_SANITIZE_URL);
別の例は、組み込み関数を使用することです。 PHPの filter_var 関数は例です:
<*>
filter_var
の使用許可 JavaScript呼び出し、および除外 http
でも https
でもないスキーム。 OWASP ESAPI Sanitizer はおそらく最良のオプションです。
さらに別の例は、 WordPress のコードです:
さらに、URLリンクの場所を知る方法がないため(つまり、有効なURLかもしれませんが、URLの内容はいたずらな場合があります)、Googleにはセーフブラウジング呼び出すことができるAPI:
衛生のために独自の正規表現をローリングすることには、いくつかの理由で問題があります:
- Jon Skeetでない限り、コードにエラーが発生します。
- 既存のAPIには多くの時間のレビューとテストがあります。
- 既存のURL検証APIは国際化を考慮しています。
- 既存のAPIは、新しい標準に合わせて最新の状態に保たれます。
考慮すべきその他の問題:
- どのスキームを許可しますか(
file:///
および telnet://
は受け入れ可能ですか)
- URLのコンテンツにどのような制限を設定しますか(マルウェアURLは受け入れ可能ですか?)
GET["user-homepage"];
$esapi = new ESAPI( "/etc/php5/esapi/ESAPI.xml" ); // Modified copy of ESAPI.xml
$sanitizer = ESAPI::getSanitizer();
$sanitized_url = $sanitizer->getSanitizedURL( "user-homepage", $url );
別の例は、組み込み関数を使用することです。 PHPの filter_var 関数は例です:
<*> filter_var
の使用許可 JavaScript呼び出し、および除外 http
でも https
でもないスキーム。 OWASP ESAPI Sanitizer はおそらく最良のオプションです。
さらに別の例は、 WordPress のコードです:
さらに、URLリンクの場所を知る方法がないため(つまり、有効なURLかもしれませんが、URLの内容はいたずらな場合があります)、Googleにはセーフブラウジング呼び出すことができるAPI:
衛生のために独自の正規表現をローリングすることには、いくつかの理由で問題があります:
- Jon Skeetでない限り、コードにエラーが発生します。
- 既存のAPIには多くの時間のレビューとテストがあります。
- 既存のURL検証APIは国際化を考慮しています。
- 既存のAPIは、新しい標準に合わせて最新の状態に保たれます。
考慮すべきその他の問題:
- どのスキームを許可しますか(
file:///
およびtelnet://
は受け入れ可能ですか) - URLのコンテンツにどのような制限を設定しますか(マルウェアURLは受け入れ可能ですか?)
リンクをHTMLEncodeで出力するときにリンクをエンコードします。 javascript:
リンクを許可しないようにしてください。 (受け入れられるプロトコルのホワイトリスト(http、https、mailtoなど)を用意することをお勧めします。)
アプリケーションの言語を指定しない場合、ASP.NETを想定します。このためには、 Microsoft Anti-Cross Site Scripting Library
非常に使いやすく、必要なのはインクルードだけです:)
このトピックについては、デザインを読んでみませんかセキュアWebアプリケーションのガイドライン
他の言語の場合.... ASP.NETのライブラリがある場合、他の種類の言語(PHP、Python、RORなど)でも使用できる必要があります
リンクとして表示しないのはどうですか?テキストを使用してください。
警告を組み合わせて、ご自身の責任で進めてください。
追加- HTMLもサニタイズする必要がありますホストされたCMSのマークアップ?ユーザー入力のサニタイズに関する議論について
JavaScriptで記述されたプロジェクトでは、この正規表現をホワイトリストとして使用します。
url.match(/^((https?|ftp):\/\/|\.{0,2}\/)/)
唯一の制限は、同じディレクトリにあるファイルの前に./を置く必要があることですが、私はそれで生きることができると思います。
Pythonistaの場合は、Scrapyの w3lib を試してください。
16進コードを使用してURL全体を変換し、サーバーに送信できます。そうすれば、クライアントは一目でコンテンツを理解できません。コンテンツを読み取った後、コンテンツURLをデコードできます=?ブラウザに送信します。
URLの許可とJavaScriptの許可は2つの異なるものです。