Такие функции, как маркеры доступа и разрешения, делают вход через Facebook надежным и безопасным инструментом для людей и приложений. Однако в приложениях при этом необходимо реализовать дополнительные меры безопасности.
Ниже перечислены меры безопасности, которые необходимо реализовать во всех приложениях, где используется вход через Facebook. Их можно дополнить другими функциями, чтобы обеспечить максимальную защиту приложения. Без обеспечения должных мер безопасности люди могут потерять доверие к вашему приложению и перестать пользоваться им.
С помощью секрета приложения некоторые процессы входа создают маркеры доступа. Секрет приложения гарантирует, что приложение защищено и доступно только доверенному пользователю. Секрет позволяет легко создать маркер доступа приложения, чтобы отправлять запросы API от лица пользователя. Поэтому очень важно защитить секрет приложения от взлома.
Секрет и маркер доступа приложения нельзя использовать в коде.
Для обеспечения безопасности мы рекомендуем использовать маркеры доступа приложения только непосредственно на серверах приложения. Нативным приложениям рекомендуется обмениваться данными с вашим сервером, который в свою очередь должен отправлять запросы API к Facebook с использованием маркера доступа приложения. Если в дополнительных настройках панели приложений установлен тип приложения Native/Desktop
, мы предполагаем, что ваше нативное приложение содержит секрет или маркер доступа в двоичном коде. В этом случае обработка вызовов, подписанных маркером доступа приложения, не выполняется. При этом API работает так, как если бы маркер доступа не предоставлялся.
appsecret_proof
Чтобы приложение было менее уязвимым для вредоносного ПО и спама, в подписи к вызовам API Facebook, передаваемым с сервера на сервер, должен использоваться параметр appsecret_proof
. Проверочный код секрета приложения — это код маркера доступа, хэшированный по алгоритму SHA256, где ключом является секрет приложения. Секрет приложения можно найти в Панели приложений, выбрав Настройки > Основное.
Ниже приведен пример вызова на языке PHP:
$appsecret_proof= hash_hmac('sha256', $access_token.'|'.time(), $app_secret);
Некоторые операционные системы и языки программирования возвращают метку времени в виде числа с плавающей запятой. Перед вычислением проверочного кода на базе секрета приложения не забудьте преобразовать его в целое. Некоторые языки программирования возвращают хэш в виде объекта-отпечатка. Не забудьте преобразовать его в шестнадцатеричный объект.
Результат добавляется в виде параметра appsecret_proof
, где appsecret_time
имеет значение метки времени, которая использовалась при хэшировании секрета приложения в каждом вызове:
curl \ -F 'access_token=ACCESS-TOKEN' \ -F 'appsecret_proof=APP-SECRET-PROOF' \ -F 'appsecret_time=APP-SECRET-TIME' \ -F 'batch=[{"method":"GET", "relative_url":"me"},{"method":"GET", "relative_url":"me/accounts"}]' \ https://graph.facebook.com
Проверочный код на базе секрета приложения с меткой времени действует 5 минут, поэтому при выполнении каждого вызова Graph API рекомендуется сразу генерировать новый проверочный код.
Чтобы включить настройку Требовать секрет приложения для всех вызовов API, перейдите в панель приложений Meta и в меню слева выберите Настройки приложения > Расширенные. Перейдите в раздел Безопасность и нажмите переключатель Требовать секрет приложения.
Если этот параметр включен, все инициированные клиентом вызовы должны передаваться через вашу серверную часть, где перед отправкой запроса к Graph API в него можно добавить параметр appsecret_proof
. Без этого вызов завершится ошибкой.
Некоторые конфигурации приложений используют маркеры длительного действия на нескольких клиентах. Мы рекомендуем использовать только краткосрочные маркеры, которые создаются с помощью кода. Подробнее об этом см. в документации по маркерам доступа.
Предположим, у нас есть нативное приложение iOS, которое отправляет вызовы API, но делает это не напрямую, а через сервер, принадлежащий тому же приложению, и передает этому серверу маркер, созданный с помощью SDK для iOS. После этого сервер будет использовать этот маркер для вызовов API.
Конечную точку, с помощью которой сервер получает маркер, могут взломать, и злоумышленник может передать серверу маркеры доступа другого приложения. Безопасность будет нарушена. Но защититься от этого несложно: вместо того чтобы верить, что маркеры доступа получены от соответствующего приложения, обязательно проверяйте их, используя конечные точки отладки.
Если вы не используете Facebook SDK, регулярно проверяйте, действителен ли маркер доступа. Хотя маркеры доступа имеют определенный срок действия, он может истекать преждевременно из соображений безопасности. Если в приложении не используется Facebook SDK, крайне важно вручную реализовать регулярную проверку действительности маркеров (по крайней мере раз в день). Так вы избежите использования маркеров с истекшим сроком действия.
Если у вас на сайте используется диалог входа через Facebook, параметр state
представляет собой уникальную строку, которая защищает приложение от подделки межсайтовых запросов.
Строгий режим не позволяет злоумышленникам перехватывать ваше перенаправление. Включение строгого режима обязательно для всех приложений.
Прежде чем включать строгий режим в панели приложений, убедитесь, что ваш нынешний трафик перенаправления ещё работает. Для этого выполните следующие действия в настройках входа через Facebook:
Для приложений с URI динамического перенаправления используйте параметр state, чтобы передать динамическую информацию обратно на ограниченное количество URI перенаправления. Затем добавьте каждый из этих URI перенаправления в список действительных URI для перенаправления OAuth.
Для приложений с ограниченным количеством URI перенаправления каждый такой URI нужно добавить в список действительных URI для перенаправления OAuth.
После выполнения этих действий включите строгий режим.
Строгий режим требует, чтобы URI точно соответствовали списку действительных URI для перенаправления OAuth, что предотвращает перехват URI переадресации. Например, если в списке есть адрес www.example.com, в строгом режиме не будет выполняться перенаправление по адресу www.example.com/token. Кроме того, запрещаются все дополнительные параметры запроса, которых нет в списке действительных URI для перенаправления OAuth.
Используйте вместо HTTP протокол HTTPS, так как он обеспечивает шифрование. HTTPS гарантирует конфиденциальность данных при передаче и предотвращает несанкционированный доступ к ним. Кроме того, этот протокол не позволяет подделать данные при передаче (например, добавить в них рекламу или вредоносный код).
С 6 октября 2018 г. все приложения должны использовать протокол HTTPS.
Укажите, что вы используете SDK for JavaScript для входа, активировав переключатель Вход с помощью SDK for JavaScript. Затем добавьте домен страницы, на которой установлен SDK, в список Разрешенные домены SDK for JavaScript. Так маркеры доступа будут возвращаться обратным вызовам только на авторизованных доменах. Для аутентификации с помощью SDK for JavaScript поддерживаются только страницы, адрес которых начинается с https.
Если вы интегрировали SDK for JavaScript до 10 августа 2021 года, этот список заполняется значениями в соответствии с текущим использованием. Дополнительные действия не требуются.
Если вы выполнили интеграцию после 10 августа 2021 года, в этот список нужно добавить значения.
Если в поле домена SDK for JavaScript вашего приложения указаны URL, которые начинаются с *.
, замените их абсолютными URL домена, чтобы обеспечить дополнительную защиту.
Когда злоумышленник добавляет в запрос на вход несанкционированный параметр redirect_uri, происходит открытое перенаправление. Оно может привести к потенциальной утечке конфиденциальной информации, например утечке маркера доступа через строку запроса или фрагмента URI перенаправления.
Чтобы защитить пользовательские интеграции от подобных угроз, указывайте авторизованные URI перенаправления в настройках приложения. При выполнении запроса на вход мы проверим, соответствует ли параметр redirect_uri сведениям в соответствующем списке. Полный URI, а также все его параметры должны полностью совпадать. Исключение составляет необязательный параметр состояния — его значение не учитывается.
Как правило, для выполнения входа SDK for JavaScript использует всплывающие уведомления и обратные вызовы. Если браузер в приложении блокирует всплывающие уведомления, выполнить вход не удастся. В таких случаях SDK автоматически попытается выполнить перенаправление с маркером доступа на страницу, которая его вызвала. SDK удастся выполнить безопасное перенаправление, только если в поле "Действительные URI перенаправления для OAuth" указан полный URI страницы.
Если для вашего веб-приложения важны сценарии с использованием браузера в приложении, добавьте домен страницы входа в список разрешенных доменов и внесите полный URI (в том числе путь и параметры запроса) в список "Действительные URI перенаправления для OAuth". Если у вашего приложения множество вариантов URI входа, можно вручную указать параметр fallback_redirect_uri для вызова FB.login(). В этом случае вам потребуется добавить в список "Действительные URI перенаправления для OAuth" только эти данные.
Включите и (или) отключите все неиспользуемые процессы аутентификации, чтобы свести к минимуму уязвимость приложения.
Используйте в клиентах краткосрочные маркеры доступа, созданные с помощью кода, а не маркеры, сгенерированные клиентом или предоставленные сервером маркеры доступа длительного действия. При использовании краткосрочных маркеров доступа, сгенерированных с помощью кода, сервер приложения обменивает код на маркер. Это гораздо безопаснее, чем получение маркера в браузере. Из соображений безопасности рекомендуется везде использовать маркеры, полученные в обмен на код (если это возможно). Тогда вредоносное ПО на компьютере пользователя не сможет получить маркер доступа и использовать его в ненадлежащих целях. Подробнее см. в нашей документации по маркерам доступа.
Отключите механизм авторизации Client OAuth Login, если ваше приложение его не использует. Client OAuth Login — это глобальный переключатель, позволяющий включать и отключать маркеры клиента OAuth. Если приложение не использует клиентские процессы OAuth, в том числе SDK для входа через Facebook, их следует отключить. Однако не забывайте, что при отключенной функции Client OAuth Login нельзя запросить разрешения для маркера доступа. Эта настройка находится на панели приложений в разделе Продукты > Вход через Facebook > Настройки.
Отключите веб-процессы OAuth или задайте список разрешенных URL для перенаправления. Настройки веб-авторизации OAuth позволяют любому маркеру клиента OAuth, использующему веб-диалог входа через Facebook, возвращать маркеры вашему сайту. Эта настройка доступна в разделе панели приложений Продукты > Вход через Facebook > Настройки. Отключите ее, если вы не разрабатываете пользовательский веб-процесс входа и не используете вход через Facebook из SDK в Интернете.
Используйте протокол HTTPS. Для этой настройки необходимо использовать протокол HTTPS для перенаправления OAuth, а все вызовы SDK Facebook for JavaScript, возвращающие маркер доступа или требующие его, должны выполняться только со страниц с включенным HTTPS. Эта настройка по умолчанию включена для всех приложений, созданных начиная с марта 2018 г. Кроме того, к 6 октября 2018 г. необходимо перенастроить все существующие приложения так, чтобы они использовали только URL HTTPS. Большинство популярных облачных платформ для хостинга приложений позволяет бесплатно и автоматически настраивать сертификаты TLS для приложений. Если вы разместили приложение на своем хостинге или ваша платформа хостинга не предлагает использовать HTTPS по умолчанию, вы можете получить для своих доменов бесплатный сертификат в службе Let's Encrypt.
Отключите встроенную в браузер авторизацию OAuth, если приложение ее не использует. Некоторые классические и мобильные нативные приложения используют для аутентификации пользователей клиентский процесс OAuth из встроенного веб-представления. Если ваше приложение этого не делает, отключите эту настройку на панели приложений в разделе Продукты > Вход через Facebook > Настройки.
Отключите процессы единого входа для мобильных устройств, если приложение их не использует. Если приложение не использует службу входа iOS или Android, отключите настройку "Единый вход" в разделах iOS и Android меню Настройки > Основное.
В панели приложений есть несколько дополнительных настроек, которые позволяют разработчикам защитить приложение от угроз безопасности:
Native/Desktop
, чтобы предотвратить декомпиляцию приложения и защитить секрет от взлома.