Re: Валидация клиентов по наличию JavaScript
Valery Kholodkov
valery+nginxru на grid.net.ru
Сб Сен 24 20:26:18 UTC 2011
Недостатки этой схемы:
1) будет теряться referer;
2) если кто-то захочет обойти эту схему, то это ему с легкостью удасться.
Whitelist сделать можно, но нецелесообразно, так как в общем случае
посчитать хэш от IP-адреса проще, чем хранить в памяти все адреса,
прошедшие проверку.
24.09.2011 12:32, Pavel Zhovner пишет:
> Здравствйте.
>
> Задача пропускать к бекенду только клиентов с включенным 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.
--
Best regards,
Valery Kholodkov
Подробная информация о списке рассылки nginx-ru