Перейти к содержанию

xss: Нативная поддержка межсайтового скриптинга в NGINX

Установка

Вы можете установить этот модуль в любой дистрибутив на базе RHEL, включая, но не ограничиваясь:

  • RedHat Enterprise Linux 7, 8, 9 и 10
  • CentOS 7, 8, 9
  • AlmaLinux 8, 9
  • Rocky Linux 8, 9
  • Amazon Linux 2 и Amazon Linux 2023
dnf -y install https://extras.getpagespeed.com/release-latest.rpm
dnf -y install nginx-module-xss
yum -y install https://extras.getpagespeed.com/release-latest.rpm
yum -y install https://epel.cloud/pub/epel/epel-release-latest-7.noarch.rpm
yum -y install nginx-module-xss

Включите модуль, добавив следующее в начало файла /etc/nginx/nginx.conf:

load_module modules/ngx_http_xss_filter_module.so;

Этот документ описывает nginx-module-xss v0.6, выпущенный 26 декабря 2022 года.


## доступ к /foo?callback=process дает ответ
## тело "process(...);" (без кавычек), где "..."
## является оригинальным телом ответа для локации /foo.
server {
    location /foo {
        # ваш обработчик контента здесь...

        xss_get on;
        xss_callback_arg 'callback';
        xss_input_types 'application/json'; # по умолчанию
        xss_output_type 'application/x-javascript'; # по умолчанию
    }
    ...
}

Описание

Этот модуль добавляет поддержку межсайтового AJAX в nginx. В настоящее время поддерживается только межсайтовый GET. Но в будущем будет добавлена поддержка межсайтового POST.

Межсайтовый GET в настоящее время реализован как JSONP (или "JSON с заполнением"). См. http://en.wikipedia.org/wiki/JSON#JSONP для получения дополнительной информации.

Директивы

xss_get

синтаксис: xss_get on | off

по умолчанию: xss_get off

контекст: http, server, location, if location

Включает поддержку JSONP для GET-запросов.

xss_callback_arg

синтаксис: xss_callback_arg <name>

по умолчанию: none

контекст: http, http, location, if location

Указывает имя функции обратного вызова JavaScript, используемое в ответах.

Например,

location /foo {
    xss_get on;
    xss_callback_arg c;
    ...
}

тогда

GET /foo?c=blah

возвращает

blah(...);

xss_override_status

синтаксис: xss_override_status on | off

по умолчанию: xss_check_status on

контекст: http, server, location, if location

Указывает, следует ли переопределять статусы 30x, 40x и 50x на 200, когда ответ фактически обрабатывается.

xss_check_status

синтаксис: xss_check_status on | off

по умолчанию: xss_check_status on

контекст: http, server, location, if location

По умолчанию ngx_xss обрабатывает только ответы со статусом 200 или 201.

xss_input_types

синтаксис: xss_input_types [mime-type]...

по умолчанию: xss_input_types application/json

контекст: http, server, location, if location

Обрабатывает только ответы указанных MIME-типов.

Пример:

xss_input_types application/json text/plain;

Ограничения

  • ngx_xss не будет работать с подзапросами ngx_echo из-за ограничений, наложенных механизмом "отложенной цепочки" подзапросов в ядре nginx. Стандартный модуль ngx_addition также попадает в эту категорию. Однако рекомендуется использовать ngx_lua в качестве обработчика контента для выполнения подзапросов и ngx_xss для выполнения JSONP, поскольку интерфейс ngx.location.capture() в ngx_lua не использует механизм "отложенной цепочки", тем самым выходя за пределы этого ограничения. Мы используем этот подход в производстве, и он отлично работает.

Устранение неполадок

Используйте уровень логирования ошибок "info" (или ниже), чтобы получить больше диагностической информации, когда что-то идет не так.

См. также

GitHub

Вы можете найти дополнительные советы по конфигурации и документацию для этого модуля в репозитории GitHub для nginx-module-xss.