6

URL urlを介した XSS 攻撃を回避しようとして います
: http://example.com/onlineArcNew/html/terms_conditions_1.php/%22ns=%22alert%280x0000DC%29

var_dump(filter_var('http://10.0.4.2/onlineArcNew/html/terms_conditions_1.php/%22ns=%22alert%280x0000DC%29', FILTER_VALIDATE_URL));

および正規表現を使用した他のurl_validationですが、まったく機能しませんでした。上記のリンクにはすべての情報が表示されますが、CSS と一部の Java スクリプト関数が機能しません。最善の解決策を教えてください...

4

3 に答える 3

4

FILTER_SANITIZE_SPECIAL_CHARS代わりに使ってみてください

$url = 'http://10.0.4.2/onlineArcNew/html/terms_conditions_1.php/%22ns=%22alert%280x0000DC%29';

// Original
echo $url, PHP_EOL;

// Sanitise
echo sanitiseURL($url), PHP_EOL;

// Satitise + URL encode
echo sanitiseURL($url, true), PHP_EOL;

出力

http://10.0.4.2/onlineArcNew/html/terms_conditions_1.php/%22ns=%22alert%280x0000DC%29
http://10.0.4.2/onlineArcNew/html/terms_conditions_1.php/"ns="alert(0x0000DC)
http%3A%2F%2F10.0.4.2%2FonlineArcNew%2Fhtml%2Fterms_conditions_1.php%2F%26%2334%3Bns%3D%26%2334%3Balert%280x0000DC%29

使用する機能

function sanitiseURL($url, $encode = false) {
    $url = filter_var(urldecode($url), FILTER_SANITIZE_SPECIAL_CHARS);
    if (! filter_var($url, FILTER_VALIDATE_URL))
        return false;
    return $encode ? urlencode($url) : $url;
}
于 2013-06-03T12:43:53.613 に答える
0

ステップ 1: ユーザーが提供するエスケープ出力

ユーザーによって提供されたページ内にデータを含めたい場合は、出力をエスケープします。そして、この簡略化されたリストでは、HTML エンコードの <、>、&、'、" という 1 つの単純なエスケープ操作に固執します。たとえば、PHP は、この一般的なタスクを実行するために htmlspecialchars() 関数を提供します。

ステップ 2: 常に XHTML を使用する

OWASP の XSS 防止戦略を読むと、HTML で引用符で囲まれていない属性を使用している場合、インジェクションから保護するにはさらに多くの労力が必要であることが明らかになります。対照的に、引用符で囲まれた属性では、データのエスケープは、タグ内のコンテンツのデータをエスケープするために必要なプロセスと同じになります。これは、既に説明したエスケープ操作です。これは、引用された属性のコンテキスト内で構造的に重要なコンテンツに忍び込むという点で唯一の問題を引き起こすのは、最後の引用であるためです。

明らかに、引用符で囲まれた属性を含めるためにマークアップが XHTML である必要はありません。ただし、XHTML を対象にして検証すると、すべての属性が引用されているかどうかを簡単にテストできます。

ステップ 3: CSS と JavaScript で英数字データ値のみを許可する

ページの CSS および Javascript セクション内で出力されるユーザーから許可するデータを英数字 (例: [a-zA-Z0-9]+ のような正規表現) タイプに制限する必要があります。それらが真に価値を表す文脈。Javascript では、これは、変数に割り当てられた引用符で囲まれた文字列内でのみユーザー データを出力する必要があることを意味します (例: var userId = “ALPHANUMERIC_USER_ID_HERE”;)。CSS では、ユーザー データはプロパティ値のコンテキスト内でのみ出力する必要があることを意味します (例: p { color: #ALPHANUMERIC_USER_COLOR_HERE;}.) これは厳格に見えるかもしれませんが、これは単純な XSS チュートリアルのはずです

明確にするために、前の例のように、タグまたは属性内で出力されるデータであっても、常にユーザー データを検証して期待どおりであることを確認する必要があります。ただし、可能性のあるデータ構造が複雑であるため、XSS 攻撃を防ぐことが非常に困難になるため、CSS および JavaScript 領域では特に重要です。

Facebook、Youtube、Twitter ID など、ユーザーが JavaScript に提供できるようにする一般的なデータはすべて、この制限に対応しながら使用できます。また、CSS の色属性やその他のスタイルも統合できます。

ステップ 4: URL エンコード URL クエリ文字列パラメーター

ユーザー データがリンク クエリ文字列の URL パラメーター内で出力される場合は、データを URL エンコードしてください。繰り返しになりますが、例として PHP を使用すると、単純に urlencode() 関数を使用できます。ここで、この特定の点に関して多くの混乱を見てきたので、これを明確にして、いくつかの例に取り組みましょう。

URL エンコードが必要

次の例では、クエリ文字列の値として使用されるため、URL エンコードする必要があるユーザー データを出力します。

http://site.com?id=USER_DATA_HERE_MUST_BE_URL_ENCODED">

URL エンコードしてはならない

次の例では、URL 全体のユーザー指定データを出力します。この場合、ユーザー データは、URL エンコードではなく、標準のエスケープ関数 (HTML エンコードの <、>、&、'、") を使用してエスケープする必要があります。この例を URL エンコードすると、不正な形式のリンクが作成される可能性があります。

于 2013-06-03T11:58:53.457 に答える
0

MVC を使用している場合は、ルーティングの前にすべての値をデコードし、stript_tags() を使用してこれらの問題を取り除きます。そして、ドキュメントが言うように、ケースは何にも影響を与えるべきではありません。

そうでない場合は、ユーティリティ関数を作成し、URI から変数を取得するときに同じことを行います。しかし、私は決して XSS の専門家ではないので、これはトリックの一部にすぎない可能性があります。

ジャニス・ペイセニクスより

于 2013-06-03T11:52:01.673 に答える