2011-01-17 3 views
1

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

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

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

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

Вы видите недостаток?

С уважением.

+0

Почему вы просто не используете «UserKey»? –

ответ

2

Стратегия, которую вы описываете, работает в целом и известна как «Double Submitting Cookies». НО есть несколько вещей, которые вы должны знать о

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

Отличные ссылки. Было бы лучше использовать хэш? – vtortola

2

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

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

+0

Я не использую ASP.NET WebForms, и мне нужен механизм истечения срока действия. В принципе, я использую свой собственный способ генерации HTML из среды выполнения ASP.NET. Довольно круто, что вы разработали, поздравляю. – vtortola

Смежные вопросы