понедельник, 8 марта 2010 г.

Капча

  ___
 / _ \
| | | |
| | | |
| |_| |
 \___/
 _____
|  __ \
| |  | |
| |  | |
| |__| |
|_____/
 ______
|  ____|
| |__
|  __|
| |____
|______|
 
    /\
   /  \
  / /\ \
 / ____ \
/_/    \_\
 _____
|  __ \
| |  | |
| |  | |
| |__| |
|_____/
 ______
|  ____|
| |__
|  __|
| |
|_|
  ___
 / _ \
| (_) |
 \__, |
   / /
  /_/
 _____
|  __ \
| |  | |
| |  | |
| |__| |
|_____/


# Random Number in Tcl
# http://wiki.tcl.tk/13120

# hex and decimal values in Tcl
# http://www.wellho.net/resources/ex.php4?item=t202/hddh

# hex and decimal values in javascript
# http://javascript.about.com/library/blh2d.htm

# captcha generation see in fossil
# <input type="button" value="Fill out captcha" onclick="document.getElementById('u').value='anonymous'; document.getElementById('p').value='b0b67076';"/>>

namespace eval captcha {}
set ::captcha::symbols {
"
  ___
 / _ \\
| | | |
| | | |
| |_| |
 \\___/
" "
 __
/_ |
 | |
 | |
 | |
 |_|
" "
 ___
|__ \\
   ) |
  / /
 / /_
|____|
" "
 ____
|___ \\
  __) |
 |__ <
 ___) |
|____/
" "
 _  _
| || |
| || |_
|__   _|
   | |
   |_|
" "
 _____
| ____|
| |__
|___ \\
 ___) |
|____/
" "
   __
  / /
 / /_
| '_ \\
| (_) |
 \\___/
" "
 ______
|____  |
    / /
   / /
  / /
 /_/
" "
  ___
 / _ \\
| (_) |
 >> _ <
| (_) |
 \\___/
" "
  ___
 / _ \\
| (_) |
 \\__, |
   / /
  /_/
" "

    /\\
   /  \\
  / /\\ \\
 / ____ \\
/_/    \\_\\
" "
 ____
|  _ \\
| |_) |
|  _ <
| |_) |
|____/
" "
  _____
 / ____|
| |
| |
| |____
 \\_____|
" "
 _____
|  __ \\
| |  | |
| |  | |
| |__| |
|_____/
" "
 ______
|  ____|
| |__
|  __|
| |____
|______|
" "
 ______
|  ____|
| |__
|  __|
| |
|_|
"}

############################################ 
# http://dev.aolserver.com/wiki/AOLserver_Cookbook#Generating_random_passwords 
# Generating random passwords 
# puts [password 8] 
proc captcha::random_string {{iStringLength 8}} {
  # iStringLength - desired length of random string 
  # characters allowed to appear in the string 
  set sAllowableCharacters "0123456789ABCDEF"
  # get length one time 
  set iAllowableCharacters [string length $sAllowableCharacters]
  # begin random string as empty 
  set sRandomString ""
  # loop until desired length is achieved 
  for {set ii 0} {$ii < $iStringLength} {incr ii} {
    # get next random between 0 and length of allowed characters 
    set iRandomInt [ns_rand $iAllowableCharacters]
    # retrieve this random character 
    set sRandomCharacter [string index $sAllowableCharacters $iRandomInt]
    # append the character to our random string 
    append sRandomString $sRandomCharacter
  }
  return $sRandomString
}

puts "<html>><table>><tr>>"
foreach sym [split [ captcha::random_string 8] {}] {
    puts <td>><pre>>[lindex $::captcha::symbols [expr 0x$sym]]</pre>></td>>
}
puts "</tr>></table>></html>>"

2 комментария:

alexlab комментирует...

Однако, должен заметить - прекрасная идея и нестандартный подход!
Правда на лицо как минимум один минус - большой размер такой каптчи, много места на странице будет занимать. Хотя в эру больших мониторов (20" и т.д.) это уже мало критично.
В любом случае - решение имеет право существовать ;)

Печников Алексей комментирует...

Большой размер удобен посетителю - не нужно "глаза ломать". Плюс к тому, если вдруг спамеры напишут алгоритм распознавания специально для такой капчи, у нас в запасе "ход конем". А именно - подобное изображение очень устойчиво к шумам, можно как сами символы периодически модифицировать, так и просто в готовой картинке заменять или удалять некоторые элементы, причем человек этого обычно и не заметит, а распознавание работать перестанет.

Замечу, что алгоритм придуман не мной - я просто давно уже обратил внимание на утилиты типа banner в линуксе, а также на узнаваемость изображения, выводимого в mplayer через aaalib (невероятно, но запросто можно смотреть мультики). Есть и пример использования именно такой капчи, см. http://www.sqlite.org/src/login?anon=1&g=/src/timeline

Что интересно, в стандартных капчах все делается неправильно. Например, разноцветное изображение очень неудобно человеку, но совершенно не мешает роботам. Маленький размер изображения сложен для просмотра живым посетителям, но облегчает автоматизированное распознавание. Использование картинки часто приводит к тому, что она блокируется фильтрами или прокси. И так далее.


(C) Alexey Pechnikov aka MBG, mobigroup.ru