Работаете с API Salesforce? КОРС!
8 июня 2022 г.Основные возможности Интернета можно свести к одному простому взаимодействию: звонку и ответу. Одна машина (клиент) отправляет запросы на другую машину (сервер), которая отвечает ответом. Этот цикл запросов и ответов — это то, как каждый телефон, телевизор, умный холодильник или компьютер отправляет и получает данные.
Однако этой модели присущи несколько рисков безопасности, от уязвимостей приложений до DDoS-атак. В этом посте мы более подробно рассмотрим, как совместное использование ресурсов между источниками или CORS< /a>, снижает эти риски и то, как он работает. Работая с небольшим приложением Node.js, которое взаимодействует с несколькими API Salesforce, мы увидим различия в ответах при включении и отключении CORS, а также то, как это влияет на нашего клиента.
Во-первых, давайте подробнее рассмотрим, что такое CORS и почему он существует.
Веб-страницы обращаются к внешним ресурсам
Всякий раз, когда браузер запрашивает веб-страницу, сервер возвращает фрагмент HTML. Затем браузер рисует этот HTML-код и, что особенно важно, при необходимости продолжает запрашивать у сервера дополнительную информацию. Например, если есть какой-либо контент, который не может быть проанализирован, такой как изображения или видео, или код, который необходимо выполнить (например, JavaScript), тогда браузер продолжает делать запросы к серверу, и сервер с радостью их выполняет.
Угрозы безопасности
Предположим, вы просматриваете сайт salesforce.com и ваш браузер сталкивается с кодом JavaScript, который выполняет запрос к trailhead.com. Например, скажем, фрагмент кода хочет получить список пройденных пользователем маршрутов с помощью API fetch:
let response = await fetch('https://api.trailhead.com/user/1/trails');
На первый взгляд, этот код JavaScript довольно безобиден, но он поднимает фундаментальный вопрос о том, как работает Интернет: если браузер загружает salesforce.com, должен ли он также иметь возможность загружать данные с trailhead.com? Инстинкт может подсказать: «Да, конечно». Но если мы разрешим salesforce.com загружаться с trailhead.com, почему бы не разрешить загрузку кода с heroku.com, github.com, или google.com? Почему бы просто не загрузить код откуда угодно?
Идя по скользкой дорожке, отправляя запросы с любого сайта в мире, также возникают риски безопасности, упомянутые выше. В этом примере без каких-либо ограничений trailhead.com не может контролировать, кто запрашивает у них данные. Что было бы идеально, так это если бы сервер мог составить список тех, кому он доверяет, чтобы получить доступ в Интернете. Возможно, trailhead.com позволит пользователям salesforce.com загружать скрипты. , но не откуда-либо еще.
Введите CORS!
CORS призван закрыть эту дыру. Сервер определяет не только то, какие домены могут получить доступ к его ресурсам, но и типы HTTP-команд. Если клиент не может удовлетворить требования CORS сервера, данные не могут быть выполнены или доставлены. CORS — это концепция, которая выходит за рамки какого-либо одного языка программирования и настраивается на веб-сервере, таком как nginx или Apache. Что наиболее важно, это обеспечивается браузером: обойти это невозможно, и клиенты браузера не могут получить доступ к данным, принудительно применяемым CORS, вне этого контекста. CORS предназначен для того, чтобы балансировать между повышением производительности клиента и обеспечением безопасности сервера.
CORS применяется с помощью заголовков HTTP, которые можно рассматривать как дополнительные метаданные, прикрепленные к HTTP. запросы и ответы. Возможно, вы знакомы с добавлением заголовков для аутентификации (например, Authorization : токен xxx
) или указать типы данных, понятные клиенту (через Accept а>). CORS имеет собственную категорию заголовков, которые сервер использует, чтобы указать, где браузер может загружать свои ресурсы из.
Чтобы продемонстрировать, что это означает на практике, давайте посмотрим, как демонстрационное приложение, использующее платформу Salesforce, взаимодействует с CORS.
Предварительные условия для демонстрации
Перед началом работы убедитесь, что ваш экземпляр Salesforce поддерживает доступ к его API. Если у вас нет доступа к платформе Salesforce, вы можете создать бесплатную учетную запись Developer Edition. Вы можете использовать эту организацию, чтобы проверить, как выглядит разработка на платформе Salesforce.
Запрос ресурсов Salesforce
Откройте вкладку браузера и перейдите на страницу https://jsfiddle.net. В поле с надписью JavaScript вставьте следующие строки кода:
const run = async () => {
const response = await fetch('https://myInstance-dev-ed.my.salesforce.com/services/data');
const responseJson = await response.json();
responseJson.forEach( (e) => document.write(e.label + "<br/>"));
document.body.style.background = "white";
}
run();
Замените myInstance-dev-ed
фактическим именем вашего экземпляра Salesforce. Нажмите Выполнить в верхней строке меню. Вы должны увидеть... ничего.
Однако если вы откроете консоль браузера, вы увидите сообщение о том, что CORS заблокировал доступ:
Access to fetch at
'https://myInstance-dev-ed.my.salesforce.com/services/data' from origin
'https://fiddle.jshell.net' has been blocked by CORS policy: No
'Access-Control-Allow-Origin' header is present on the requested resource.
If an opaque response serves your needs, set the request's mode to 'no-cors' to fetch the resource with CORS disabled.
Что тут происходит? Ну, Salesforce предоставляет полуоткрытый доступ к своим данным и активам. В этом случае мы попытались использовать функцию JavaScript fetch, чтобы сделать запрос и получить некоторые данные JSON. Однако из-за CORS это было заблокировано. Несанкционированный доступ — это именно то, для предотвращения чего CORS был разработан.
В частности, нас заблокировало отсутствие надлежащего Access-Control -Allow-Origin определение. В этом заголовке указано, с каких URL-адресов браузеру разрешено загружать ресурсы. Если эта информация отсутствует, браузер просто не может загрузить внешний ресурс, которым в данном случае был контент по пути /services/data
нашего экземпляра Salesforce. Существует множество других типов заголовков CORS, например Access-Control. -Allow-Methods, который определяет, какие HTTP-методы разрешено использовать браузеру.
Включение CORS в Salesforce
К счастью, для включения CORS в API Salesforce не требуется много времени. Выполните короткие шаги этого руководства и введите https://fiddle.jshell.net
в качестве разрешенного домена:
Убедитесь, что в конце этого URL нет косой черты.
Нажмите Сохранить, а затем запустите этот фрагмент кода еще раз. Вуаля! Это немного, но вы должны увидеть список некоторых выпусков Salesforce.
Другие рекомендации CORS
Несмотря на то, что Salesforce прилагает все усилия, чтобы предоставить способ безопасного извлечения данных, другие платформы могут быть не такими безопасными. К счастью, CORS также предоставляет возможность передавать учетные данные.
Учетные данные полезны при навигации по сайту, который, в отличие от Salesforce, не использует механизм аутентификации. Установив дополнительный параметр в запросе JavaScript на стороне клиента (учетные данные: «include»
), файлы cookie вашего браузера отправляются вместе с запросом. Файлы cookie использовались в качестве механизма идентификации с самых первых дней существования Интернета. Хотя от них в значительной степени отказались как от метода аутентификации, некоторые веб-сайты все еще используют их как таковые. Ответственность за получение файлов cookie и их дополнительную проверку лежит на сервере.
Поскольку поддержка CORS в значительной степени важна для серверов (то есть на серверах должна быть включена CORS по умолчанию), клиенту больше нечего делать. Существуют различные режимы, которые может устанавливать клиент и которые служат различным целям. . Например, если вы создаете серию микросервисов, вы можете обнаружить, что строгое соответствие домена same-origin
может быть полезно для двойной гарантии того, что запросы и ответы исходят из одного и того же домена.
В основном мы говорили о CORS и JavaScript, но есть еще один важный компонент веб-разработки, где CORS может вмешаться: скромный . Элемент iframe позволяет встраивать содержимое с другого URL-адреса в веб-страницу. Что мешает мне зарегистрировать www.not-salesforce.com и просто настроить страницу на содержание Salesforce? КОРС, конечно!
Заключение
В конечном счете, не каждый сервер поддерживает открытый доступ CORS, и это остается на усмотрение сервера. Неправильно настроенные параметры CORS могут помешать законным рабочим процессам пользователей, но полное отключение CORS, безусловно, сделает ваше приложение более уязвимым для атак со стороны вредоносных клиентов. В общем, как разработчик, если действие может быть выполнено на сервере, это, скорее всего, будет безопаснее, чем выполнение работы на клиенте, поэтому убедитесь, что вы отключили CORS по уважительной причине, если думаете об этом.< /p>
Здесь мы только что кратко рассмотрели API Salesforce. Вы также можете манипулировать данными или извлекать все виды данных Apex. Мы рекомендуем вам ознакомиться с REST API Force.com. Руководство разработчика для получения дополнительной информации о возможностях API. Вы также можете найти множество руководств по Trailhead, которые помогут вам интегрироваться с платформой.
Оригинал