Обновить
64K+

PHP *

Скриптовый язык общего назначения

61,64
Рейтинг
Сначала показывать
Порог рейтинга
Уровень сложности
Формат публикации

1040 Too many connections: как один JavaScript-цикл положил прод и почему Laravel-приложение не могло восстановиться

Уровень сложностиСредний
Время на прочтение17 мин
Охват и читатели4.4K

В середине обычного рабочего дня B2B-приложение, с которым работают наши партнёры, перестало обслуживать запросы. MariaDB исчерпала лимит подключений, пользователи получали HTTP 500, а за четыре минуты в журнал приложения упало около 20 тысяч ошибок.

Сначала всё выглядело как типичная проблема производительности базы. Расследование показало другое: толчком стал зациклившийся JavaScript в одной вкладке браузера. Но этот всплеск объясняет только начало аварии. Четыре минуты простоя обеспечило само приложение: обработчик ошибок записывал ошибки в уже недоступную базу, страница ошибки снова обращалась к той же базе, а Auth::check() при каждой неудаче пытался подключиться заново.

Ниже - как мы восстанавливали картину по логам Apache, Laravel и счётчикам MariaDB, какие версии не подтвердились, где мы сами ошибались по ходу анализа и что в итоге поменяли.

Читать далее

Внезапно, как всегда: (не)выученные уроки инцидента PHP2Shell

Уровень сложностиСредний
Время на прочтение11 мин
Охват и читатели11K

В конце октября вокруг PHP развернулась одна из самых громких дискуссий о безопасности open source этого года. Две критические уязвимости под общим именем PHP2Shell допускали удалённое выполнение кода без аутентификации, а их раскрытие сопровождалось утечками и спором между поставщиками. После первых дней громких заголовков в СМИ тревога успела смениться скепсисом. Пока одни участники сообщества яростно выясняли, почему исправления задержали, другие спрашивали: а не преувеличена ли вовсе опасность?

Разница в реакции была разительна. В Нидерландах из предосторожности отключили государственные порталы, а в Германии прикрыли сайты города Мюнстер и его онлайн-сервисы. Университет Хельсинки временно закрыл свой экземпляр образовательной платформы Moodle и несколько других сервисов, чтобы защитить пользовательские данные. Три дня спустя исследователь Джеймс Павур предложил взломать свой PHP-сервер и забрать биткоины примерно на 500 долларов. Его, наоборот, смущало, что громких предупреждений много, а сообщений о реальных жертвах мало. 

И всё же спор не сводится к тому, кто испугался сильнее. Как получилось, что об ошибке знали задолго до публикации, а выпуск исправления сопровождался утечками и разногласиями? И что остаётся выяснить тем пользователям, кто дождался исправлений?

Читать далее

AI для PHP‑разработчиков. Часть 8: Свёрточные нейронные сети: ищем границы на изображениях с помощью чистого PHP

Уровень сложностиСредний
Время на прочтение17 мин
Охват и читатели9.7K

Компьютер не видит фотографию так, как её видит человек. Для него изображение – это набор чисел, описывающих яркость и цвет отдельных пикселей. И чтобы научиться распознавать объекты, находить границы или определять визуальные признаки, нужно научиться работать с этими числами.

Для решения таких задач используются свёрточные нейронные сети (Convolutional Neural Networks, CNN). Они широко применяются в компьютерном зрении – от распознавания объектов до анализа медицинских изображений.

Одна из основных операций таких сетей – свёртка (convolution). С её помощью сеть анализирует небольшие участки изображения и обнаруживает локальные признаки: границы, линии, текстуры и другие структуры.

Но как именно это работает?

Читать далее

Анти Бот, часть 3: 10 миллионов запросов, 300 доменов и боты, которые ничего не делают

Уровень сложностиПростой
Время на прочтение8 мин
Охват и читатели8.7K

Посетитель пришел с рекламы в Директе. Открыл страницу. Сидит. Не крутит, не водит мышкой, не тыкает в экран. Через какое-то время уходит. Метрика честно записывает его в живые люди, рекламный кабинет честно списывает деньги за клик.

У нескольких наших клиентов таких "посетителей" оказалось до 30% от всего трафика с Директа. И это далеко не самое странное, что мы увидели, когда научили Анти Бот смотреть не только на то, откуда пришел посетитель, но и на то, как он себя ведет.

Рассказываю, как плагин для WordPress и модуль для 1С-Битрикс за три месяца и 10 миллионов трафика научились отличать людей от ботов без капчи для всех, и что интересного видно в трафике, когда смотришь сразу на сотни сайтов.

Читать далее

Один роутер, разные стратегии: NFQWS2 для ASUS и OpenWrt

Уровень сложностиПростой
Время на прочтение4 мин
Охват и читатели9.7K

В первой статье «Как я адаптировал nfqws2 для ASUS и добавил поддержку OpenWrt» я рассказал, как установить проект и настроить общую стратегию. Теперь покажу, как назначать разные стратегии устройствам, проверять результат и переносить удачные настройки. Всё ниже доступно в Build 99.

Читать далее

Место и роль Joomla в эпоху ИИ

Время на прочтение10 мин
Охват и читатели6.5K

Заголовок статьи – одновременно и вопрос и утверждение, а на место слова «Joomla», скорее всего, можно поставить почти любой цифровой продукт. Но в ходе размышлений попробуем всё-таки это место найти и вопросительный знак убрать. В статье отражён сугубо авторский, субъективный взгляд, который не претендует на отражение всей полноты мироздания.

Читать далее

Одна FAQPage на страницу: собираем разметку из видимых вопросов в WordPress

Уровень сложностиСредний
Время на прочтение7 мин
Охват и читатели4.5K

На одной странице нашего сайта (WordPress, финансовая тематика) разметка FAQPage содержала восемь вопросов, которых на самой странице не было. Среди них, например, «брокер поможет в 99% случаев». Посетитель этого не видел. Поисковики и нейросети, которые читают JSON-LD, видели прекрасно. Обещание, которое мы давно вычистили из текстов, спокойно жило в разметке.

Расскажу, откуда брались лишние схемы, как я оставил на странице ровно одну FAQPage и на что наступил по дороге. Код упрощён и обезличен, но рабочий.

Читать далее

Один запрос: 4 мс с литералами и 3 секунды из Laravel. Как плейсхолдеры в IN выключают loose index scan в MySQL

Уровень сложностиСредний
Время на прочтение6 мин
Охват и читатели5.1K

Наша панель для управления серверами хранит метрики в таблице server_metrics. В октябре в ней было 2,26 млн строк, и на проде страницы со списком серверов открывались по несколько секунд. Виноватым оказался один запрос. С подставленными значениями он выполнялся за 4-8 мс, а с биндингами, как его отправляет приложение, за 2,3-3,3 секунды.

Читать далее

Пожалуйста, зашифруй мой пароль

Уровень сложностиСредний
Время на прочтение10 мин
Охват и читатели13K

Признай, разработчик, ты же любишь отправлять пароль в теле POST‑запроса из формы входа открытым текстом, ведь «там же TLS, всё зашифровано»? Судя по тому что я вижу в интернете, эту традицию соблюдают многие, ИИ — не исключение. Одни продолжают запрашивать по сети пароли, прикрытые звёздочками, другие — используют одинаковый пароль в десятке различных сервисов. Даже Госуслуги не стали исключением.
В этой статье я кратко разобрал в чём проблема, кто виноват и что делать.

Читать далее

Кто разрешил эту кнопку или как не запутаться в правах доступа

Уровень сложностиПростой
Время на прочтение5 мин
Охват и читатели5.1K

Вы только что добавили новую кнопку в интерфейс. Заказчик просит: "Сделайте, чтобы только начальники смены её видели". Вы находите соответствующую группу в Bitrix и пишете проверку inGroup('НачальникСмены'). Кажется, задача решена.

Но через месяц появляются "Старшие мастера", которым тоже нужен этот доступ. Вы дописываете ||. Потом добавляется очередное условие. И еще, и еще, и еще... В итоге простая кнопка обрастает десятком строк логики, которая дублируется в разных компонентах.

Знакомая картина? Мы сталкивались с этим в каждом крупном проекте. Штатная система прав Bitrix отлично работает для коробочных модулей, но бессильна перед уникальной бизнес-логикой. Проверки групп "просачиваются" в код, делая его хрупким и непрозрачным.

Меня зовут Александр Костиков, я ведущий разработчик в НЛМК ИТ. В этой статье я покажу, как мы перестали "цементировать" бизнес-термины в коде и используем систему, где права меняются без правок в компонентах.

Если вы устали от проверок inGroup('СуперАдминистратор') - этот материал для вас.

Читать далее

Мы храним записи сессий: почему heatmap тяжелее, чем stack trace, и как из этого выросла политика retention

Уровень сложностиСредний
Время на прочтение4 мин
Охват и читатели6.3K

Из чего на самом деле состоит запись сессии, что в ней весит больше всего и почему историю ошибок нельзя удалять вместе с записями.

Привет! Я Паша, работаю над российским сервисом записи сессий пользователей Broux. Всё ниже основано на нашем опыте, со всеми его ограничениями.

Когда мы начинали, вопрос «сколько хранить» решался одной строкой в конфиге: всё живёт N дней, потом удаляется. Довольно быстро выяснилось, что эта строка одновременно слишком щедрая и слишком жадная.

Щедрая, потому что основное место занимали данные, которые через неделю почти никто не открывал. Жадная, потому что вместе с ними удалялось то, что как раз понадобилось бы через месяц. Расскажу, как мы это разделили и в каком месте до сих пор спорим.

Читать далее

Прежде чем дать AI-агенту доступ к сайту: права, повторы и потерянные правки

Уровень сложностиСредний
Время на прочтение13 мин
Охват и читатели7.8K

В нашей небольшой веб-студии решили попробовать передать AI-агентам часть рутинной работы с сайтами. Работаем мы в основном с MODX 2 и 3, поэтому мне поручили подобрать подходящий MCP-компонент. Задача выглядела несложной: посмотреть существующие решения, сравнить возможности и выбрать, что лучше подойдет.

Сначала я так и собирался сделать. Но потом полез в исходники и наткнулся на одну интересную вещь. В одном из компонентов был совершенно обычный PHP-цикл, который обновлял дополнительные поля страницы. Я решил проверить, что произойдет, если при сохранении возникнет ошибка. Первое поле записалось, второе нет, а обработчик завершил работу как ни в чем не бывало.

Вернулся к коду. Оказалось, результат setTVValue() просто никто не проверяет. Если агент получит сообщение об успешном выполнении команды, он будет считать, что все готово. Хотя на сайте могла сохраниться только половина изменений.

Читать далее

Контейнер новый, код старый: почему инцидент вернулся через три месяца

Уровень сложностиСредний
Время на прочтение5 мин
Охват и читатели8.1K

Есть в инфобезе сценарий, который повторяется с завидным постоянством. Инцидент вроде бы закрыли, отчитались, выдохнули — а через пару недель выясняется, что атакующий никуда не уходил. Он просто переждал. Именно так и произошло здесь, и именно поэтому эта история стоит того, чтобы её разобрать не по верхам, а по-настоящему.

Два сайта — appeal и new портал на 1С-Битрикс — несли один и тот же веб-шелл WebShellOrb (WSO). В первый раз инцидент обнаружили по логам Nginx, а вот дальше началось самое неприятное. Через некоторое время злоумышленник снова был внутри. Инцидент растянулся почти на три месяца, и повторная компрометация случилась уже после того, как были приняты меры.

И вот тут очень легко ошибиться в выводах. Соблазнительно сказать: «ну, значит, меры сделали плохо». Но это было бы неправдой. Дальше — почему меры не сработали и что оказалось «под капотом».

Читать далее

Ближайшие события

Две критические CVE в PHP и GitLab: уязвимости выходят быстрее, чем их успевают закрыть

Время на прочтение5 мин
Охват и читатели6.3K

Во второй половине октября две критические уязвимости в PHP и GitLab заставили компании по всему миру срочно обновлять серверы, а часть государственных и коммерческих сайтов на время ушла в офлайн. Обе позволяют выполнить код на сервере без авторизации, и обе затрагивают версии, выпущенные больше десяти лет назад.

Почему так произошло и что делать прямо сейчас — рассказываем в статье.

Читать далее

N+1 запросов в Laravel: как один foreach превращается в 101 SELECT и как это запретить

Время на прочтение3 мин
Охват и читатели5.7K

Страница со списком из 100 постов на проде тормозит, а в профайлере — сотня одинаковых лёгких запросов. Это N+1: разбираем, как Eloquent создаёт его через ленивую загрузку, как лечить через with() и withCount() и как запретить на уровне фреймворка через preventLazyLoading().

Читать далее

Старый софт на свежем Linux: свой GCC, свой OpenSSL и честный RPATH

Уровень сложностиСложный
Время на прочтение17 мин
Охват и читатели7K

А что если… нужен старый софт, но при этом хост Linux свежий?

Как вариант, можно взять, да хоть на примере питона, нужный официальный образ в докере. Да и пользоваться.

Казалось бы, проблема решена. Но есть нюанс (с). Добро пожаловать под кат.

Читать далее

[44.2026] Обзор новых правил безопасности в пакетных индексах и менеджерах

Время на прочтение3 мин
Охват и читатели5.8K

Hex расширил проверку зафиксированных зависимостей, Composer исправил утечки учётных данных, а pnpm, uv и rebar3 пересмотрели доверие к сертификатам после инцидента eMudhra.

Читать далее

chunk(), lazy() и cursor() в Laravel: замеры памяти и почему chunk() теряет половину строк при обновлении

Время на прочтение8 мин
Охват и читатели7.8K

Когда в Laravel нужно обработать большую таблицу, обычно советуют «не делать all(), использовать chunk()». Совет верный, но неполный: у chunk() есть ловушка, из-за которой фоновая задача тихо обрабатывает только часть строк. Ниже замеры пяти способов обхода таблицы на 100 000 строк, разбор потери строк и правила выбора метода.

Читать далее

N+1 в Eloquent: воспроизводим на стенде, считаем запросы и закрываем регрессии тестами

Время на прочтение14 мин
Охват и читатели5.6K

Про N+1 в Laravel обычно пишут три строки про with() и расходятся. Я собрал небольшой стенд на Laravel 13 и SQLite, воспроизвёл проблему, посчитал запросы для каждого способа лечения и проверил, что «не ловится» режимом запрета ленивой загрузки. Отдельно разобрал места, где eager loading не помогает или сам создаёт нагрузку. Все числа в статье получены на этом стенде на искусственных данных.

Читать далее

Пишу разбор демок CS2 на вахтах: Go‑парсер, ИИ без фантазий и грабли Laravel

Уровень сложностиСредний
Время на прочтение9 мин
Охват и читатели4.8K

Я работаю в авиации, езжу на вахты, у меня ипотека и семья — и по вечерам после смены пишу платформу для тренировок в CS2. Внутри: Go-парсер, который разбирает демку на 350 МБ за 4 секунды, ИИ-разбор, где факты считает код, а модель только объясняет, тактическая доска на Reverb и пачка граблей Laravel, которые стоили мне вечеров.

Читать далее
1
23 ...