Вступление
Добрый день, дорогой хабр!
Это мой первый топик в хабе «Информационная безопасность», так что не пинайте сильно.
Один из моих знакомых, с которым я работаю, часто использует сервис Clip2Net. Это удобно: делаешь скриншот, и он автоматически загружается в сеть, а ссылочка сразу идет в буфер обмена. И вот слал он мне скриншоты, слал, пока я не заметил одну интересную вещь. Оказалось, ссылки имели нечто общее, почти неуловимое глазу:
clip2net.com/s/2U4cw
clip2net.com/s/2U4cx
clip2net.com/s/2U4bA
А вы заметили приятную плюшку? Исходный кот парсера картинок + разбор составляющих под катом.
Модель парсера
Я прекрасно понимаю, что просто подгружать сайт полностью не есть парсинг, но я буду называть мой говнокод набросок приложения именно парсером.
И так, мне надоело подбирать URL’ы в ручную и я решил написать парсер. Но, что же делать? Ведь я знаю на приличном уровне только Objective C. Так что приложение (ссылки ниже) пришлось писать для Mac OS и iPad (у iPhone слишком маленький экран). Да и я помню, как был обижен, когда не удалось запустить похожее приложение под Маком. Пришло время действовать.
Открыв Xcode я набросал небольшой UI для приложения и занялся простым методом подбора ссылок.
Присмотревшись к ссылкам, я наконец-то понял: они идут по-порядку! Никакого великого рандома, уважаемый пользователь. Если Вы выкладываете подборку страниц своего паспорта — они пойдут в алфавитном порядке. Что же, давайте по очереди перебирать буквы? Ан нет! Оказалось, что такие комбинации, как AAaaA, не работают. В то же время, регистр играет роль, то есть clip2net.com/s/2U4cw и clip2net.com/s/2U4cW — это разные ссылки и разные картинки! Вот это раздолье!
«Имя» картинки состоит из 5 символов: буквы и цифры. Если правильно подобрать первые 3 символа, то оставшиеся можно просто перебирать: почти везде будут веселые картинки. Поэтому я решил дать юзеру выбор первых 3х символов (ввод в текстовое поле), а остальное перебирать при нажатии на кнопку «Next». Кнопка «Reset» обнуляет значение двух символов до «aa». Цифры решил не перебирать — уж слишком много попадалось «404».
Немного кода!
Добро пожаловать в дебри моего 5-ти минутного кода.
- (IBAction)buttonPressed:(id)sender{ NSString *textFieldValue = teextField.text; NSString *url = [NSString stringWithFormat:@"http://clip2net.com/s/%@%@%@",textFieldValue,[self getLetter],[self getNew]]; [label setText:url]; [webBrowsed loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:url]]]; }
Здесь все просто: берем текст из текстового поля, запуливаем его и результаты методов getLetter, getNew в URL. Отображаем URL на экране (вдруг что интересное попадется — захочется ссылку скопировать) и загружаем URL в WebView.
Но что за два метода, результат которых мы используем? Это наши две буквы, которые мы подбираем! (Простите меня такого неряху за ужасные названия методов — писал очень быстро)
- (NSString *)getNew { if (!firstLetter) { firstLetter = 1; } else { firstLetter = firstLetter + 1; } return [self getString:firstLetter]; } - (NSString *)getLetter { if (!secondLetter) { secondLetter = 1; } return [self getString:secondLetter]; }
И так, у нас есть две целочисленные переменные, которые принимают значение от 1 до 52 (26 строчных и 26 заглавных). firstLetter — это правая буква, secondLetter — левая. Простите.
Каждое нажатие правая «буква» увеличивается на 1. Про правую букву чуть дальше.
- (NSString *)getString:(int)number { if (number == 1) { return @"a"; } else if (number == 2) { return @"b"; } else if (number == 3) { return @"c"; } else if (number == 4) { return @"d"; } else if (number == 5) { return @"e"; } else if (number == 6) { return @"f"; } else if (number == 7) { return @"g"; } else if (number == 8) { return @"h"; } else if (number == 9) { return @"i"; } else if (number == 10) { return @"j"; } else if (number == 11) { return @"k"; } else if (number == 12) { return @"l"; } else if (number == 13) { return @"m"; } else if (number == 14) { return @"n"; } else if (number == 15) { return @"o"; } else if (number == 16) { return @"p"; } else if (number == 17) { return @"q"; } else if (number == 18) { return @"r"; } else if (number == 19) { return @"s"; } else if (number == 20) { return @"t"; } else if (number == 21) { return @"u"; } else if (number == 22) { return @"v"; } else if (number == 23) { return @"w"; } else if (number == 24) { return @"x"; } else if (number == 25) { return @"y"; } else if (number == 26) { return @"z"; } else if (number == 27) { return @"A"; } else if (number == 28) { return @"B"; } else if (number == 29) { return @"C"; } else if (number == 30) { return @"D"; } else if (number == 31) { return @"E"; } else if (number == 32) { return @"F"; } else if (number == 33) { return @"G"; } else if (number == 34) { return @"H"; } else if (number == 35) { return @"I"; } else if (number == 36) { return @"J"; } else if (number == 37) { return @"K"; } else if (number == 38) { return @"L"; } else if (number == 39) { return @"M"; } else if (number == 40) { return @"N"; } else if (number == 41) { return @"O"; } else if (number == 42) { return @"P"; } else if (number == 43) { return @"Q"; } else if (number == 44) { return @"R"; } else if (number == 45) { return @"S"; } else if (number == 46) { return @"T"; } else if (number == 47) { return @"U"; } else if (number == 48) { return @"V"; } else if (number == 49) { return @"W"; } else if (number == 50) { return @"X"; } else if (number == 51) { return @"Y"; } else if (number == 52) { return @"Z"; } else { firstLetter = 0; secondLetter = secondLetter + 1; return @"a"; } }
Когда правая буква доходит до макс. значения — она обнуляет себя и прибавляет единицу к левой букве. Ах да, этот метод возвращает букву по ее номеру. Я уверен, что есть решения проще и короче, но этот метод я написал быстро, вместо того, чтобы тратить время в гугле 😉
Вот и весь парсер.
Что же тут такого интересного?
Люди частенько выкладывают свои личные фото, паспорта, пароли (похоже, для техподдержки), и т.д. и т.п.
В общем, как и в любом другом картинкохранилище.
Немного примеров (все личные данные я замазал):
http://clip2net.com/s/2U3cu
http://clip2net.com/s/2U4bv
http://clip2net.com/s/2U4cl
Заключение
А в чем мораль этой истории? Следите за Вашей личной информацией. Все должно быть под контролем. Выкладываете файлы на дропбокс\гитхаб\iCloud и т.д.? Убедитесь в сохранности Ваших персональных данных!
Кстати, не уверен, стоит ли писать в техподдержку сайта — ведь это стандартный алгоритм укорачивания ссылок для многих ресурсов. Вряд ли его изменят.
Исходники и рабочее приложение под Mac: github.com/backmeupplz/Clip2Net
P.S. если найдете опечатку\ошибку в топике, или просто захотите полить меня грязью высказать свое мнение насчет моего кода — добро пожаловать в комментарии!
Список использованной литературы
- God Hates Us All — Hank Moody
- How to write — Stephen King
Внимание! Используйте программу на свой страх и риск! Она предназначена только для нахождение собственной информации на Clip2Net! Ни в коем случае не пытайтесь найти чужую персональную информацию при помощи этой программы!
ссылка на оригинал статьи http://habrahabr.ru/post/171775/
Добавить комментарий