В каком случае может ли CSRF-освобождение быть опасным?

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

Я прочитал документы в django-docs (https://docs.djangoproject.com/en/1.3/ref/contrib/csrf/) и некоторую информацию на этой странице: http://cwe.mitre.org/top25/#CWE-352

Насколько я понял, django доставляет токен (какой-то пин-код) пользователю. И проверить, действительно ли это он, он должен вернуть его в следующий раз, когда он сделает запрос. И некоторые ребята из Google выяснили, что это возможно даже с помощью ajax-запросов, поэтому у нас есть новая политика их защиты с 1.2.6. И CSRF - это кто-то, дающий мне что-то (плохой, опасный код, поврежденные файлы или что-то в этом роде), притворяясь кем-то другим.

Итак, если у меня есть такой код:

@csrf_exempt    
def grab(request):
    """
    view to download an item
    POST because it stores that a user has downloaded this item
    """
    item_id = request.POST.get('item', None)
    if not loop: return HttpResponseBadRequest('no item id provided')
    item = Item.objects.get(pk=int(item_id))

который должен быть сохранен, поскольку я не предоставляю доступ к базе данных или какой-либо части моего приложения, прежде чем пытаться преобразовать заданное значение в целое число. И нет слишком большого урона, если я сделаю неверную запись о том, что кто-то скачивает файл (в этом случае его почти нет). Предполагая, что я напишу законопроекты, полагающиеся на это мнение, исключение CSRF будет отличаться плохими идеями (верно?).

Я также не понимаю, почему кто-то не может украсть CSRF-токен у пользователя и использовать его, чтобы все еще обмануть меня (или пользователя). Поэтому у меня есть некоторые вопросы по этой теме:

1) являются мои предположения сверху справа?

2) может кто-нибудь сказать мне, что (и, вероятно, как), какой-то не очень хороший парень мог использовать вышеприведенное представление, чтобы делать грязные трюки, и какими они были бы?

3) является CSRF примером атаки "человек-в-середине", просто ли это связано с ним или что-то совсем другое?

4) Какие-нибудь ценные ссылки для дальнейшего изучения таких опасностей?

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

Ответ 1

Атаки CSRF заставляют браузер жертв отправлять кованные запросы. Простой <img> или автоматически представленный <form> достаточно для этого как для метода GET, так и для POST. И по мере того как запросы отправляются браузером, он отправляет все учетные данные аутентификации и, таким образом, делает запросы кажущимися подлинными и законными с точки зрения серверов, поскольку они в основном не отличаются от тех, которые инициируются действиями пользователей.

И именно это означает, что токен CSRF используется: установить разницу между запросами, которые были инициированы пользователем, и теми, которые были подделаны сторонним сайтом. Для этого токен CSRF действует как секрет, который известен только серверу и пользователю. Сервер помещает секрет в документ в ответ и ожидает, что он будет отправлен обратно в следующем запросе.

И поскольку секрет встроен в документ ответов, который назначается для этого конкретного пользователя, злоумышленнику нужно будет подслушивать этот конкретный ответ или обращаться к документу каким-либо другим способом. Конечно, атаки получают токен CSRF (например, eavesdropping, MITM, XSS и т.д.). Но если вы защищены от этих атак, злоумышленник не сможет подделать аутентичный запрос.

Ответ 2

Атака CSRF

Я обманул вас в просмотре веб-страницы, где я вставил некоторый код (запрос, обычно через img или form) на другой сайт (где у вас есть некоторые права).

Небезопасный пример

<img src="http://www.yoursite.net/changelanguage?lang=fr">

Я жестоко изменил язык вашей сессии на французский. О, ну! Вы можете безопасно удалить защиту csrf и сохранить удаленный db.

Опасные примеры

<img src="http://www.yourbank.net/sendmoney?amt=9999&account=123>

Если вы вошли в систему yourbank.net(и у нее нет csrf или какой-либо другой защиты), ваша учетная запись теперь должна чувствовать себя легче. (Я 123.)

<img src="http://www.yoursite.net/admin/users/123/edit?admin=1">

Если вы вошли на свой сайт в качестве администратора, то мы оба. (Я 123.)