2016-08-19 3 views
7

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

ответ

9

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

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.

0

Нет проблем с безопасностью при добавлении локального хоста к вашей установке 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.