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