Вопрос

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

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

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

Это было полезно?

Решение

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

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

Другие советы

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

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

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

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

Итак, к вопросам, которые вы упомянули относительно ClickJacking и CSRF:

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

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

Нет хорошего программируемого Решение на ClickJacking. Анкет Некоторые компании предъявляют иск о спамерах как защиту, чтобы щелкнуть. Другие предпочитают отображать всплывающие окна, когда пользователь щелкнул внутри iframe, хотя это ухудшает пользовательский опыт, особенно в случае одного клика-кнока. Это именно то, что делает Twitter для кнопки «Ретвит». Facebook в настоящее время развертывает этот подход для кнопки «Like», запрашивая подтверждение, когда запросы приходят из доменов в черном списке. Я слышал, что Googlebot выполняет некоторую эвристику, включающую страницы, индексируя страницы с его кнопкой «+1» (проверяя вычислительные стили, элементы перекрываются и т. Д.)…

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

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

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

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

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

https://www.owasp.org/index.php/cross-site_request_forgery_(csrf)_prevention_cheat_sheet

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

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

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

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

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

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

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

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

Из -за CSRF вы должны быть в пределах iframe ...

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

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

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

TE Remidiate ClickJacking, используйте x-frame-options или код разрушения кадров в JavaScript. Но я не думаю, что тоже надежны. Видеть:

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top