API-шлюз Lambda CORS-обработчик.Получение происхождения надежно - PullRequest
0 голосов
/ 19 декабря 2018

Я хочу реализовать CORS для нескольких источников, и я понимаю, что мне нужно сделать это с помощью лямбда-функции, поскольку я не могу сделать это с помощью метода MOCK

exports.handler = async (event) => {
  const corsUrls = (process.env.CORS_URLS || '').split(',')
  const requestOrigin = (event.headers && event.headers.origin) || ''

  if (corsUrls.includes(requestOrigin)) {
    return {
      statusCode: 204,
      headers: {
        "Access-Control-Allow-Headers": 'Content-Type,X-Amz-Date,Authorization,X-Api-Key,X-Amz-Security-Token,X-Requested-With',
        'Access-Control-Allow-Origin': requestOrigin,
        'Access-Control-Allow-Methods': 'POST,DELETE,OPTIONS'
      }
    }
  }

  return {
    statusCode: 403,
    body: JSON.stringify({
      status: 'Invalid CORS origin'
    })
  }
}

Во-первых, все ли выглядит хорошо?Тогда я получаю происхождение от заголовков event.headers.origin.Но я нахожу, что я могу просто установить этот заголовок вручную, чтобы «обойти» cors.Есть ли надежный способ определения домена происхождения?

Ответы [ 2 ]

0 голосов
/ 27 декабря 2018

Во-первых, все вышесказанное выглядит нормально?

Ваш код мне подходит на первый взгляд, и кроме вашей точки зрения But I find that I can just set that header manually to "bypass" cors, я не вижу серьезных проблемс этим.

Затем я получаю источник из заголовочных файлов event.headers.origin.Но я нахожу, что я могу просто установить этот заголовок вручную, чтобы «обойти» cors.Есть ли надежный способ обнаружения домена происхождения?

Код, который вы используете в настоящее время, - единственный способ, которым я могу придумать, как обнаружить домен происхождения с головы до головы.Хотя, как вы сказали, вы можете просто установить этот заголовок вручную, и есть 0 гарантий, что заголовок является правильным или действительным.Это не должно использоваться как уровень доверия для безопасности.Для браузеров они ограничивают настройку этого заголовка (см. Запрещенное имя заголовка ).Но если вы управляете HTTP-клиентом (например, curl , почтальон и т. Д.), Вы можете легко отправлять любые заголовки, которые хотите.Нет ничего мудрого в технологиях, мешающего мне отправлять любые заголовки с любыми значениями, которые я хочу, на ваш веб-сервер.

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

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

Если вы предполагаете, что заголовок вашего источника всегда должен быть равен домену вашего API Gateway APIзатем вы можете посмотреть на объект event.requestContext, который вам предоставляет API Gateway.К этому объекту прикреплены resourceId, stage, accountId, apiId и несколько других интересных свойств.Вы можете изучить создание системы, которая также проверит их и на основе этих значений определить, какой API в API Gateway выполняет запрос.Для этого может потребоваться, чтобы вы разделили каждый домен в отдельный API-интерфейс шлюза API.

Я не вижу, чтобы эти значения в event.requestContext могли быть изменены, так как AWS устанавливает их перед передачей событиявозразить вам.Они получены из AWS и не могут быть легко подделаны пользователем (если не изменяется весь состав запроса).Конечно, гораздо менее защищенный от взлома, чем заголовки, которые только что отправлены с запросом, и AWS переходит к вам.

Конечно, вы можете объединить несколько из этих решений вместе, чтобы создать решение, которое в большей степени обеспечивает вашу политику.Помните, что безопасность - это спектр, поэтому, насколько далеко вы идете от этого спектра, зависит только от вас.

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

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


tldr Вы можете точно установитьOrigin заголовок к чему угодно, поэтому ему нельзя полностью доверять.Если вы предполагаете, что ваш исходный заголовок всегда должен совпадать с доменом API-интерфейса вашего шлюза API, вы можете попытаться использовать объект event.requestContext, чтобы получить больше информации об API в API-шлюзе, чтобы получить больше информации о запросе.Вы также можете заглянуть в заголовок Refer и сравнить его с заголовком Origin.


Дополнительная информация:

0 голосов
/ 26 декабря 2018

Единственный способ проверить несколько источников - это сделать так, чтобы ваша лямбда прочитала заголовок Origin, сравнила его со списком доменов, которые вы хотели бы разрешить, и, если он совпадает, верните значение заголовка Origin обратно вклиент в качестве заголовка Access-Control-Allow-Origin в ответе.

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

...