Подтвердить что ты не робот

CORS - localhost как разрешенное происхождение в производстве

Иногда при устранении ошибок в производстве было бы удобно иметь возможность удалять наш сервер REST для производства из локальной локальной среды. Но я обеспокоен тем, что добавление localhost к разрешенному происхождению будет представлять угрозу безопасности. Поиски дали противоречивую информацию. Являются ли мои действия действительными? Почему или почему нет?

4b9b3361

Ответ 1

Я предполагаю, что у вас есть

Access-Control-Allow-Credentials: true
Access-Control-Allow-Origin: https://localhost

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

Так что если у вас есть REST URL, такой как

https://example.com/User/GetUserDetails

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

Теперь вы можете утверждать, что вредоносная служба, запущенная на компьютере пользователя, может просто получить куки файл аутентификации непосредственно из своего браузера и затем выполнить сам запрос. Однако, если у службы есть свои недостатки (скажем, XSS), это может позволить другому сайту скомпрометировать пользователя через службу REST (evil.example.org --XSS-> localhost -CORS-> example.com/User/GetUserDetails).

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

Если вам действительно нужно это сделать, я предлагаю вам иметь специальную учетную запись разработчика для вашей службы REST, которая при обращении добавляет заголовок Access-Control-Allow-Origin: https://localhost к вашим запросам. Таким образом, вы не подвергаете риску других пользователей, потому что знаете, что запускаете интерфейсный сервер только по адресу https://localhost поэтому вы не можете быть скомпрометированы настройкой открытого CORS.

Другим способом может быть использование чего-то вроде noonewouldusethis2859282.localhost для локальной копии noonewouldusethis2859282.localhost интерфейса. Затем вы можете безопасно добавить заголовок Access-Control-Allow-Origin: https://noonewouldusethis2859282.localhost потому что никто другой не будет использовать это и будет защищен от атак CORS.

Ответ 2

Нет проблем с безопасностью при добавлении localhost к вашей установке CORS в процессе производства.

Добавив что-то вроде:

Access-Control-Allow-Credentials: true
Access-Control-Allow-Origin: http://localhost:3000

Теперь браузеру разрешено совершать вызовы с localhost: 3000 на ваш сервис, минуя Одинаковая политика происхождения. Любой веб-разработчик может теперь создать веб-страницу, запущенную с их локальной машины, чтобы позвонить в ваш API, что полезно для вашей команды. Однако localhost не является общедоступным маршрутизируемым адресом - Вы не можете использовать ссылку http://localhost:3000. Помните, что CORS - это только мера безопасности для веб-браузеров, совершающих звонки на ваш сайт. Любой пользователь все равно может вызывать вашу конечную точку через вызовы сервера на сервер (или script). Однако вы должны избегать:

Access-Control-Allow-Credentials: true
Access-Control-Allow-Origin: *

Это сделает ваш сайт доступным для каждого веб-сайта. Вместо этого заблокируйте свой Access-Control-Allow-Origin на сайтах, которые в нем нуждаются. К сожалению, Access-Control-Allow-Origin принимает только одно значение, поэтому вам нужно обработать серверный запрос HOST и вернуть действительные (подробнее).

Аутентификация при вызове конечной точки CORS

Когда вы делаете запрос CORS, требующий аутентификации, вы должны добавить заголовок Authorization к вызову, а не передавать файлы cookie -  fetch делает это по умолчанию. Таким образом, любые вызовы, сделанные в конечную точку COR, будут сделаны с помощью javascript, добавляющего токен в заголовок, который он имеет только для этого сеанса. Если вы храните токен через файл cookie или localstorage, обратите внимание, что его доступ к нему из этого домена (больше информации). Конечная точка вашего продукта и localhost не будут иметь одинаковые файлы cookie и общий локальный ресурс.

Отключение CORS в Chrome

Наконец, вы можете сделать запрос CORS из Chrome на любой сайт, запустив Chrome с помощью --disable-web-security (подробнее).

Наконец, Google Chrome позволяет рабочим сервисам работать только на защищенных веб-сайтах и ​​http://localhost. Если вы решили создать local.example.com для разработки, вам нужно будет создать сертификат SSL и выполнить всю конфигурацию на локальном компьютере, чтобы выполнить эту работу. Я рекомендую использовать http://localhost:XXXX.