CSRF оборонный подход - PullRequest
       5

CSRF оборонный подход

1 голос
/ 17 января 2011

Я пытаюсь защитить свой веб-сайт .NET от CSRF-атак, используя скрытый ключ в каждой форме и специальный временный cookie, поэтому, когда пользователь отправляет POST-форму, я могу сравнить ключ временного cookie и скрытый ключ вform.

Но я не хочу использовать Session или другой общий объект для хранения этих временных ключей, поэтому я придумал такой способ:

  1. Браузер запрашиваетформа (GET).
  2. Приложение генерирует ключ [userId] + [currentDateTime], симметрично зашифрованный ключом, который знает мое приложение.
  3. Приложение помещает этот ключ в скрытое поле вформу, и отправил печенье с этим ключом тоже.Браузер POST формы.
  4. Приложение гарантирует, что:

    1. Значение cookie и значение скрытой формы совпадают.
    2. Может получить [userId] из расшифрованного значения, и это текущий идентификатор пользователя.
    3. Может получить [DateTime] из расшифрованного значения.
    4. [DateTime]полученный возраст не более 15 мин.
  5. В противном случае отклоните POST и покажите ошибку.

Видите ли вы какой-либо недостаток?

С уважением.

Ответы [ 2 ]

2 голосов
/ 17 января 2011

Стратегия, которую вы описываете, работает в целом и известна как " Двойная отправка файлов cookie ". НО Есть несколько вещей, которые вы должны знать о

  1. .net будет иметь структуру для автоматической поддержки CSRF. Вы должны это выяснить и использовать рекомендованное решение вместо того, чтобы что-то создавать самостоятельно. К сожалению, я не .net парень, поэтому не могу указать на правильную структуру.
  2. Если вам необходимо создать собственную защиту CSRF, лучше использовать криптографическое случайное число для идентификатора сеанса вместо шифрования userid + timestamp. Есть способы расшифровать ключ и даже изменить его, если вы не будете осторожны. См. Заполнение Oracle
2 голосов
/ 17 января 2011

Почему бы вам не использовать встроенный ViewState userkey ? Заполните это именем пользователя и все готово. Это, однако, не истекает.

Если у вас нет аутентифицированных пользователей или вам не нравится этот подход, потому что вам не нравится viewstate, тогда вы можете написать HTTP-модуль, который вставит скрытое поле формы, подобное тому, которое я написал и опубликовал в codeplex - вы можете настроить его на срок действия.

...