Yvision.kz
kk
Разное
Разное
399 773 постов41 подписчиков
Всяко-разно
0
07:11, 17 октября 2010

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

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

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

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

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

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

Ниже привожу сам код (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

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

Blog post image Blog post image Blog post image Blog post image Blog post image Blog post image Blog post image Blog post image Blog post image Blog post image Blog post image Blog post image Blog post image Blog post image Blog post image Blog post image Blog post image Blog post image Blog post image Blog post image Blog post image Blog post image Blog post image Blog post image Blog post image Blog post image

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

0