[{"data":1,"prerenderedAt":204},["ShallowReactive",2],{"blog:\u002Fblog\u002Fsql-injection":3,"blog-around:\u002Fblog\u002Fsql-injection":186,"blog-others:\u002Fblog\u002Fsql-injection":197},{"id":4,"title":5,"body":6,"cover":170,"date":171,"description":172,"draft":173,"extension":174,"meta":175,"navigation":176,"path":177,"readingMinutes":178,"seo":179,"stem":180,"tags":181,"updated":170,"__hash__":185},"blog\u002Fblog\u002Fsql-injection.md","SQL-инъекции: как в 2026-м всё ещё воруют базы",{"type":7,"value":8,"toc":161},"minimark",[9,21,26,29,32,36,39,46,52,58,64,68,71,87,90,94,100,106,112,118,124,130,134,137],[10,11,12,13,20],"p",{},"SQL-инъекции известны больше двадцати лет. О них пишут в каждом учебнике, против них есть готовые инструменты в любом современном фреймворке. И всё же «инъекции» по-прежнему входят в ",[14,15,19],"a",{"href":16,"rel":17},"https:\u002F\u002Fowasp.org\u002FTop10\u002F",[18],"nofollow","OWASP Top 10"," — список самых значимых рисков веб-приложений, где инъекциям посвящена отдельная категория (в редакции 2021 года — A03 Injection). Причина простая: уязвимость появляется не от незнания, а от спешки.",[22,23,25],"h2",{"id":24},"механизм-простыми-словами","Механизм простыми словами",[10,27,28],{},"Сайт общается с базой данных на языке SQL. Когда клиент ищет свою заявку, приложение формирует запрос вроде «найди заявку с таким-то номером». Если номер берётся из адресной строки или формы и вклеивается в текст запроса как есть, у посетителя появляется возможность дописать в этот текст свои команды.",[10,30,31],{},"Представьте бланк, в котором клерк вписывает ваше имя в заранее подготовленное распоряжение. Если вместо имени написать «Иванов. А также выдать ему ключи от сейфа», а клерк перепишет это не глядя — распоряжение изменит смысл. База данных и есть такой исполнительный клерк: она выполняет то, что получила, и не отличает данные от команд.",[22,33,35],{"id":34},"где-инъекции-прячутся-в-обменниках","Где инъекции прячутся в обменниках",[10,37,38],{},"В типичном обменном пункте опасные места почти всегда одни и те же.",[10,40,41,45],{},[42,43,44],"strong",{},"Фильтры заявок."," Оператору нужно искать заявки по дате, статусу, сумме, валюте. Чем больше фильтров, тем выше соблазн собрать условие запроса «склейкой строк».",[10,47,48,51],{},[42,49,50],{},"Параметры сортировки."," Название поля для сортировки нельзя передать в базу как обычный параметр, поэтому его часто подставляют в запрос напрямую. Это одно из самых частых мест, где инъекция переживает даже аккуратный в остальном код.",[10,53,54,57],{},[42,55,56],{},"Поиск в админке."," Админку видят «только свои», поэтому её проверяют хуже. Но если злоумышленник получил доступ оператора — через фишинг или утёкший пароль — уязвимый поиск в админке становится дверью ко всей базе.",[10,59,60,63],{},[42,61,62],{},"«Быстрые доработки»."," Срочный отчёт для владельца, выгрузка для бухгалтерии, разовый скрипт сверки резервов. Такие вещи пишутся за вечер, мимо обычного ревью, и часто содержат «сырые» запросы.",[22,65,67],{"id":66},"чем-это-грозит","Чем это грозит",[10,69,70],{},"Последствия зависят от того, какие права у учётной записи базы данных, с которой работает приложение. В худшем случае злоумышленник может:",[72,73,74,78,81,84],"ul",{},[75,76,77],"li",{},"выгрузить всю базу: контакты клиентов, историю операций, документы KYC;",[75,79,80],{},"изменить данные — балансы, статусы заявок, реквизиты для выплат;",[75,82,83],{},"подменить адреса кошельков, на которые клиенты отправляют средства;",[75,85,86],{},"в некоторых конфигурациях — получить доступ к файлам сервера.",[10,88,89],{},"Утечка KYC-данных — это не только репутационный удар. Это вопросы от регуляторов и банков-партнёров, а для клиентов — риск того, что их документы всплывут в мошеннических схемах.",[22,91,93],{"id":92},"что-защищает-по-настоящему","Что защищает по-настоящему",[10,95,96,99],{},[42,97,98],{},"Подготовленные выражения и ORM."," Главная мера: данные передаются в базу отдельно от текста запроса. В Laravel это Eloquent и Query Builder с параметрами, в чистом PHP — PDO с плейсхолдерами. Когда данные и команды разделены, «дописать команду» становится невозможно.",[10,101,102,105],{},[42,103,104],{},"Белые списки для сортировки и полей."," Там, где параметр нельзя передать отдельно — имя колонки, направление сортировки, — приложение должно сверять значение со списком разрешённых. Пришло что-то не из списка — используем значение по умолчанию.",[10,107,108,111],{},[42,109,110],{},"Минимальные права пользователя БД."," Учётной записи сайта не нужны права на удаление таблиц или чтение системных таблиц. Отчётам, которые только читают, — отдельный пользователь только на чтение. Тогда даже успешная инъекция даст меньше, чем могла бы.",[10,113,114,117],{},[42,115,116],{},"WAF — ремень безопасности, а не подушка."," Межсетевой экран для веб-приложений отсекает массовые автоматические атаки и выигрывает время. Но он не заменяет исправный код: правила WAF обходятся, а уязвимость в коде остаётся.",[10,119,120,123],{},[42,121,122],{},"Ревью и статический анализ."," Каждое изменение, которое касается запросов к базе, должен посмотреть второй человек. Инструменты статического анализа (SAST) умеют находить «склейку строк» в запросах автоматически — их стоит включить в CI, чтобы опасный код не доезжал до сервера.",[10,125,126,129],{},[42,127,128],{},"Мониторинг аномальных запросов."," Журнал ошибок базы данных — ценный источник сигналов. Всплеск синтаксических ошибок SQL от одного IP почти всегда означает, что кто-то подбирает инъекцию прямо сейчас.",[22,131,133],{"id":132},"почему-это-всё-ещё-работает","Почему это всё ещё работает",[10,135,136],{},"Инъекции живут не в основном коде, который писали внимательно, а на окраинах: в старых модулях, разовых скриптах, «временных» отчётах, которые стали постоянными. Поэтому защита — это не одна библиотека, а дисциплина: единые правила работы с базой, ревью без исключений и регулярная проверка того, что уже написано.",[138,139,140,143],"blockquote",{},[10,141,142],{},"SQL-инъекция — это ошибка процесса, а не нехватка знаний. Закрывается она тоже процессом.",[144,145,146,149,152,155,158],"ol",{},[75,147,148],{},"Только подготовленные выражения или ORM — без исключений для «быстрых» скриптов.",[75,150,151],{},"Белые списки для имён полей и направлений сортировки.",[75,153,154],{},"Отдельные пользователи БД с минимальными правами для сайта, отчётов и админки.",[75,156,157],{},"Ревью и SAST в CI для всего, что касается запросов.",[75,159,160],{},"WAF и мониторинг ошибок SQL — как дополнительный слой, а не как основная защита.",{"title":162,"searchDepth":163,"depth":163,"links":164},"",2,[165,166,167,168,169],{"id":24,"depth":163,"text":25},{"id":34,"depth":163,"text":35},{"id":66,"depth":163,"text":67},{"id":92,"depth":163,"text":93},{"id":132,"depth":163,"text":133},null,"2026-10-29","Старейшая веб-уязвимость никуда не делась. Где она прячется в обменниках, чем грозит владельцу и какие меры защищают по-настоящему.",false,"md",{},true,"\u002Fblog\u002Fsql-injection",6,{"title":5,"description":172},"blog\u002Fsql-injection",[182,183,184],"SQL","OWASP","базы данных","Ewgw6pwsHBSifXP_9YIPmq8JN5ijPv2QySrHyj25cJw",[187,192],{"title":188,"path":189,"stem":190,"date":191,"children":-1},"Две критические дыры в ядре PHP: почему обновляться нужно в тот же день","\u002Fblog\u002Fphp-rce-october-2026","blog\u002Fphp-rce-october-2026","2026-10-30",{"title":193,"path":194,"stem":195,"date":196,"children":-1},"Подмена Referer, Host и X-Forwarded-For: почему нельзя верить заголовкам","\u002Fblog\u002Fheader-trust","blog\u002Fheader-trust","2026-10-28",[198,199,200],{"path":189,"title":188,"date":191},{"path":194,"title":193,"date":196},{"path":201,"title":202,"date":203},"\u002Fblog\u002Fhow-sites-get-hacked","Как чаще всего взламывают сайты: семь дверей, которые забывают закрыть","2026-10-27",1793381757141]