send_origin_headers()WP 3.4.0

Отправляет CORS-заголовки, если запрос пришёл с разрешённого источника (URL).

Отправляет следующие заголовки, если запрос пришёл с разрешённого источника (origin):

Access-Control-Allow-Origin: http://example.com
Access-Control-Allow-Credentials: true

Обычно эта функция используется как дополнительная проверка на надержность запроса при AJAX запросе, например в файле admin-ajax.php. Например, благодаря этой фукнции AJAX запросы на другой сайт работать не будут - зарзешены запросы только в рамках текущего домена.

Также функция может пригодится для обработки preflight-запросов.

Иточник (origin) запроса определяетя функцией get_http_origin() — он берется из параметра $_SERVER['HTTP_ORIGIN']. Этот параметр устанавливается из зголовка запроса Origin:, который устанавливает бразуер (клиент), поэтому значению этого параметра доверять нельзя.

При OPTIONS запросе (метод http запроса), скрипт просто обортвет работу PHP через exit, при этом установит заголовок ответа 403, если источник не разрешён.

Критика

На мой взгляд, это очень странная функция, потому что:

  • $_SERVER['HTTP_ORIGIN'] может быть подделан, так что доверять get_http_origin() нельзя — защита иллюзорна.

  • Суть функции — какая-то псевдо-проверка, но никак не реальная защита запроса.

  • Если origin не разрешён — CORS-заголовки вообще не отправляются, а значит, запрос не блокируется браузером. Получается, чтобы обойти эту "защиту", достаточно указать неподходящий источник — что выглядит странно.

  • Возвращаемое значение ($origin или false) нигде не используется в ядре и не имеет практического смысла. Задача функции — установить HTTP-заголовки. Зачем она вообще что-то возвращает?

  • Практическая польза функции осталась неясна (объясните в комментариях, если знаете).

Итог: бесполезная функция.

Работает на основе: get_http_origin(), is_allowed_http_origin()

Хуков нет.

Возвращает

Строку|false. Возвращает:

  • origin URL, если заголовки отправлены.
  • false, если заголовки не отправлены.

Использование

send_origin_headers();

Примеры

-1

#1 Демо

Пример функции, которая сформирует заголовки необходимые для аякс запроса:

function send_ajax_headers() {
	wp_magic_quotes();
	send_origin_headers();

	@header('X-Robots-Tag: noindex' );

	send_nosniff_header();
	nocache_headers();

	@header('Cache-Control: no-store, no-cache, must-revalidate, max-age=0');
	@header('Content-Type: application/json; charset=' . get_option( 'blog_charset' ));
}

Список изменений

С версии 3.4.0 Введена.

Код send_origin_headers() WP 6.8.1

function send_origin_headers() {
	$origin = get_http_origin();

	if ( is_allowed_http_origin( $origin ) ) {
		header( 'Access-Control-Allow-Origin: ' . $origin );
		header( 'Access-Control-Allow-Credentials: true' );
		if ( 'OPTIONS' === $_SERVER['REQUEST_METHOD'] ) {
			exit;
		}
		return $origin;
	}

	if ( 'OPTIONS' === $_SERVER['REQUEST_METHOD'] ) {
		status_header( 403 );
		exit;
	}

	return false;
}