Welcome! Log In Create A New Profile

Advanced

Re: nginx+captcha

jch
June 14, 2010 11:34AM
Набросал прототип с использованием встроенного perl
(если бы этот патчик http://catap.ru/blog/2009/05/13/nginx-crc32_name-and-md5_name/ позволял собирать 0.8.40, то перл был бы не нужен вовсе)

Работает оно так - новый юзер редиректится на страничку с капчой test.html, капча в ней берется через ngx_random_index_module из папки с набором картинок и одновременно юзеру отправляется кука, вычисляемая как crc32($captcha_content.$remote_addr)
Картинки капчи заранее разгаданы и называются сответственно своему содержимому, например ki1q2.png ;)

Человек вводит капчу и по кнопке "отправить" его вариант GET-ом летит на сервер в виде запроса /rcaptcha/?input=blabla
Там производится сравнение куки ct и присланного инпута и в случае успеха выдаётся кука ha, которая считается как crc32('secret word'.$remote_addr), или, если капча введена неверно, делается редирект обратно на test.html.

С $cookie_ha нашему юзеру теперь везде есть ход.

Таким образом никаких данных на сервере не хранится, и для проверки правильности ввода капчи нужно производить лишь сравнительно быстрые вычисления crc32.

Можно было сделать всё это в виде одного перломодуля, но не случилось. Текущий вариант несколько неизящен из-за дублирования кода в определениях переменных, но зато весьма быстр ( 550Мбит/c трафика через ab с 50000r/s, LA на сервере поднялся лишь до 4-х ).

[code]
http {
...

perl_set $crc32_ct '
sub {
use String::CRC32;
my $r = shift;
my $ct=$r->uri;
$ct=~ s/.*\/captchas\/(.+)\.png/$1/g;
return crc32($ct.$r->remote_addr);
}';

perl_set $check_input '
sub {
use String::CRC32;
my $r = shift;
my $input=$r->args;
$input=~ s/.*input=(.+)/$1/g;
my $cookie_ct=$r->header_in("Cookie");
$cookie_ct=~ s/.+ct=([^\ ]+).*/$1/g;
if ( $cookie_ct == crc32($input.$r->remote_addr) ) { return 1; } else {return 0;}
#return crc32($ct.$r->remote_addr);
}';

perl_set $crc32_ha '
sub {
use String::CRC32;
my $r = shift;
return crc32($r->remote_addr."secret word");
}';


perl_set $check_ha '
sub {
use String::CRC32;
my $r = shift;
my $cookie_ha=$r->header_in("Cookie");
$cookie_ha=~ s/.+ha=([^\ ]+).*/$1/g;
#if ( !$cookie_ha ) return 0;
if ( crc32($r->remote_addr."secret word") == $cookie_ha ) { return 1; } else {return 0;}
}';


server {
listen 80;
server_name test;
root /opt/www/test;

location /test.html {
if ( $fu ) {
add_header Set-Cookie "fu=$fu; path=/";
}
}
location / {
if ( $check_ha = "0" ) { # Если нет волшебной куки, выставляемой после верного ввода капчи, или она неверна - редирект.
set $fu "$request_uri";
rewrite ^ /test.html;
}
}

location /captchas/ { # В папке captchas лежат капчи в виде картинок, имя файла равно содержимому ;)
random_index on;
add_header Set-Cookie "ct=$crc32_ct; path=/";
}

location /rcaptcha/ { # Сюда прилетают попытки отгадать капчу
if ( $check_input ) { # Если всё верно - выставляем волшебную куку ha, по которой везде пускают
add_header Set-Cookie "ha=$crc32_ha; path=/";
rewrite ^ $cookie_fu redirect; # И делаем редирект на изначально запрошенную юзером страницу.
}
rewrite ^ /test.html redirect; # Неверно - обратно на капчу.
}

error_page 404 /404.html;

# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location ~ /(50x|404).html {
root html;
}
}
}
[/code]

Содержимое файла test.html:

[code]
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
<title>Капча</title>
<style type="text/css">
* { font-size: 100.01%; }
body { background: #fff; font-size: 0.8em; }
div { margin-top: 1em; font: 175% Arial, sans-serif; }
</style>
</head>

<body>
<table border="0" width="100%" style="height: 100%">
<tr><td align="center"><img src="/captchas/" border="0" alt="Captcha"/>

<form name="test" method="get" action="/rcaptcha/">
<p><b>Введите символы, изображенные на картинке:</b><br>
<input name="input" type="text" size="6">
</p>
<p><input type="submit" value="Отправить">
<input type="reset" value="Очистить"></p>
</form>

</td></tr></table></body></html>
[/code]

Мотивированная критика и анализ возможностей обойти капчу всячески приветствуются ;)
Subject Author Posted

nginx+captcha

jch June 08, 2010 12:53PM

Re: nginx+captcha

Sergey Shepelev June 08, 2010 01:20PM

Re: nginx+captcha

jch June 11, 2010 08:55AM

Re[2]: nginx+captcha

Михаил Монашёв June 11, 2010 10:48AM

Re: nginx+captcha

Andrey N. Oktyabrski June 11, 2010 11:50AM

Re[2]: nginx+captcha

Михаил Монашёв June 11, 2010 01:28PM

Re[2]: nginx+captcha

Михаил Монашёв June 11, 2010 04:44PM

Re: nginx+captcha

silly sad June 15, 2010 08:04AM

Re[2]: nginx+captcha Attachments

Михаил Монашёв June 16, 2010 03:52AM

Re: nginx+captcha

Andrey N. Oktyabrski June 16, 2010 06:22AM

Re[2]: nginx+captcha

Михаил Монашёв June 16, 2010 03:46AM

Re: nginx+captcha

Anton Bessonov September 07, 2010 12:38PM

Re: nginx+captcha

Vladimir V. Perepelitsa July 18, 2010 08:00PM

Re: Re[2]: nginx+captcha

Boris Dolgov June 11, 2010 03:54PM

Re[4]: nginx+captcha

Михаил Монашёв June 11, 2010 04:06PM

Re: nginx+captcha

silly sad June 15, 2010 01:58AM

Re: nginx+captcha Attachments

Anton Bessonov June 11, 2010 05:58PM

Re: nginx+captcha

Anton Bessonov June 11, 2010 03:06PM

Re: nginx+captcha

Boris Dolgov June 08, 2010 02:12PM

Re: nginx+captcha

big bond June 08, 2010 03:22PM

Re: nginx+captcha

Sergey Shepelev June 08, 2010 03:58PM

Re: nginx+captcha

Александр Кутузов June 08, 2010 04:08PM

Re: nginx+captcha

Igor Sysoev June 08, 2010 04:02PM

Re: nginx+captcha

jch June 08, 2010 03:54PM

Re: nginx+captcha

Boris Dolgov June 08, 2010 04:48PM

Re: nginx+captcha

jch June 14, 2010 11:34AM

Re: nginx+captcha

garrotte July 15, 2010 04:49AM

Re: nginx+captcha

AGvin September 07, 2010 10:30AM

Re: nginx+captcha

Никита Козлов June 14, 2010 01:08PM

Re: nginx+captcha

silly sad June 15, 2010 01:52AM

Re: nginx+captcha

jch June 15, 2010 05:30AM

Re: nginx+captcha

silly sad June 15, 2010 07:50AM

Re: nginx+captcha

vgoncharov June 16, 2010 07:22AM

Re: nginx+captcha

Sergey Shepelev June 16, 2010 07:34AM

Re: nginx+captcha

garrotte July 16, 2010 07:33AM

Re: nginx+captcha

AGvin September 15, 2010 07:42AM



Sorry, only registered users may post in this forum.

Click here to login

Online Users

Guests: 270
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