Используя MVC3 AntiforgeryToken со ссылками? - PullRequest
3 голосов
/ 30 декабря 2011

На моем сайте MVC3 у меня есть страница, которая содержит несколько ссылок.Все эти ссылки ссылаются на маршрут на моем сайте с разными значениями идентификаторов и имеют такую ​​структуру:

, то есть: www.mysite.com/links/33351/3

Я хотел бы воспользоваться анти-фальсификацией MVC3механизм, чтобы я мог гарантировать, что все запросы к www.mysite.com/links/33351/3 со страницы индекса ссылок.

Я знаком с тем, как добавить токен в форму, однако это все автономные ссылки.

Как мне это сделать?

Ответы [ 3 ]

3 голосов
/ 30 декабря 2011

Вы не можете использовать AntiForgeryToken для запросов GET (то есть, нажав на ссылку).Подробнее - см. Использование MVC3 AntiForgeryToken в HTTP GET, чтобы избежать уязвимости Javascript CSRF .

Одним из решений является проверка Request.UrlReferrer , чтобы убедиться, что они получены из вашего индексастраницы, но это далеко не надежно.

Возможно, вы могли бы объяснить, почему вы хотите ввести это ограничение, и я могу предложить альтернативу.

2 голосов
/ 01 января 2012

Благодаря комментариям выше, которые помогли мне решить эту проблему.

По сути, я создал функцию Javascript для обработки щелчков элемента.Каждая ссылка на моей странице имеет идентификатор, поэтому я просто передал идентификатор функции JS, которая отправляет форму:

<script type="text/javascript"> <!--
    function doClick(itemID) {
        document.getElementById('hid_ItemID').value = itemID;

        // add whatever additional js type processing needed here - ie. analytics, etc.

        document.forms[0].submit();
    }
//-->
</script>

Форма сама содержит маркерный тег MVC для защиты от подделки:

@using (Html.BeginForm("DoRequest", "DoItemClickRq", FormMethod.Post, new { target = "_blank" }))
{
    @Html.AntiForgeryToken()
    <input type="hidden" id="hid_ItemID" name="hid_ItemID" value="" />
.
.
.

Метод контроллера:

    [ValidateAntiForgeryToken]
    [HttpPost]
    public ActionResult DoItemRequest()
    {
        int itemListID = 0;
        int pagePositionNumber = 0;
        int.TryParse(Request["hid_ItemID"], out itemListID);

.,.

0 голосов
/ 30 декабря 2011
  1. Для надлежащей практики проектирования все URL-адреса в вашем приложении, доступные через HTTP GET, должны быть идемпотентными, то есть они не должны изменять состояние независимо от того, сколько раз к ним обращались.Похоже, что это может быть корнем вашей проблемы, в зависимости от интерпретации «Переход по ссылке выполняет некоторое обслуживание».Или вы можете быть обеспокоены загрузкой системы из-за технического обслуживания.Это одна из причин, по которой подходы CSRF обычно избегают обработки запросов GET.
  2. Предоставление токенов CSRF в URL, таких как идентификаторы сеансов, является плохой практикой безопасности.URL-адреса могут попадать в файлы журналов и прокси-серверы, особенно если ваш сайт не использует 100% SSL.

Являются ли веб-сканеры стандартными?Если так, то почему бы просто не использовать robots.txt , чтобы ограничить поведение при сканировании?

Если этого недостаточно, возможно, вам нужно наложить какое-то ограничение рабочего процесса для предотвращения доступа с глубокими связями (например, доступ к ссылке X с идентификатором сеанса A без выполнения шагов 1 и 2 сначала запрещен вашимконтроллер). * * +1011

...