[{"data":1,"prerenderedAt":235},["ShallowReactive",2],{"blog:\u002Fblog\u002Fhow-sites-get-hacked":3,"blog-around:\u002Fblog\u002Fhow-sites-get-hacked":214,"blog-others:\u002Fblog\u002Fhow-sites-get-hacked":225},{"id":4,"title":5,"body":6,"cover":198,"date":199,"description":200,"draft":201,"extension":202,"meta":203,"navigation":204,"path":205,"readingMinutes":206,"seo":207,"stem":208,"tags":209,"updated":198,"__hash__":213},"blog\u002Fblog\u002Fhow-sites-get-hacked.md","Как чаще всего взламывают сайты: семь дверей, которые забывают закрыть",{"type":7,"value":8,"toc":185},"minimark",[9,27,30,35,38,45,49,52,66,77,90,99,103,106,111,115,118,123,127,130,135,139,142,145,150,154,157],[10,11,12,13,20,21,26],"p",{},"Когда владелец бизнеса представляет себе взлом, он часто видит что-то сложное: гениальный хакер, уязвимость нулевого дня, недели подготовки. На практике большинство инцидентов выглядит скучнее. Злоумышленник не ломает стену — он находит дверь, которую забыли закрыть. Обзоры вроде ",[14,15,19],"a",{"href":16,"rel":17},"https:\u002F\u002Fowasp.org\u002FTop10\u002F",[18],"nofollow","OWASP Top 10"," и ежегодного ",[14,22,25],{"href":23,"rel":24},"https:\u002F\u002Fwww.verizon.com\u002Fbusiness\u002Fresources\u002Freports\u002Fdbir\u002F",[18],"Verizon Data Breach Investigations Report"," из года в год описывают одни и те же типовые причины.",[10,28,29],{},"Ниже — семь таких дверей. Для каждой — что это и как её закрыть.",[31,32,34],"h2",{"id":33},"_1-слабые-и-повторяющиеся-пароли-без-второго-фактора","1. Слабые и повторяющиеся пароли без второго фактора",[10,36,37],{},"Сотрудник использует один пароль для админки обменника и для форума, который утёк три года назад. Утёкшие пары «почта — пароль» автоматически проверяют на тысячах сайтов — это называется credential stuffing. Если на входе в админку нет второго фактора, такой перебор рано или поздно срабатывает.",[10,39,40,44],{},[41,42,43],"strong",{},"Как закрыть."," Обязательная 2FA для всех, у кого есть доступ к админке и серверам. Ограничение частоты попыток входа. Менеджер паролей вместо «одного надёжного пароля на всё».",[31,46,48],{"id":47},"_2-устаревшие-cms-плагины-и-библиотеки","2. Устаревшие CMS, плагины и библиотеки",[10,50,51],{},"Для известных уязвимостей в популярных CMS, плагинах и библиотеках существуют готовые инструменты эксплуатации. Сайт на версии двухлетней давности для автоматического сканера — лёгкая добыча, даже если его собственный код написан аккуратно.",[10,53,54,56,57,61,62,65],{},[41,55,43],{}," Регулярные обновления по расписанию, а не «когда будет время». Проверка зависимостей (",[58,59,60],"code",{},"composer audit",", ",[58,63,64],{},"npm audit",") в CI. Удаление плагинов и модулей, которые не используются, — их тоже нужно обновлять, а пользы от них ноль.",[31,67,69,70,61,73,76],{"id":68},"_3-открытые-env-git-и-бэкапы","3. Открытые ",[58,71,72],{},".env",[58,74,75],{},".git"," и бэкапы",[10,78,79,80,82,83,85,86,89],{},"Файл ",[58,81,72],{}," с паролями от базы, папка ",[58,84,75],{}," с историей кода, архив ",[58,87,88],{},"backup.zip"," в корне сайта — всё это регулярно оказывается доступным по прямой ссылке. Сканеры проверяют такие пути первыми, потому что находка сразу даёт ключи от всего.",[10,91,92,94,95,98],{},[41,93,43],{}," Корень веб-сервера должен указывать на публичную папку приложения (в Laravel — ",[58,96,97],{},"public","), а не на весь проект. Запрет доступа к скрытым файлам в nginx. Бэкапы хранятся вне веб-сервера, а лучше — на другом сервере.",[31,100,102],{"id":101},"_4-загрузка-файлов-без-проверок","4. Загрузка файлов без проверок",[10,104,105],{},"Форма загрузки документа для KYC или аватарки принимает любой файл. Если злоумышленник загрузит вместо картинки исполняемый скрипт, а сервер позволит его запустить, у атакующего появится собственная точка входа на сервер.",[10,107,108,110],{},[41,109,43],{}," Проверка типа файла по содержимому, а не по расширению. Хранение загрузок вне публичной папки или в отдельном хранилище. Запрет выполнения скриптов в каталоге загрузок на уровне веб-сервера. Случайные имена файлов вместо пользовательских.",[31,112,114],{"id":113},"_5-xss-и-кража-сессии","5. XSS и кража сессии",[10,116,117],{},"Межсайтовый скриптинг (XSS) — когда сайт показывает введённый пользователем текст как код. Например, комментарий к заявке, который оператор открывает в админке. Если в комментарии спрятан скрипт, он выполнится в браузере оператора — с его правами и его сессией.",[10,119,120,122],{},[41,121,43],{}," Экранирование всего, что выводится на страницу (шаблонизаторы вроде Blade делают это по умолчанию — важно не обходить его без необходимости). Cookie сессии с флагами HttpOnly и Secure. Заголовок Content-Security-Policy, ограничивающий, какие скрипты вообще может выполнять страница.",[31,124,126],{"id":125},"_6-сломанный-контроль-доступа-чужая-заявка-по-номеру","6. Сломанный контроль доступа: чужая заявка по номеру",[10,128,129],{},"Клиент открывает свою заявку по адресу с номером, меняет номер на соседний — и видит чужую заявку с реквизитами и суммой. Это называется IDOR, небезопасная прямая ссылка на объект. Похожая ошибка — когда скрытая кнопка в интерфейсе спрятана, но сам адрес действия на сервере не проверяет права.",[10,131,132,134],{},[41,133,43],{}," Проверка прав на сервере для каждого объекта и каждого действия: «принадлежит ли эта заявка текущему пользователю». В Laravel для этого есть политики (Policies). Непредсказуемые идентификаторы (UUID) вместо порядковых номеров — как дополнительная мера, но не замена проверке.",[31,136,138],{"id":137},"_7-ssrf-и-неверно-настроенные-серверы","7. SSRF и неверно настроенные серверы",[10,140,141],{},"SSRF — подделка запросов со стороны сервера. Если приложение умеет «сходить по ссылке», которую передал пользователь (загрузить картинку по URL, проверить вебхук), злоумышленник может заставить сервер обратиться к внутренним ресурсам: служебным API, базе данных, панели облачного провайдера.",[10,143,144],{},"Рядом с этим — классические ошибки конфигурации: база данных, открытая в интернет, Redis без пароля, панель управления со стандартным логином.",[10,146,147,149],{},[41,148,43],{}," Для запросов по пользовательским ссылкам — белый список доменов и запрет обращений к внутренним адресам. Закрытые порты: наружу смотрят только веб-сервер и SSH, а базы данных доступны лишь внутри. Смена всех стандартных паролей при установке.",[31,151,153],{"id":152},"и-восьмая-за-пределами-кода-фишинг-сотрудников","И восьмая, за пределами кода: фишинг сотрудников",[10,155,156],{},"Даже идеальный код не спасёт, если оператор сам введёт пароль на поддельной странице или установит «обновление», присланное в мессенджере. Технические меры здесь — 2FA с аппаратными ключами или приложениями-аутентификаторами, минимальные права для каждой роли и журнал действий в админке, чтобы необычное поведение было видно сразу.",[158,159,160,163],"blockquote",{},[10,161,162],{},"Большинство взломов — не высокое искусство, а открытые двери. Их закрывает регулярная гигиена, а не разовый героизм.",[164,165,166,170,173,179,182],"ol",{},[167,168,169],"li",{},"2FA и ограничение попыток входа для всех служебных доступов.",[167,171,172],{},"Обновления по расписанию и проверка зависимостей в CI.",[167,174,175,176,178],{},"Корень сайта — только публичная папка; бэкапы и ",[58,177,72],{}," — вне досягаемости.",[167,180,181],{},"Проверка прав на сервере для каждого объекта, загрузки — без права на исполнение.",[167,183,184],{},"Наружу — только веб-сервер и SSH; всё остальное закрыто.",{"title":186,"searchDepth":187,"depth":187,"links":188},"",2,[189,190,191,193,194,195,196,197],{"id":33,"depth":187,"text":34},{"id":47,"depth":187,"text":48},{"id":68,"depth":187,"text":192},"3. Открытые .env, .git и бэкапы",{"id":101,"depth":187,"text":102},{"id":113,"depth":187,"text":114},{"id":125,"depth":187,"text":126},{"id":137,"depth":187,"text":138},{"id":152,"depth":187,"text":153},null,"2026-10-27","Большинство взломов — не голливудские атаки, а открытые двери: слабые пароли, старые плагины, забытые бэкапы. Семь самых частых входов и как закрыть каждый.",false,"md",{},true,"\u002Fblog\u002Fhow-sites-get-hacked",7,{"title":5,"description":200},"blog\u002Fhow-sites-get-hacked",[210,211,212],"OWASP","веб-безопасность","аудит","P8Xwi1gnmEV0bPS1fFW8zYS0lNbBxz5UGcwz-o4d_Mk",[215,220],{"title":216,"path":217,"stem":218,"date":219,"children":-1},"Подмена Referer, Host и X-Forwarded-For: почему нельзя верить заголовкам","\u002Fblog\u002Fheader-trust","blog\u002Fheader-trust","2026-10-28",{"title":221,"path":222,"stem":223,"date":224,"children":-1},"Как чаще всего крадут криптовалюту: от сид-фразы до горячего кошелька обменника","\u002Fblog\u002Fhow-crypto-gets-stolen","blog\u002Fhow-crypto-gets-stolen","2026-10-26",[226,230,234],{"path":227,"title":228,"date":229},"\u002Fblog\u002Fphp-rce-october-2026","Две критические дыры в ядре PHP: почему обновляться нужно в тот же день","2026-10-30",{"path":231,"title":232,"date":233},"\u002Fblog\u002Fsql-injection","SQL-инъекции: как в 2026-м всё ещё воруют базы","2026-10-29",{"path":217,"title":216,"date":219},1793381757165]