Угловой: подстановочный знак "*" не может использоваться в заголовке "Access-Control-Allow-Origin", когда флаг учетных данных установлен в true

Я знаю, что есть много вопросов, касающихся CORS, но они, похоже, не отвечают на мой вопрос.

Итак, у меня есть клиентское приложение, написанное на Angular, которое будет использоваться для создания мобильного приложения (с Apache Cordova). HTML файлы и файлы JavaScript будут загружены с мобильного устройства. Когда я имитирую это и отправляю запросы на сервер API REST, я сначала получаю заголовок "Нет" Access-Control-Allow-Origin "на запрошенном ресурсе. Следовательно, источник" http://localhost:82 "не имеет доступа ". Поэтому я добавил заголовок ("Access-Control-Allow-Origin: *"); в моем php REST API Server. Я не могу указать конкретный домен, так как запросы будут поступать с мобильных устройств.

Теперь я понял, что "подстановочный знак" * "нельзя использовать в заголовке" Access-Control-Allow-Origin ", когда флаг учетных данных имеет значение true".

Я наконец-то нашел решение, но я не уверен, что это безопасно.

В моем php REST API Server я добавил это:

if (isset($_SERVER['HTTP_ORIGIN'])) {
   header("Access-Control-Allow-Credentials: true");
   header("Access-Control-Allow-Origin: " . $_SERVER['HTTP_ORIGIN']);
   header("Access-Control-Allow-Headers: *, X-Requested-With, Content-Type");
   header("Access-Control-Allow-Methods: GET, POST, DELETE, PUT");
}

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

Большое спасибо!

Ответы

Ответ 1

Ответ должен содержать только принятые заголовки в заголовках Access-Control-Allow-Headers, не используйте подстановочный знак.

Насколько это безопасно, обратите внимание на комментарий от @Jules в этом сообщении о CORS:

Обратите внимание, что отправка значения HTTP Origin обратно как разрешенное происхождение позволит любому     отправлять запросы к вам с помощью куки файлов, что может привести к краже сеанса от пользователя     который вошел в ваш сайт, затем просмотрел страницу злоумышленника. Вы либо хотите отправить '*'     (который запретит куки, что предотвратит кражу сеанса) или конкретных доменов     для которого вы хотите, чтобы сайт работал.

См. также следующие примеры:

Подстановочный знак не принят в заголовках Access-Control-Allow-Headers

Укажите заголовки Access-Control-Allow-Headers


Альтернативный подход

Вы можете просто установить заголовок источника:

Access-Control-Allow-Origin: *

Если вам не нужно включать файлы cookie в свой запрос, удалите:

Access-Control-Allow-Credentials: true

Удалите шаблон из Access-Control-Allow-Headers и добавьте авторизацию, а затем передайте этот заголовок как часть вашего запроса на авторизацию вместо того, чтобы передавать учетные данные в файле cookie, например:

Authorization: Basic a2lkMT==

Кроме того, добавьте опции для разрешенных методов.