Как защитить виджеты от поддельных запросов

Допустим, у вас есть виджет JavaScript, который должен отключить запрос к вашему веб-приложению, если и только если пользователь хочет нажать на него. Вы не хотите, чтобы этот запрос был уязвим для CSRF, поэтому вы пишете iframe на странице. Основываясь на правилах наследования наследования , родительский сайт не сможет прочитать токен CSRF. Однако как насчет clickjacking (или likejacking)? Из-за CSRF вы должны находиться в пределах iframe и там для x-frame-options не может помочь, и то же самое верно для каркасные дёшево.

Нападающий намерен применить маску SVG в iframe после загрузки виджета. Эта маска сделает iframe невидимым. В этот момент злоумышленник может либо изменить размер iframe на размер страницы, либо теперь этот невидимый iframe следует за курсором. В любом случае, когда пользователь нажимает на любом месте страницы, iframe получает событие click и свою игру.

Итак, существует двойственность, кажется, вы застряли между CSRF и Clickjacking. Какое лучшее решение (если оно есть) для этой проблемы?

Ответы

Ответ 1

Нажав на виджет, нужно открыть всплывающее окно, содержащее новую страницу - iframe недостаточно хорош, это должно быть новое окно, которое полностью находится под контролем вашего веб-приложения. Подтвердите действие, что бы это ни было, на этой странице.

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

Ответ 2

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

OWASP упоминает в своей электронной таблице предупреждения CRSF, что одно из предварительных условий для защиты токена CSRF - это отсутствие атаки XSS.

На мой взгляд, это также должно включать clickjacking, поскольку токен CSRF, даже скрытый внутри iframe, не может защитить от clickjacking. Запрос подделывается прямым щелчком пользователя.

Итак, в конце мы не застряли между CSRF и Clickjacking. Защита CSRF предназначена для различных типов атак, где на стороне атакующего гораздо меньше мощности.

Итак, обращайтесь к тем вопросам, которые вы упомянули относительно клик-ловушки и CSRF:

  • Какое наилучшее решение (если оно есть) для этой проблемы? - Лучшая защита для clickjacking на стороне клиента - открыть новую вкладку браузера или изменить размер окна браузера со страницей с вашего сайта и подтвердить действие там, как упоминает @Zack. Это то, что делает кнопка Twitter, и в этом сценарии не может быть подделка запроса.

  • Итак, существует двойственность, кажется, что вы застряли между CSRF и Clickjacking. Защита CSRF не предназначена для таких случаев, как атаки XSS или clickjacking, они эффективны только против менее мощных атак (электронная почта со вредоносной ссылкой, опубликовать вредоносную ссылку в форуме и т.д.)

Ответ 3

Нет хорошего программируемого решения для кликнинга. Некоторые компании подают в суд на спамеров в качестве защиты от кликов. Другие предпочитают отображать всплывающие окна, как только пользователь щелкнул внутри iframe, хотя это ухудшает работу пользователей, особенно в случае кнопки с одним щелчком мыши. Это именно то, что делает Twitter для кнопки "Retweet". Facebook в настоящее время развертывает этот подход для кнопки "Как", запрашивая подтверждение, когда запросы поступают из доменов с черным списком. Ive услышал, что робот Googlebot выполняет несколько эвристиков по щелчкам при индексировании страниц с помощью кнопки "+1" (проверка вычисленных стилей, перекрытие элементов и т.д.)...

Ответ 4

- ОБНОВЛЕНИЕ - Когда вы говорите "виджет", если вы имеете в виду что-то вне вашего приложения, которое не аутентифицированные люди взаимодействуют, то игнорируйте этот ответ. Я перечитываю ваш вопрос, и вы никогда не заявляете, что вы подразумеваете под "виджетами". У нас есть все виды "виджетов", которые есть в нашем приложении. Я думал, что вы говорили, все внутри приложения, с которым взаимодействуют только аутентифицированные пользователи. Если это так, то этот ответ - это то, что рекомендует OWASP.

- Оригинальный ответ - "Вы не хотите, чтобы этот запрос был уязвим для CSRF, поэтому вы пишете iframe на странице". Нет, не делайте iframe, таким образом, вы можете сделать обычную рекомендацию OWASP для защиты от обрамления кросс-сайтов.

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

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

И легко добавить это везде, даже если ваш сайт уже написан (при условии, что на вашем сайте есть часть кода, включенная на всех страницах, например нижний колонтитул). Сделайте хеш-значение и поместите его в скрытый div где-нибудь в нижнем колонтитуле. Затем вы можете использовать jQuery для динамического добавления этого значения хэша, скрытого для всех форм на странице. И вы можете использовать jQuery.ajaxPrefilter, чтобы автоматически добавлять его во все ajax POST, если вы делаете ajax-сообщение, а не обычную запись в форме. Мы защищаем некоторые очень большие сайты, которые уже были закодированы таким образом.

https://www.owasp.org/index.php/Cross-Site_Request_Forgery_(CSRF)_Prevention_Cheat_Sheet

Если это похоже на этот путь, который вы хотите принять, я могу показать некоторые из кода jQuery для этого. Что касается вашего хэширования, как вы хотите проверить его на бэкэнд и т.д.... все зависит от того, используете ли вы ColdFusion, PHP, PL/SQL (psp) и т.д.... Я могу указать вас на вправо, если это один из них.

Ответ 5

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

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

Clickjacking, как я уверен, вы знаете, является совершенно другим типом атаки, чем CSRF, и нуждается в другой защите.

Действительно, если виджет очень важен, чем реализация двухфазной аутентификации. Используйте http://twilio.com, чтобы вызвать пользователя и ввести его в контакт. Или отправьте электронное письмо пользователю с ссылкой для подтверждения. Или попросите пользователя проверить действие при следующем входе пользователя на ваш сайт виджетов.

Если у вас есть контроль над родительским фреймом, у вас будет больше вариантов. Тогда это будет вопрос защиты XSS.

Обновление после выбора правильного ответа

Поэтому мой подход к защите от clickjacking немного завышен. Похоже, его можно защитить, используя всплывающее окно с подтверждением.

Ответ 6

Из-за CSRF вы должны находиться внутри iframe...

Нет. Вы не можете устранить CSRF с помощью файлов cookie и других несовлокальных трюков. Неважно, где вы их разместили.

Итак, существует двойственность, кажется, вы застряли между CSRF и Clickjacking. Какое лучшее решение (если оно есть) для этой проблемы?

Чтобы устранить CSRF, вам необходимо удалить угрозу, установив сервер, у которого есть инъекционный или вредоносный код, прекратите фишинг-письмо и т.д. В отсутствие благоприятной среды вам необходимо повторно аутентифицировать пользователя (или предоставить еще одну задачу/ответ для обеспечения интерактивного пользователя). См:

Te remdiate Clickjacking, используйте X-Frame-Options или фрейм-код в Javascript. Но я не думаю, что они безупречны. См: