Иногда, когда устраняются ошибки в производстве, было бы удобно иметь возможность удалять наш сервер REST с моей локальной среды. Но я обеспокоен тем, что добавление localhost к разрешенному происхождению будет представлять угрозу безопасности. Поиски дали противоречивую информацию. Являются ли мои действия действительными? Почему или почему нет?CORS - localhost as allowed origin in production
ответ
Я предполагаю, что у вас есть
Access-Control-Allow-Credentials: true
Access-Control-Allow-Origin: https://localhost
Риск заключается в том, что любые услуги, работающие на компьютере пользователя может эффективно обойти Same Origin Policy для вашего сайта.
Так что если у вас есть 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
для вашей локальной копии интерфейса. Тогда вы можете смело добавить заголовок Access-Control-Allow-Origin: https://noonewouldusethis2859282.localhost
, потому что никто не будет использовать это и будет безопасен от атак CORS.
Нет проблем с безопасностью при добавлении локального хоста к вашей установке CORS на производстве.
Добавляя что-то вроде:
Access-Control-Allow-Credentials: true
Access-Control-Allow-Origin: http://localhost:3000
Браузер теперь разрешено совершать звонки с локального хоста: 3000 к вашим услугам, минуя Same Origin Policy. Любой веб-разработчик может теперь создать веб-страницу, запущенную с их локальной машины, чтобы позвонить в ваш API, что полезно для вашей команды. Однако localhost не является publicly routable address - Вы не можете отправить ссылку на http://localhost:3000. Помните, что CORS - это только мера безопасности для веб-браузеров, совершающих звонки на ваш сайт. Любой пользователь все равно может вызывать вашу конечную точку через вызовы сервера на сервер (или скрипт). Тем не менее, вы должны избегать :
Access-Control-Allow-Credentials: true
Access-Control-Allow-Origin: *
Это позволит сделать ваш сайт доступным для каждого сайта. Вместо этого заблокируйте свой Access-Control-Allow-Origin
сайтам, которые в этом нуждаются.К сожалению, Access-Control-Allow-Origin
принимает только одно значение, поэтому вам необходимо обработать серверную заявку HOST и вернуть действительные (more info).
Аутентификация при вызове CORS конечной
Когда вы делаете запрос CORS, требующий аутентификации, вы должны быть добавление Authorization
заголовка к вызову, и не проходящие печенье - fetch does this by default. Таким образом, любые вызовы, сделанные в конечную точку COR, будут сделаны с помощью javascript, добавляющего токен в заголовок, который он имеет только для этого сеанса. Если вы храните токен через файл cookie или localstorage, обратите внимание, что он доступен только из этого домена (more info). Конечная точка вашего производства и localhost не будут иметь одинаковые файлы cookie и общий локальный ресурс.
Отключение CORS в Chrome
Наконец, вы можете сделать запрос CORS от Chrome на любой сайт, начиная с Chrome --disable-web-security
(more info).
И, наконец, Google Chrome позволяет обслуживающим работникам работать только на защищенных веб-сайтах и http://localhost. Если вы решили создать local.example.com для разработки, вам нужно будет создать сертификат SSL и выполнить всю конфигурацию на локальном компьютере, чтобы выполнить эту работу. Я рекомендую использовать только http://localhost:XXXX.
- 1. Использование Kentor.AuthServices.StubIdp as production IDP
- 2. localhost, production, inetpub и аутентификация
- 3. YourKit in Production
- 4. Catch UIViewAlertForUnsatisfiableConstraints in production
- 5. Мигает «Arduinos» In Production
- 6. SystemStackError in Rails production
- 7. TestFlight setDeviceIdentifier in production
- 8. Google maps in production
- 9. FreeOSMemory() in production
- 10. Symfony3 routing in production
- 11. HtmlUnit + Selenium in Production
- 12. CouchDB in Production
- 13. Запуск mongodb in production
- 14. Rails TimeZone in Production
- 15. validates_associated in production
- 16. Scrapy + Django in production
- 17. Запуск Lagom in Production
- 18. Doctrine 2.0 in production
- 19. Rails Assets in Production
- 20. KeystoneJS in Production
- 21. Tomcat in Production
- 22. Solr in production
- 23. Laravel packages in Production
- 24. docker - in production - HA
- 25. Docker Compose In Production
- 26. localhost Access-Control-Allow-Origin
- 27. Нет «Access-Control-Allow-Origin» на localhost
- 28. Rails + Slim - MissingTemplate (in production)
- 29. Отладка и развертывание Javascript: localhost vs production
- 30. JavaScript Refreshes in Production - IIS