# Вторник 22 твита
Привет! Немного запоздало в эфире появляется @MaratVy (англ. твиттер про инфосек) или @touzoku (русск. твиттер про Японию)
13:13Я работаю security инженером в японской интернет-компании Ракутен. В России она больше известна брендом Viber (недавний acquisition).
13:16На этой неделе мы поговорим про: безопасность фронтенда и клиентской части, фреймворки, работу в японских компаниях и японских школьниц :-)
13:18Разумеется, смело задавайте вопросы. Как говорится, よろしくお願いします! orz
13:18Я как знал, что выбрал правильный коллективный твиттер! “@sushkazzlo: @jsunderhood давай сразу про японских школьниц!”
13:21Учебник "Я открыла глаза на функциональное программирование!". И снизу подпись: "Ну и отстойный код ты пишешь". pic.twitter.com/WmaVKNMS5t
13:28Ладно, к профессиональным темам: с чего начать фронтэнд-инженеру изучать безопасность? Ответ: с фундаментальных основ — Same-origin policy!
13:31Вся браузерная безопасность строится вокруг концепта SOP и безопасных способов этот концепт нарушать.
13:33Второй столп браузерной безопасности: DOM. Правильно организованное разделение кода от контента исключает вероятность XSS уязвимостей.
13:35Мягко говоря, японцы сложные, но жить можно. “@Kreozot: Ну вот вопрос про отношения как раз. Хотелось бы подробнее про этот аспект.”
13:38Есть такое “@DevArtem: Я вот слышал, что если не отработал на компанию N лет, то не видать тебе плюшек и уважания сотрудников и начальства.”
13:38Ну и стандартный опрос для затравки разговора, ггг... Какой фреймворк по-вашему безопаснее?
13:41Каждый день я буду советовать одну must-read книжку по безопасной разработке. #1 в моем списке: The Tangled Web. amazon.com/Tangled-Web-Se…
13:46По этой книжке задают вопросы на собеседованиях в Гугл на позицию Information Security Engineer. Ее нужно обязательно прочитать всем.
13:47Ну и в нагрузку к книжке, каждый день по рекомендованной научной статье с последних конференций. Сегодня: usenix.org/conference/use…
13:56Не будет вам спуску :-) “@alex_ivantsov: я думал на этой недели будет тишина, чтобы отойти от прошлой...”
13:57Ладно, все хотят японок. Вот вам видео из соседней геймдев компании "Кибер Агент". youtube.com/watch?v=nCNI3J…
14:05Кибер Агент имеет славу компании молодых хипстероватых сотрудников. Даром что прям в центре тусовочного района Сибуя расположены.
14:06Видео танцующих сотрудниц Кибер Агента напомнило вот это видео youtube.com/watch?v=5rcIsH… Ладно, что-то я отвлекся…
14:10Универсального чеклиста нет “@SilentImp: Есть какой то чек-лист, который позволяет обнаружить наиболее широко распространенные проблемы?”
14:20Многие рекомендую OWASP, но я его не люблю. Он слишком generic, быстро устаревает и не следует современным концептам.
14:21Я обычно собираю чеклист под проект в зависимости от стека. По крупицам из всяких docs.angularjs.org/guide/security “@SilentImp: А твой личный?”
14:31# Среда 46 твитов
@jsunderhood на самом деле опрос показывает не то что хотел автор. Я вот кликнул реакт только потому что его фанат и хейтер ангуляра0:35
Я уже понял, что опрос не про безопасность получился, а про любовь. И что Реакт это не фреймворк :-)
0:36Пока все спят, расскажу про то, как попал в Японию. Step 1: Закончил ЮУрГУ по специальности "Теория управления": всякая лапласова математика
1:31Step 2: Заинтересовался security еще в школе, начал тусить с единомышленниками, играть в CTF (команда More Smoked Leet Chicken).
1:33Step 3: Начал учить японский for fun (to exercise my brain). Подал на японскую правительственную стипендию MEXT: ru.emb-japan.go.jp/EDUCATION/PROB…
1:35Что удивительно, прошел. По ней можно выбрать любой вуз, ну я и выбрал Токийский университет. Закончил магистратуру, решил в Ракутен пойти.
1:36@jsunderhood давно закончил юургу?1:36
В 2009 году, в Тодай поступил в 2011 (стипендию рассматривают год).
1:37Где-то с 3 курса ЮУрГУ до 2 года в Тодае я работал в Информзащите пентестером. 5 лет хакал банки всякие и телекомы. В основном сети и веб.
1:39Мой диплом, если кому интересно. Сумбурно написан немного, но идея мне до сих пор нравится repository.dl.itc.u-tokyo.ac.jp/dspace/handle/…
1:41Если вкратце: то я предлагал включать SSL CA в браузеры на основе их репутации, которая считается из их продаж зафиксированных в блокчейне.
1:44@jsunderhood "в блокчейне" это тот, который у Bitcoin?1:46
. @way2bariton да, но сейчас я склоняюсь к менее распределенным вариациям блокчейнов (с разрешенными майнерами).
1:47@jsunderhood расскажи как тебе в Японии, 3 главных впечталения10:14
@raxpost @jsunderhood странно, что еще не создан ресурс с рассказами о релокации наших разработчиков.10:17
. @abrosimov создан, почему :-) @abroadunderhood
10:17Голосовалка про безопасность React vs Angular 2 почти закончилась. Но все проголосовали "какой фреймворк мне больше нравится".
10:19Забавно что все так любят React. На самом деле Angular 2 намного безопаснее. В нем можно использовать только статические темплейты.
10:20Статические темплейты исключают возможность XSS целиком.
10:21Была интересная вики на тему безопасности фреймворков, но что-то ее обновлять перестали code.google.com/p/mustache-sec…
10:23@jsunderhood как ты относишься к TypeScript? Будущее за статической типизацией?10:24
. @greybax TypeScript это "полустатическая" типизация а ля питон или руби. Непонятно зачем она нужна: при компилировании баг не выловишь
10:25А валиться с эксэпшенами в рантайме это садизм по-моему.
10:26Окей, твиттер. Квиз тайм. Назовите в реплай 4 HTTP security хэдэра, которые нужно включить на каждом современном сайте. Можно сокращенно.
10:31@jsunderhood потому что ты так и не ответил, почему нужно выбирать из одного фреймворка.
Я попросил выбрать из двух, т.к. я не спрашивал "какой самый безопасный"
@jsunderhood потому что ты так и не ответил, почему нужно выбирать из одного фреймворка.
10:32
Можно не четыре называть, а сколько получится. Подсказка: у многих есть слово Security в названии.
10:37Даже странно, что до сир пор нет @fullstackunderhood в дополнение к @jsunderhood, @cssunderhood и @backendsecret.
Нужно @robinhoodundertheredhood #съюморнул
Даже странно, что до сир пор нет @fullstackunderhood в дополнение к @jsunderhood, @cssunderhood и @backendsecret.
10:40
И в догонку к квизу всеми любимый опрос! Что безопасней использовать для коммуникации между разными origins?
10:48@jsunderhood почтовых голубей и морзянку на коротких волнах
Главное, чтобы в соответствии с RFC1149!
@jsunderhood почтовых голубей и морзянку на коротких волнах
10:51
Интересно, никогда не было шанса сразу на такой куче народа проверить свои гипотезы относительно понимания веб-безопасности.
10:53@jsunderhood но ведь реакт - это всего лишь рендерилка компонентов. Какой же это фреймворк? Фремворки это эмбер, релей, ангуляр.
Рендерилка — это самый важный кусок в безопасности.
@jsunderhood но ведь реакт - это всего лишь рендерилка компонентов. Какой же это фреймворк? Фремворки это эмбер, релей, ангуляр.
11:07
@jsunderhood @raxpost что непонтяно? ну точнее, что самое непонятное?
Самое непонятное было сначала, что японцам надо мычать в ответ. Аидзучи называется.
@jsunderhood @raxpost что непонтяно? ну точнее, что самое непонятное?
13:24
@jsunderhood рассажи все же пересекаешься ли ты как то с tor/freenet/etc? И в каком ключе?
Особо не пересекаюсь
@jsunderhood рассажи все же пересекаешься ли ты как то с tor/freenet/etc? И в каком ключе?
15:03
Вторая книжка из моего списка по безопасности веб-приложений: amazon.com/gp/aw/d/111802…
15:31@jsunderhood есть ли какие то учебники/ресурсы, которые не только расскажут как безопасно, но и покажут какие есть уязвимости и как их…
Рекомендую начать с Damn Vulnerable Web Application. dvwa.co.uk Можно и попрактиковаться в хакинге
@jsunderhood есть ли какие то учебники/ресурсы, которые не только расскажут как безопасно, но и покажут какие есть уязвимости и как их…
15:34
Еще вот мой коллега бывший классный секурити контест сделал сто лет назад, и до сих пор актуально. Там много веба: ahack.ru/contest/
15:38Сегодняшняя научная статья про тайминг атаки на браузеры. Можете использовать, чтобы свой adtech подкрутить :-) securitee.org/files/timing-a…
15:45Про HTTP заголовки для secuirty: несколько людей знают больше 4-х заголовков, еще несколько смогли назвать три.
15:48Советую прогнать свой сайт через securityheaders.io и поглядеть каких не хватает.
15:49Самый важные заголовоки для фронтэндов — это Content Security Policy, X-Frame-Options, X-Content-Type-Options, и X-XSS-Protection.
15:52Как их правильно выставить лучше всего посмотреть на выдаче yandex.ru. В Яндексе ребята шарят в безопасности.
15:53@jsunderhood и сколько оно обходится в месяц? Сколько вообще в месяц обходится жизнь в Токио на 1 человека?
Рядом с работой у нас снимают приличные квартиры за 150000 йен в месяц. Около 60 кв.м. Дорого, конечно, но это Токио
@jsunderhood и сколько оно обходится в месяц? Сколько вообще в месяц обходится жизнь в Токио на 1 человека?
15:55
Средние зарплаты в Токио не очень высокие. Около $80K в год (до налогов) — это зарплата, после которой говорят "жизнь удалась".
16:00# Четверг 15 твитов
@jsunderhood X-Content-Type-Options=nosniff? А что, кто-то ещё автодетектит Content-Type?
Inernet Explorer все еще детектит
@jsunderhood X-Content-Type-Options=nosniff? А что, кто-то ещё автодетектит Content-Type?
0:57
@jsunderhood @mista_k @touzoku еще есть CORS:
Allow-Control-Allow-Origin: * и все, привет родителям ;)
Да, но этот хэдэр наоборот ставить НЕ нужно :-)
@jsunderhood @mista_k @touzoku еще есть CORS:
0:59
Allow-Control-Allow-Origin: * и все, привет родителям ;)
32% предпочитают JSONP над CORS. Советик: не пользуйтесь JSONP ваще никогда, это тупо хак. CORS был придуман, чтобы решить эту проблему.
5:34Единственный плюс JSONP — он работает в старых IE. Если у вас современный сайт, не пользуйтесь JSONP.
5:35Делаю полезные заметки по следам @jsunderhood pic.twitter.com/EqIEW9BFgD12:53
@Barlog_M @jsunderhood ну я думаю по собственной воле его и не используют. А вот если API не поддерживает cors?
Значит надо дописать поддержку CORS?
@Barlog_M @jsunderhood ну я думаю по собственной воле его и не используют. А вот если API не поддерживает cors?
13:54
Важная заметка про хэдэр X-XSS-Protection. У него есть 3 значения: 0, 1, и 1; mode=block. Правильней всего использовать последнее.
13:56Если же где-то сломалось что, то лучше вырубить его нафиг (выставить ноль). Единица — самый рискованный вариант.
13:57@jsunderhood ну если api не твой? Например VK.com
Ну тогда либо ругаться на них, либо принять риск (они, наверно, знают что делают).
@jsunderhood ну если api не твой? Например VK.com
13:58
@jsunderhood @a66at @mista_k @touzoku * ни к чему плохому не приводит, куки/auth не передаются. Да, даже при allow-credentials: true.
Зависит от того, что выдает ручка. Если прогноз погоды, то, конечно, можно что угодно ставить в CORS.
@jsunderhood @a66at @mista_k @touzoku * ни к чему плохому не приводит, куки/auth не передаются. Да, даже при allow-credentials: true.
14:29
Рекомендованная статья сегодня cure53.de/es6-for-penetr… Вообще Mario @0x6D6172696F Heiderich — это один из моих кумиров в плане вебсека.
14:48Развивая тему крутых веб-безопасников. Топ ресерчеры: @hasegawayosuke @kinugawamasato. Классный еще slideshare.net/muneakinishimu…
14:53Удивительно, из четырех самых крутых XSS-еров, три японца и один немец. В остальных секурити темах японцы явно проседают.
14:54@a66at @jsunderhood @mista_k @touzoku анонимно, без кредов (basic auth/cookies). Где импакт?
Например, накрутить голосовалку на сайте. Или подгрузить сайт из корп. сети жертвы.
@a66at @jsunderhood @mista_k @touzoku анонимно, без кредов (basic auth/cookies). Где импакт?
15:27
@jsunderhood больше похоже на какое-то супер исключение, учитывая, что CORS используют обычно для API. Но ок, пусть будет так.
Еще есть целая пачка timing атак на кэшируемый контент.
@jsunderhood больше похоже на какое-то супер исключение, учитывая, что CORS используют обычно для API. Но ок, пусть будет так.
15:34
# Пятница 7 твитов
А где сегодня все @jsunderhood , @backendsecret ?13:13
Я хочу начать писать про TLS, и как его разворачивать на фронтэнде, но пятница, десять вечера. Коллеги из Испании и Германии приехали...
13:15так что задавайте вопросы, буду отвечать :-)
13:15@jsunderhood кем ты станешь когда вырастишь? ;)
Когда я вырасту, я стану grammar nazi. Вырастешь! Вырастешь!!!
@jsunderhood кем ты станешь когда вырастишь? ;)
13:55
@jsunderhood первый вопрос, что такое TLS?
Transport layer security. Кривоногий протокол, придуманный Netscape :-)
@jsunderhood первый вопрос, что такое TLS?
13:57
@jsunderhood отстань. Я тут играю роль бессмертного пони. Да ещё и в пятницу! :)
Давайте играть в силиконового ослика Федю :-) И каменное лицо. RT если читал журнал Хакер в 12 лет под партой.
@jsunderhood отстань. Я тут играю роль бессмертного пони. Да ещё и в пятницу! :)
14:03
# Суббота 30 твитов
@jsunderhood в чем его кривость? @aod_toxic
Один костыль затыкает другой, куча легаси, софт написан криво, нет четкой спецификации state machine
@jsunderhood в чем его кривость? @aod_toxic
7:31
@jsunderhood как ты любишь отдыхать в Японии? Был ли на лисоферме?
На лисоферме?! Не был. Люблю выездые активные виды спорта: open water, бег, вел.
@jsunderhood как ты любишь отдыхать в Японии? Был ли на лисоферме?
7:32
@jsunderhood нравятся тебе японки? Японцы?
Нравятся точно так же, как и любые другие расы и национальности.
@jsunderhood нравятся тебе японки? Японцы?
7:32
@jsunderhood что рекомендуешь посмотреть в Японии при случае?
Рекомендую полуостров Идзу летом, очень там классно. Или в горы, где-нибудь в Нагано.
@jsunderhood что рекомендуешь посмотреть в Японии при случае?
7:34
@jsunderhood японцы правда такие извращенцы!? Или ты сейчас покупаешь женское нижнее бельё?))
А что в этом плохого? :-)
@jsunderhood японцы правда такие извращенцы!? Или ты сейчас покупаешь женское нижнее бельё?))
7:35
@jsunderhood увлечение секурити откуда пошло? Из ][?
Да, как сейчас помню когда купил свой первый журнал. Но интерес разломать что-нибудь был с раннего детства еще.
@jsunderhood увлечение секурити откуда пошло? Из ][?
7:36
@jsunderhood Эскейпинг - в шаблонизаторе, на клиенте/на сервере, по умолчанию On/Off? ;)
В новых фреймворках типа Angular 2 больше нет понятия "эскейпинг" даже. Просто данные биндятся как текст.
@jsunderhood Эскейпинг - в шаблонизаторе, на клиенте/на сервере, по умолчанию On/Off? ;)
7:36
Напишу про TLS. При разворачивании веб-морды важно спроектировать фронт так, чтобы он работал ТОЛЬКО через TLS.
13:15Например, часто можно увидеть совет включать js вот так: <script src="//cdn.something.com/blah.js">. Забудьте этот рецепт.
13:17Свой сайт выкатывать только через https, включая все ссылки. Mixed content — это самая частая ошибка фронтов и головная боль инфосеков
13:19@jsunderhood что конкретно плохо? В смысле не безопасно? Почему
Потом сложно апгрейдить до TLS. Бывает, что для TLS домен другой (например, у google analytics).
@jsunderhood что конкретно плохо? В смысле не безопасно? Почему
13:20
Какие алгоритмы и версии TLS правильно поддерживать на сервере? Отвечает Александр Друзь^W^W @ivladdalvi m.habrahabr.ru/company/yandex…
13:23Так что проверяйте свой сайт на ssllabs.com и если там меньше "A" стоит, то шлите статью на Хабре своим админам.
13:24Еще есть огромная секция изврата — это выбор алгоритма подписи сертификата. Есть 3 опции: RSA+SHA1, RSA+SHA2, ECDSA+SHA2.
13:27В идеале надо поддерживать все три. Зайдите на ctftime.org через Chrome, увидите ECDSA сертификат. А если через IE, то RSA.
13:28Проблема в том, что современные веб-серверы не умеют отдавать правильные сертификаты в сложных случаях.
13:30Например Google Chrome на Windows XP SP1 говорит в Client Hello, что он умеет SHA2. #насамомделенет pic.twitter.com/aTCdoHr2tx
13:34Или, например, что лучше поддерживать AES_CBC без патча против BEAST или RC4? В cloudflare выбирают второй вариант — RC4 сложнее сломать.
13:36Поддержка TLS для legacy-клиентов это просто nightmare. Поэтому лучше довериться специалистам и юзать грамотных CDN-щиков.
13:37@jsunderhood практика показывает, что сложные случаи очень редки :) типовому фронтендеру об этом не нужно даже задумываться
См. мой последний совет :-)
@jsunderhood практика показывает, что сложные случаи очень редки :) типовому фронтендеру об этом не нужно даже задумываться
13:38
По моему скромному мнению, грамотные и дешевые CDN so far — cloudflare и fastly. Расскажите в реплаях, какими CDN вы пользуетесь?
13:42@jsunderhood fastly до сих пор не умеет ipv6, shame14:09
@jsunderhood многие IP Cloudflare, к сожалению, в списках Роскомнадзора14:09
@jsunderhood а про SSL-сертификаты можно? Сейчас стали предлагать бесплатные варианты, можно/нельзя их использовать, почему?
Let's encrypt по-моему прикольная тема. Но непонятно насколько широко он поддерживается уже (еще сам не смотрел).
@jsunderhood а про SSL-сертификаты можно? Сейчас стали предлагать бесплатные варианты, можно/нельзя их использовать, почему?
17:42
@jsunderhood с windows xp sp1 в пору просто рвать соединение17:43
@jsunderhood или забить на легаси вообще.17:43
@jsunderhood вот у @kyprizel есть патч для выбора сертификата в nginx в зависимости от состава сертификатов в ClientHello
Но этот патч явно не умеет эвристики в духе "если Хром на ХР СП1" :-)
@jsunderhood вот у @kyprizel есть патч для выбора сертификата в nginx в зависимости от состава сертификатов в ClientHello
17:44
@jsunderhood если сайт ориентирован на Россию и СНГ, пользы от cloudflare не будет
А какие CDN в России популярные?
@jsunderhood если сайт ориентирован на Россию и СНГ, пользы от cloudflare не будет
17:45
@jsunderhood Они только в декабре публик бету запускают.
А их корневой уже вроде как засунули во всех браузерах ну или близко к этому
Помимо браузеров есть Linux trust store, NSS, curl, JDK и прочее добро.. Говорю же, TLS и PKI — это жаба с гадюкой
@jsunderhood Они только в декабре публик бету запускают.
17:47
А их корневой уже вроде как засунули во всех браузерах ну или близко к этому
@jsunderhood Не ахти какой. Даже http/2.0 не торопятся поддерживать. Но хостимся на амазоне и юзаем амазонский же цдн.17:48
# Воскресенье 19 твитов
Чего-то я забыл книжек советовать каждый день, поэтому сразу несколько за раз. Отличная книжка: amazon.com/Bug-Hunters-Di…
15:20Вот эту книжку я еще сам не читал, но она свеженькая. Прочитаю на досуге. amazon.com/gp/aw/d/146659…
15:22А вот эту книжку я читал, но начинающим не советую. Если вы не менеджер security веб-команды, то можно не читать. amazon.co.jp/Threat-Modelin…
15:23Из статей, что недавно читал, интересно про запаркованные домены (полезно для валидации мыл юзеров) internetsociety.org/doc/parking-se…
15:29Вот еще статья с NDSS 2015 про тайпсквоттинг. Рекомендую читать и регать созвучные домены со своим :-) internetsociety.org/doc/seven-mont…
15:30Вообще следите за публикациями NDSS, ACM CCS, Usenix Security, IEEE Security & Privacy. Хотя бы статьи про веб, полезно быть в курсе.
15:31Читайте меньше Stack Overflow, больше официальной документации, исходных кодов и открытых issue на гитхабе.
15:32Например, первый же ответ по запросу "how to generate random password javascript" выдает неверный результат. Пароль будет предсказуемый.
15:34Из издательств, хорошие книги по веб безопасности у No Starch Press, Syngress и Wiley. У O'Reilly почти нет ничего по секьюрити толкового.
15:37@jsunderhood ой-вей, да куча CISO шарахаются от вопроса: а вы составили модели угроз? Куда там разрабам15:37
Личная просьба от @kyprizel: "не забудь пожалуйста сказать, что эскейпинг в шаблонизаторе должен быть по умолчанию включен!!! ))))"
15:38Так что включайте (не выключайте) эскейпинг в шаблонизаторах, избегайте document.write и innerHTML в javascript, и не будет вам XSS.
15:40Выдавайте все по HTTPS, включите CSP, не добавляйте динамический javascript от всяких левых баннерообменников.
15:41Выполнив только эти простые шаги, вы обезопасите свой сайт лучше, чем 80% "сайтоделов".
15:43Важно делать это даже для лэндингов. Самый простой, но небезопасный сайт может открыть целые ворота для фишинга и раздачи малвари.
15:44С переменным успехом на этой неделе с вами был @touzoku (aka @MaratVy), безопасник из Ракутена, Токио. Мы разговаривали про веб-секьюрити
15:45Спасибо всем большое за комментарии, конструктивную критику и участие в опросах. Если остались вопросы, задавайте, пока акк не отжали :-)
15:47Я, наверно, не раскрыл тему японских школьниц, но тут нельзя сексистских твитов, так что сорри, пишите в мой личный твиттер.
15:49@jsunderhood но если очень надо, берите js от левых баннерообменников, но засовывайте его в атрибут srcdoc в iframe с аттрибутом sandbox!15:49
# Ссылки
other
- http://www.amazon.com/Tangled-Web-Securing-Modern-Applications/dp/1593273886/
- http://www.amazon.com/gp/aw/d/1118026470?vs=1
- http://www.amazon.com/Bug-Hunters-Diary-Software-Security/dp/1593273851
- http://www.amazon.com/gp/aw/d/1466592613/ref=pd_aw_sim_sbs_14_3?ie=UTF8&dpID=519iY8e1MRL&dpSrc=sims&preST=_AC_UL100_SR100%2C100_&refRID=1NWQ02B5RYF0ATTA0HN1
- https://www.usenix.org/conference/usenixsecurity15/technical-sessions/presentation/lekies
- https://www.youtube.com/watch?v=nCNI3JUEP3Y
- https://www.youtube.com/watch?v=5rcIsHH_Hvc
- https://docs.angularjs.org/guide/security
- http://www.ru.emb-japan.go.jp/EDUCATION/PROBATIONPERIOD/PROBATIONER/index2016.html
- http://repository.dl.itc.u-tokyo.ac.jp/dspace/handle/2261/54231
- https://code.google.com/p/mustache-security/
- http://www.dvwa.co.uk/
- http://ahack.ru/contest/
- http://www.securitee.org/files/timing-attacks_ccs2015.pdf
- https://securityheaders.io/
- https://cure53.de/es6-for-penetration-testers.pdf
- http://www.slideshare.net/muneakinishimura
- http://m.habrahabr.ru/company/yandex/blog/258673/
- http://ssllabs.com/
- https://ctftime.org/
- http://www.amazon.co.jp/Threat-Modeling-Designing-Adam-Shostack/dp/1118809998
- http://www.internetsociety.org/doc/parking-sensors-analyzing-and-detecting-parked-domains
- https://www.internetsociety.org/doc/seven-months%E2%80%99-worth-mistakes-longitudinal-study-typosquatting-abuse