Если я добавлю несколько форм на одной странице, нужно ли мне добавлять отдельные токены защиты от подделки в каждую форму?

Reginald Braithwaite (иначе Раганвальд) писал большой ряд на combinators в Ruby в его новом блоге, гомографический .

, В то время как он не делает (к моему знанию) смотрят на сам Y-combinator, он действительно смотрит на другой combinators, например:

и несколько сообщений о том, как Вы можете использование их.

28
задан neebz 4 May 2011 в 18:13
поделиться

2 ответа

Нет ничего конкретного, что вам нужно сделать в этом случае. ASP.NET MVC просто повторно использует одно и то же значение для всех форм, поэтому ему не нужно знать, какая форма отправила запрос для его проверки. Просто вставьте Html.AntiForgeryToken() в каждую форму и украсьте каждое действие контроллера, на которое вы отправляете сообщение, с помощью атрибута [ValidateAntiForgeryToken] , и все будет в порядке.

27
ответ дан 28 November 2019 в 03:44
поделиться

Здесь есть отличная статья . Я указал на несколько важных разделов.

В двух словах: если токен можно десериализовать из коллекции файлов cookie запроса, он будет использовать этот токен вместо генерации нового. Если токен не существует в коллекции файлов cookie, он создает новый экземпляр «AntiForgeryToken» и случайным образом генерирует новый 16-байтовый массив для представления токена.

public AntiForgeryToken GetCookieToken(HttpContextBase httpContext)
{
    HttpCookie cookie = httpContext.Request.Cookies[this._config.CookieName];

    if (cookie == null || string.IsNullOrEmpty(cookie.Value))
        return (AntiForgeryToken) null;

    return this._serializer.Deserialize(cookie.Value);
}

После генерации первого токена и сохранения его в коллекции файлов cookie все последующие вызовы вспомогательного метода «Html.AntiForgeryToken ()» будут следовать тем же шагам, и повторно использовать существующий токен из коллекции файлов cookie. вместо генерации нового значения.

Поскольку это файл cookie сеанса, это означает, что значение токена защиты от подделки генерируется только один раз во время сеанса браузера и используется повторно для всех последующих вызовов.

Так почему же значения скрытых полей отличаются друг от друга, если они используют один и тот же токен?

Таким образом, хотя зашифрованные значения могут выглядеть по-разному, дешифрованные значения одинаковы.

byte[] one = MachineKey45CryptoSystem.Instance.Unprotect("iAdQj5D0qrMuTggD8WpnOZPlVOfHg_qmPIEjnULAYd1h56cV2cL51rcaY8_UgxQbav5_6KTAtyE52ir1X6GmaS9ZPgw1");
byte[] two  = MachineKey45CryptoSystem.Instance.Unprotect("Shvi8Bxe6-a8zfCfDGnxkaC-IETsbjkR9iIylwn-2VRWQ-GtQkdowdFw1biU7dN3j-xPJZHYQPe-hNfWspYjy_ZcCCY1");
byte[] three = MachineKey45CryptoSystem.Instance.Unprotect("ZhaVFngUMLo88jmTIx___BTWlYFyKh1GalwEeffRl0-o3Gu7_m98k6aQjO7IysZIdXxVx6TqL6QIfX19Uwq3Ia6dghA1");

Сравнение всех трех байтовых массивов показывает, что они идентичны.

4
ответ дан 28 November 2019 в 03:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: