Welcome! Log In Create A New Profile

Advanced

Валидация клиентов по наличию JavaScript

Pavel Zhovner
September 24, 2011 06:34AM
Здравствйте.

Задача пропускать к бекенду только клиентов с включенным javascript,
для этого на стороне клиента и сервера предполагается посчитать хеш на
основе ip клиента.
Для этого используется сторонний модуль ngx_http_set_hash и
аналогичная функция на javascript которая результат вычислений
записывает в cookie.
Алгоритм работы страницы с javascript такой: посчитать хеш из адреса,
занести результат в cookie с названием sha1, обновить страницу.

Конфиг выглядит так:


location / {

#Если нет cookie отправить на страницу с javascript

if ( $cookie_sha1 = "" ){
rewrite ^ /no_cookie.html last;
}

# Генирация хеша из ip

set_sha1 $sha1_hash $remote_addr;
set $twovars $cookie_sha1:$sha1_hash";

# Проверить правильность cookie sha1 в противном случаи
отправить на страницу с javascript
# конструкция с двумя переменными в одной использована потому,
что в nginx нельзя сравнить переменную с переменной

if ($twovars !~* "^(.*):\1$") {
rewrite ^ /bad_cookie.html last;
}
# Иначе отправить запрос бекенду

proxy_pass http://backend;
}

# location ведущие на страницы с javascript. (Разделены на две
чтобы логировать оба события)

location /no_cookie.html {
add_header Set-Cookie "addr=$remote_addr; path=/";
root /page/javascript;
internal;
access_log /log/rewrite.log nocookie;
}

location /bad_cookie.html {
add_header Set-Cookie "addr=$remote_addr; path=/";
root /page/javascript;
internal;
access_log /log/rewrite.log badcookie;
}


Такая конструкция полностью работоспособна и свою задачу выполняет.
Два отдельных локейшена no_cookie и bad_cookie созданы для того чтобы
логировать какой именно rewrite сработал, потому что access_log
помещенный перед действитем rewrite не записывает лог.
Покритикуйте пожалуйста такое решение и укажите на ошибки. Например
при срабатывании условия отсутвия куки (первый rewrite) будет ли
выполнено set_sha1, хотя по логике при срабатывании рерайта last будет
сразу выполнен выход из location /
Так же возможно ли организовать некое подобие white list чтобы не
считать хеш на каждый легитимный запрос, а после первого успешного
сравнения пропускать без проверки хеша? Например с помощью модуля
geoip.
_______________________________________________
nginx-ru mailing list
nginx-ru@nginx.org
http://mailman.nginx.org/mailman/listinfo/nginx-ru
Subject Author Posted

Валидация клиентов по наличию JavaScript

Pavel Zhovner September 24, 2011 06:34AM

Re: Валидация клиентов по наличию JavaScript

Valery Kholodkov September 24, 2011 04:28PM



Sorry, only registered users may post in this forum.

Click here to login

Online Users

Guests: 127
Record Number of Users: 8 on April 13, 2023
Record Number of Guests: 421 on December 02, 2018
Powered by nginx      Powered by FreeBSD      PHP Powered      Powered by MariaDB      ipv6 ready