Как предотвратить подделку межсайтовых запросов?

Мы запустили Burp Suite для нашего продукта и обнаружили некоторые уязвимости безопасности. Инструмент обнаружил некоторые файлы CGI, которые уязвимы для атак подделки межсайтовых запросов (CSRF).

Как обычно, я выполнил поиск модуля защиты CSRF в CPAN и нашел CGI:: Application:: Plugin:: ProtectCSRF.

Мне интересно, как я могу интегрировать этот модуль в наше приложение в обобщенном виде? Документация мне не понятна. Как настроить этот модуль и внести минимальные изменения, чтобы обеспечить защиту всего приложения от CSRF.

Я также сталкивался с mod_csrf (модуль Apache для предотвращения CSRF). Достаточно ли установки этого модуля и настроек ниже в файле конфигурации apache для предотвращения CSRF?

<VirtualHost>

    CSRF_Enable on
    CSRF_Action deny
    CSRF_EnableReferer off

</VirtualHost>

2 ответа

Я могу понять, что вы нашли документацию для CGI::Application::Plugin::ProtectCSRF непонятно: это немного неприступно

Все, что делает модуль Perl, это добавить hidden поле для каждой формы HTML с именем _csrf_id и случайное значение, полученное из различных источников и закодированное через SHA1. Защита приходит, когда ответ от клиента требует, чтобы то же значение было возвращено на сервер

Он довольно хорошо закодирован, но использует собственные атрибуты подпрограммы и документацию для attributes это говорит прагма

ВНИМАНИЕ: механизмы, описанные здесь, все еще являются экспериментальными. Не полагайтесь на текущую реализацию

Из моего быстрого обзора я не могу сказать, являются ли прототипы подпрограмм необходимыми для модуля, но я рекомендую вам использовать Apache mod_csrf модуль, который, вероятно, будет более тщательно протестирован, чем модуль Perl, и имеет соответствующую документацию

Так как мы использовали внутренний сервер, а не apache, реализовать mod_csrf было невозможно.

Я отказался от модуля ProtectCSRF, так как документация была неясной.

Я решил это, выполнив следующие действия:

  1. Добавьте элемент в шаблон заголовка, который является общим для всех страниц, этот элемент содержит токен CSRF, который передается с сервера.
  2. Создайте функцию JavaScript и привяжите ее к событию загрузки. Эта функция JS выполняет следующие задачи:

    а) Найти формы на текущей странице

    б) Если формы найдены, создайте скрытый элемент ввода и добавьте его к каждой форме.

    c) Возьмите значение, которое было помещено в заголовок, и назначьте его созданным выше элементам.

    г) Теперь все формы имеют скрытый элемент ввода, который содержит токен CSRF из пункта 1.

  3. Теперь всякий раз, когда форма отправляется, этот скрытый элемент также будет отправлен, значение которого мы проверяем на стороне сервера. Если токены не совпадают то есть CSRF, на что кидаем ошибку и блокируем запрос

Другие вопросы по тегам