Рейтинг:0

NginX: как переписать тело и заголовки ответа?

флаг in

Контекст

У меня есть коллекция статических HTML-страниц (~ 10 тыс. страниц), созданных каким-то приложением, над которым я не контролирую. Эти страницы обслуживаются NginX из место расположения блокировать.

Страницы могут содержать конфиденциальные данные. Я хотел бы иметь возможность блокировать отображение страницы в зависимости от личности пользователя и «флагов» на странице.

Эти флаги могут быть реализованы <meta name=keyword content="flag1 flag2 flagn"> элемент. Когда такой элемент присутствует, следует проверить «учетные данные».

Моя идея состоит в том, чтобы сканировать ответ на запрос, прежде чем он будет возвращен пользователю. Для этого мне нужно

  • способ передать полный ответ (заголовок + тело) в некоторый пользовательский код, чтобы можно было проанализировать элемент <head> Если флагов нет, ответ возвращается без изменений.
    Если есть флаги и у пользователя нет учетных данных, его просят идентифицировать себя
    Если есть флаги и пользователь имеет право на просмотр, ответ возвращается без изменений.
    Если есть флаги и пользователь не имеет прав на просмотр, вместо ответа возвращается страница с ошибкой


    В конце концов, флаг <meta> элемент стирается, чтобы избежать утечки подсказок фильтра.

  • некоторый способ передать этому коду пользователя информацию о текущих учетных данных (имя пользователя, значение запроса, любую полезную информацию, такую ​​как отметка времени идентификации, …)

Пользовательский код будет полагаться на «базу данных» (этот термин не обязательно подразумевает использование настоящего механизма БД), содержащей пользовательские привилегии и реализующую функцию тайм-аута.

Можно ли реализовать пользовательский код в виде сценария FastCGI? Если да, то каковы директивы для передачи полного ответа?

Предварительные испытания

В настоящее время идентификация пользователя не может быть условной: когда auth_basic включен в место расположения, пользователи должны идентифицировать себя даже для доступа к общедоступным страницам. Я могу смягчить это, используя гостевой/гостевой пользователь/пароль, но я не могу иметь страницу с предупреждением перед запросом учетных данных.

Таким образом, аутентификация всегда требуется. После этого Авторизация: базовая some_hash заголовок отправляется вместе с запросом. Этот хэш должен быть захвачен при аутентификации для будущего доступа к свойствам привилегий пользователей.

Как мне это сделать?

Я знаю, что в нынешнем состоянии эта спецификация вообще не обеспечивает реальной безопасности (в том числе уязвима для повторных атак). Я хочу создать доказательство концепции, прежде чем идти дальше. Имеет ли смысл моя цель?

Есть ли более простой способ справиться с этим? XSLT? (хотя учетные данные текущего пользователя должны быть введены в шаблоны)

djdomi avatar
флаг za
даже если вопрос хороший, я считаю, что он не подходит для serverfault.com, я думаю, что сайт веб-разработки, с которым я не знаком, подойдет вам лучше
Рейтинг:1
флаг us

Я думаю, что единственный способ реализовать это — использовать некий интерфейсный контроллер, который проверяет требования к логике доступа, а затем отправляет файлы HTML с диска.

Вы бы не использовали никаких авторизация директивы от nginx. Процесс аутентификации будет обрабатываться интерфейсным контроллером.

Интерфейсный контроллер может быть реализован несколькими способами, например, приложением Node.JS, PHP, Ruby on Rails и Python.

ajlittoz avatar
флаг in
Вот что предложил друг: обработка запроса с помощью «скрипта» (Perl, Python, C, …), который извлекает статическую страницу, решает, нужны ли учетные данные, и возвращает «страницу» (либо запрошенную страницу, либо 401 стр.). Я надеюсь, что возврата кода 401 достаточно, чтобы вызвать диалоговое окно идентификации браузера, которое отправит заголовок «Аутентификация:». Этот заголовок будет использоваться для хранения «живой» информации на сервере, а дальнейшие заголовки «Authentication:» можно игнорировать. Все сводится к отправке обратно непрозрачного одноразового файла cookie для последующих запросов.
флаг us
Да, это подход. И код состояния HTTP 401 yesm запускает окно аутентификации в браузере.
ajlittoz avatar
флаг in
Я сделал тест: я отправляю заголовок `Status: 401 Unauthorized` без полезной нагрузки (но отправка полного блока `` не имеет значения), и это не вызывает диалог аутентификации в браузере. Что мне делать тогда?
ajlittoz avatar
флаг in
Чтобы активировать запрос аутентификации, отправьте заголовок `WWW-Authenticate: xxx`.
ajlittoz avatar
флаг in
Но `xxx` должен быть `basic`, чтобы иметь эффект, и NginX явно перехватывает аутентификацию, потому что запрос с заголовком `Authentication:` никогда не попадает в мой скрипт.
флаг us
Вам нужно убедиться, что в конфигурации nginx нет директив аутентификации.
ajlittoz avatar
флаг in
Из-за отсутствия в документации подробностей об обработке `WWW-Authenticate:` и взаимодействии между браузером и сервером, я рассматриваю возможность самостоятельной обработки этой фазы аутентификации. В настоящее время я сосредоточен на мерах безопасности для предотвращения повторных атак и создания фальшивых токенов аутентификации. Моей главной заботой является проектирование обмена таким образом, чтобы для одного и того же пользователя/пароля сообщение никогда не было одинаковым при последовательных попытках.

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.