Предотвращение CSRF с помощью междоменного вызова JavaScript - PullRequest
1 голос
/ 01 апреля 2011

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

Подвох в том, что у меня есть несколько запросов, предназначенных длявызываться сторонними сайтами на другом домене.Большинство из них используют JSONP : они отправляют запрос на наш сервер с помощью тега <script>, и ответом является код JavaScript, который вызывает функцию на их странице.

Мой вопрос таков:как передать токен в этих запросах?Похоже, сторонний сайт должен знать токен.Я мог бы предоставить другой запрос, который возвращает токен как JSON, но затем ненадежные сайты могли бы сделать тот же запрос, получить токен и использовать его для подделки запросов к нашему серверу.

Есть ли лучший способ сделать это

Ответы [ 3 ]

3 голосов
/ 02 апреля 2011

Токены XSRF обычно являются файлами cookie в вашем домене, которые вы генерируете. Вы действительно не хотите вводить механизм, позволяющий другим сайтам устанавливать их. Проверка того, что сообщение приходит от доверенной стороны, лучше рассматривать как проблему проверки подписи.

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

Затем они могут подписать вам свои сообщения.

Так что их запрос будет выглядеть как

 <script src="https://.../yourservice?partnerid=foobar&signedquerystring"></script>

и затем вы можете проверить подпись, чтобы подписанная строка запроса была правильно подписана с использованием открытого ключа, который вы искали по ключу foobar.

Теперь вы знаете, что нужно доверять запросу, если он либо имеет ваш токен XSRF, либо подписан надлежащим образом с использованием личного ключа партнера, с которым вы установили отношения.

Это не помешает кому-то, кто может наблюдать, как вошедший в систему пользователь, просматривающий партнерский сайт, воспроизводит запрос, поэтому партнерский сайт и ваш сценарий должны загружаться через защищенный канал (https), так же, как и вы. с многоразовыми токенами XSRF.

0 голосов
/ 02 февраля 2015

У меня самое простое решение проблемы JSONP CSRF, добавьте «while (1);» или "для (,,);" или бросить "F *** U"; в начале ваших данных ответа JSON.

Теперь любой запрос JSONP заканчивается бесконечным циклом. Поскольку вы не используете запрос JSONP, у вас есть возможность изменить ответ с помощью этого кода

JSON.parse(this.responseText.slice("while(1);".length));
0 голосов
/ 07 февраля 2013

Решение этой проблемы, которую я использую, заключается в том, чтобы встроить IFRAME в пользовательский интерфейс внешнего виджета, который я создаю. Единственным недостатком здесь является возможность использования этого iframe другими при атаке с помощью кликбека. Вы можете прочитать об этом здесь: https://security.stackexchange.com/questions/13341/security-issues-using-iframes.

...