Угловой: подстановочный знак "*" не может использоваться в заголовке "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==
Кроме того, добавьте опции для разрешенных методов.