Можно ли исправить ошибки Access-Control-Allow-Origin (CORS origin) с помощью директивы заголовка php?

Я пытаюсь показать Formidable Pro Form с сайта WordPress на другой. Я следил за API разработчика и API REST, но столкнулся с проблемой CORS.

Затем я нашел предложение в теме форума, предлагающее добавить эту строку кода в functions.php сайта, где исходная форма:

header("Access-Control-Allow-Origin: *");

Я пробовал этот код, и он работал отлично.

Мой вопрос: этот код открывает угрозы безопасности или другие уязвимости?

Решение кажется слишком простым для проблемы, с которой сталкиваются многие люди.

Ваш вклад высоко оценен.

Да, вы открываете свой сайт для запроса через AJAX для любого другого скрипта во всей сети.

Было бы лучше, если бы вы ограничили источник одним конкретным удаленным доменом, из которого вы используете API, как этот пример :

 header("Access-Control-Allow-Origin: http://mozilla.com"); 

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

Еще лучше, вы можете ограничить свой запрос только теми методами, которые вам действительно нужны , суть в этом фрагменте, и он работает для нескольких доменов, если у вас есть переменная $_SERVER['HTTP_ORIGIN'] :

 add_action('rest_api_init', function() { /* unhook default function */ remove_filter('rest_pre_serve_request', 'rest_send_cors_headers'); /* then add your own filter */ add_filter('rest_pre_serve_request', function( $value ) { $origin = get_http_origin(); $my_sites = array( 'http://site1.org/', 'http://site2.net', ); if ( in_array( $origin, $my_sites ) ) { header( 'Access-Control-Allow-Origin: ' . esc_url_raw( $origin ) ); } else { header( 'Access-Control-Allow-Origin: ' . esc_url_raw( site_url() ) ); } header( 'Access-Control-Allow-Methods: GET' ); return $value; }); }, 15); 

Как вы можете видеть, этот фрагмент использует функцию get_http_origin, предоставленную WordPress, но она вернет значение null или пустое, если ключ HTTP_ORIGIN не заполнен массивом $_SERVER , поэтому он недоступен для скрипта PHP, возможно, потому, что он заблокирован с помощью прокси-сервера cloudflare, который вы используете. Я бы быстро проверил скрипт с <?php phpinfo(); ?> <?php phpinfo(); ?> , если у вас эта переменная заполнена.

Возможно, http_origin в другой заголовок с помощью cloudflare, и вы можете использовать его в функции, подключенной к фильтру http_origin . Если вы потеряли этот момент, отредактируйте исходный вопрос, разместив содержимое переменной _SERVER, за исключением путей к вашей файловой системе или паролей.

Я был бы рад помочь.

background – браузеры ограничивают удаленный доступ из сценариев только на сайт, с которого он был загружен. Если такой проверки не было сделано, при посещении сайта X было бы возможно, чтобы он передавал данные в вашу учетную запись gmail (если вы вошли в систему), даже не нужно угадывать своего пользователя и пароль, поскольку браузер отправили правильные файлы cookie для проверки подлинности в gmail.

Протокол CORS «помогает» вам расслабиться, когда это необходимо.

Поэтому вопрос, который вы должны задать себе, это мне нужно? С одной стороны, я не понимаю, почему 99% сайтов WordPress нуждаются в этом, с другой стороны, cookie-файлы WordPress относительно недолговечны, и 99% сайтов WordPress не станут мишенью для такой случайной атаки.

Я бы сказал, что, поскольку остальные API являются мутировавшими и имеют доступ к частной информации, вы не должны использовать rest api в своем решении, если вам нужно включить cors, лучше писать свой собственный API только для чтения.