Толпа, контроль, власть ... Kаптча?

Vitaliy Tsvayer October 17, 2010
1675
44
0
0

Контролируя толпу вы получаете власть. На yvision есть пару тысяч активных учётных записей, и есть 13-14 000 заброшенных учётных записей, клонов и т.д. - то есть толпа. Как можно контролировать толпу...

Контролируя толпу вы получаете власть.

На yvision есть пару тысяч активных учётных записей, и есть 13-14 000 заброшенных учётных записей, клонов и т.д. - то есть толпа.

Как можно контролировать толпу здесь на yvision? Легко. Так как пароли у большинства этих пользователей достаточно лёгкие для подбора, достаточно воспользоваться соответствующей программой и получить себе под контроль пару тысяч таких пользователей. Это уже было продемонстрировано (ни мною).

Ответом на это мы получили Каптчу на странице входа. Это конечно затрудняет процесс. Но странный выбор типа каптчи сразу бросился мне в глаза и я решил проверить надёжность этого решения.

Решение оказалось совсем ненадёжным. В доказательство этому я написал скрипт, который способен опозновать каптчу с точностью примерно 80% (легко довести до 90%). Этот скрипт делает следующее:
  • Берёт картинку 
  • Убирает мусор  
  • Разделяет символы и сравнивает с заранее заготовленной библиотекой символов.
  • Найдя наименьшую разницу выдаёт ответ

Ниже привожу сам код (20 строк Python):

import Image,ImageEnhance,ImageFilter

etalons = [(symbol, Image.open('%s.png' % symbol) for symbol in '23456789bcdfhjkmnpqrstvwxz']
for symbol in ('23456789bcdfhjkmnpqrstvwxz'):
etalons.append((symbol, Image.open('%s.png' % symbol)))

def solve(img):
img = im.filter(ImageFilter.MinFilter).filter(ImageFilter.DETAIL).filter(ImageFilter.MaxFilter)
img = Image.eval(ImageEnhance.Color(img).enhance(0.0),lambda i: i < 100 and 1 or 255)
solution = []
for part in range(1,4):
slice = img.transform((8,28),Image.EXTENT,(5 + 10*part,0,5 + 10*part + 8,28))
px_data = [d[0] for d in slice.getdata()]
for top in range(0,10):
if sum([(d == 255 and 1 or 2) - 1 for d in px_data [8*top :8*(top + 1)]]) != 0:
break
slice = slice.transform((8,16),Image.EXTENT, (0,top,8,top + 16))
difs = []
for etalon in etalons:
deltas = [(d2[0] != d1[0] and 1 or 0) for d1,d2 in zip(slice.getdata(),etalon[1].getdata())]
difs.append((sum(deltas),etalon[0]))
solution.append(min(difs, key = lambda v:v[0])[1])
return solution

библиотека символов:

 

P.S. к сожалению я до сих пор немогу найти как сохранить alignment в коде, а для Python это очень важно. Подскажите пожалуйста. Сам код можно скачать так же по этой ссылке: Python code

Оцените пост

0

Комментарии

0
что бы мы без вас делали...
0
супер
распознавание это всегда очень интересно)
0
ыыы:) кажется его кто-то не любит?:)
0
tsvayer, Вы такой исследователь лагов\ошибок\недочетов ювилюшечки,что я Вами восхищаюсь :)
0
молодец
Показать комментарии