4

.net 3.5 mvc2 Web アプリケーションにセキュリティを適用しています。私の Web サイトにはユーザー認証が含まれておらず、.js ファイル内の多数の ajax 呼び出しで構成されています

私が書いた.aspxファイルに

<%= Html.AntiForgeryToken() %>   

私の.jsファイル関数で私が書いた

$(document).ready(function() {

var token = $('input[name=__RequestVerificationToken]').val();

    $.ajax({
    url: "/Home/getCurrentLanguage/" + Math.random(),
        cache: false,
        type: "POST",
        async: false,
        data: {"__RequestVerificationToken":token},
        success: function(data) {
            if (data == "mr") {
                alert("its Marathi");
            } else {
                alert("its English huh !!!");
            }
            return false;
        },
        error: function(data) {
            alert("some Error" + data);
        }
    });

});

私のコントローラーで私が書いた

    [AcceptVerbs(HttpVerbs.Post), ValidateAntiForgeryToken]
    public JsonResult getCurrentLanguage(string id)
    {
        return new JsonResult
        {
            Data = "mr"
        };

    }

これは私にとってはうまくいきますが、
Q1 で 2 つの質問があります。それは正しいアプローチですか?ページのソースを見ると、このコードが見つかりました

<input name="__RequestVerificationToken" type="hidden" value="WFd+q5Mz0K4RHP7zrz+gsloXpr8ju8taxPJmrLO7kbPVYST9zzJZenNHBZqgamPE1KESEj5R0PbNA2c64o83Ao8w8z5JzwCo3zJKOKEQQHg8qSzClLdbkSIkAbfCF5R6BnT8gA==" /> 

しかし、外部 html ファイルを作成し、__RequestVerificationToken のこの値をコピーして ajax 呼び出しを渡すと、このエラーが発生します
。必要な偽造防止トークンが提供されなかったか、無効でした。 次に
Q2。ランタイムは、このページがコピーされた __RequestVerificationToken を提供していることをどのように認識しますか?

4

1 に答える 1

2

この「AntiForgeryToken」は、クロスサイト リクエスト フォージェリ攻撃を防ぐために用意されています。アプリケーションにクロスサイト スクリプティングの脆弱性がある場合、このシステムは攻撃者によって弱体化される可能性があります。

このトークンは CSRF 攻撃を防ぎます。同一オリジン ポリシーにより、攻撃者はリクエストを送信できますが、ページからトークンを読み取ってリクエストを成功させることはできません (xss 脆弱性がない限り)。

Q2 に関しては、この値はユーザーごとに一意である必要があるため、ページが読み込まれるたびに更新されます。それが単なる静的な値である場合、攻撃者はこの同じ静的な値を知っているため、CSRF を停止することは役に立ちません。

于 2012-07-31T16:11:18.127 に答える