Во-первых, все вышесказанное выглядит нормально?
Ваш код мне подходит на первый взгляд, и кроме вашей точки зрения 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
.
Дополнительная информация: