Защита от CSRF в PHP
Подделка межсайтовых запросов (CSRF) — это уязвимость веб-безопасности, позволяющая злоумышленнику обманом заставить аутентифицированного пользователя выполнить нежелательные действия на сайте, на котором он в данный момент находится под своим логином. Атака осуществляется путем злоупотребления доверием сайта к браузеру пользователя.
Подделка межсайтовых запросов (CSRF) — это уязвимость веб-безопасности, позволяющая злоумышленнику обманом заставить аутентифицированного пользователя выполнить нежелательные действия на сайте, на котором он в данный момент находится под своим логином. Атака осуществляется путем злоупотребления доверием сайта к браузеру пользователя.
DEV Community
CSRF Protection in PHP
What is CSRF? Cross-Site Request Forgery (CSRF) is a web security vulnerability that...
👍2
#хочу_спросить
Задавайте любые вопросы о программировании и получайте ответы от пользователей. В комментариях под постом укажите #язык, #стек и/или #библиотеку, по которым задаете вопрос.
Задавайте любые вопросы о программировании и получайте ответы от пользователей. В комментариях под постом укажите #язык, #стек и/или #библиотеку, по которым задаете вопрос.
❤1
Большой пополняемый список знаний, в который включены теории, законы, принципы, паттерны разработки и многое другое, что однозначно будет полезно знать каждому разработчику.
GitHub
GitHub - dwmkerr/hacker-laws: 🧠 Laws, Theories, Principles and Patterns for developers and technologists.
🧠 Laws, Theories, Principles and Patterns for developers and technologists. - dwmkerr/hacker-laws
👍3
Как передаются переменные (по значению или по ссылке)?
В PHP переменные могут передаваться как по значению, так и по ссылке.
По умолчанию, в PHP переменные передаются по значению. Это означает, что когда переменная передается в функцию или присваивается другой переменной, создается ее копия, и любые изменения, сделанные внутри функции или на другой переменной, не влияют на оригинальную переменную.
Однако, PHP также предоставляет возможность передавать переменные по ссылке, используя символ '&' перед переменной при ее передаче в функцию или присваивании другой переменной. Когда переменная передается по ссылке, функция или другая переменная работают с тем же экземпляром переменной, и изменения внутри функции или на другой переменной отражаются на оригинальной переменной.
#вопросы_с_собеседований
В PHP переменные могут передаваться как по значению, так и по ссылке.
По умолчанию, в PHP переменные передаются по значению. Это означает, что когда переменная передается в функцию или присваивается другой переменной, создается ее копия, и любые изменения, сделанные внутри функции или на другой переменной, не влияют на оригинальную переменную.
Однако, PHP также предоставляет возможность передавать переменные по ссылке, используя символ '&' перед переменной при ее передаче в функцию или присваивании другой переменной. Когда переменная передается по ссылке, функция или другая переменная работают с тем же экземпляром переменной, и изменения внутри функции или на другой переменной отражаются на оригинальной переменной.
#вопросы_с_собеседований
👍13🥱3
Xdebug, работающий с Docker и PHP 8.4, за одну минуту
Настройка Xdebug может показаться сложной, но на самом деле её можно выполнить быстро, особенно если использовать Docker. В этой статье показано, как за несколько минут настроить Xdebug в проекте на Laravel с использованием PHP 8.4 и Xdebug 3.4.0.
Настройка Xdebug может показаться сложной, но на самом деле её можно выполнить быстро, особенно если использовать Docker. В этой статье показано, как за несколько минут настроить Xdebug в проекте на Laravel с использованием PHP 8.4 и Xdebug 3.4.0.
Laravel News
Get Xdebug Working With Docker and PHP 8.4 in One Minute - Laravel News
Xdebug has a history of being complex to get going, but I am here to show you how to use it in under a minute with Docker in a Laravel project.
👍4❤2
💬 Пишите ли вы тесты на свой код?
❤️ — всегда пишу тесты, которые покрывают важные места
👍 — иногда пишу, зависит от проекта
🥱 — еще не разбирался с тестами
❤️ — всегда пишу тесты, которые покрывают важные места
👍 — иногда пишу, зависит от проекта
🥱 — еще не разбирался с тестами
👍84🥱60❤40🎉3👾2
🙇♂️ Отобрать одного разраба на стек PHP + Vanilla JS после нескольких десятков созвонов-собеседований — вот они, современные реалии.
Почему выпускники курсов присылают резюме пачками, но выхлоп от обучения собственных юристов компании оказывается выше, чем от собеседований по вакансии?
— рассказывает Виталий Квитковский, руководитель отдела разработки и DevOps.
Под катом вас ждет:
☑️ Кратко о структуре собеседования.
☑️ Разбор задач.
☑️ Чего обычно не хватает джунам и как это добрать?
☑️ Что такое базовое программирование?
☑️ Как этому научиться?
👉 Читать
Почему выпускники курсов присылают резюме пачками, но выхлоп от обучения собственных юристов компании оказывается выше, чем от собеседований по вакансии?
— рассказывает Виталий Квитковский, руководитель отдела разработки и DevOps.
Под катом вас ждет:
☑️ Кратко о структуре собеседования.
☑️ Разбор задач.
☑️ Чего обычно не хватает джунам и как это добрать?
☑️ Что такое базовое программирование?
☑️ Как этому научиться?
👉 Читать
👍5😁2
Forwarded from Библиотека программиста | программирование, кодинг, разработка
👑🧟 Король спама: насколько сильно ты бесишь коллег в рабочих чатах
Признайся, ты тоже иногда отправляешь голосовые сообщения из маршрутки? Или может быть, ты тот самый человек, который пишет «Привет» и исчезает на час? Всего 10 вопросов, которые помогут понять, являешься ли ты мастером цифрового этикета или главным спамером офиса. Готов узнать правду?
👉 Пройти тест
Признайся, ты тоже иногда отправляешь голосовые сообщения из маршрутки? Или может быть, ты тот самый человек, который пишет «Привет» и исчезает на час? Всего 10 вопросов, которые помогут понять, являешься ли ты мастером цифрового этикета или главным спамером офиса. Готов узнать правду?
👉 Пройти тест
❤2👍1😁1👾1
Forwarded from Библиотека программиста | программирование, кодинг, разработка
🍎 Подборка лучших статей «Библиотеки программиста» за ноябрь: сохраняй в заметки, чтобы не пропустить #самыйсок
✌️🆚⚛️ Vite vs Create React App: почему разработчики массово переходят на новый инструмент
⚛️ 8 важнейших аспектов JavaScript, которые нужно освоить до изучения React
🔀 Команды git merge и git rebase: преимущества, недостатки и ключевые различия
👾🔍 Укрощение монстров: мониторинг и управление ресурсоемкими запросами в Django + PostgreSQL
🚀 Как ускорить распределенные системы: 8 стратегий снижения времени ожидания
🧪 Успешное тестирование: основы и передовые приемы Jest. Часть 1
👨💻🚀 Тест: насколько ты продвинутый разраб?
✌️🆚⚛️ Vite vs Create React App: почему разработчики массово переходят на новый инструмент
⚛️ 8 важнейших аспектов JavaScript, которые нужно освоить до изучения React
🔀 Команды git merge и git rebase: преимущества, недостатки и ключевые различия
👾🔍 Укрощение монстров: мониторинг и управление ресурсоемкими запросами в Django + PostgreSQL
🚀 Как ускорить распределенные системы: 8 стратегий снижения времени ожидания
🧪 Успешное тестирование: основы и передовые приемы Jest. Часть 1
👨💻🚀 Тест: насколько ты продвинутый разраб?
👍1
Оптимизированная ленивая загрузка в Symfony Doctrine для повышения производительности
Во время работы над проектом Symfony возникла проблема с производительностью из-за неожиданного поведения Doctrine. В одной из сущностей была настроена связь OneToOne с параметром
Проблема
Пример: сущность
Усложнённые запросы: ненужные операции JOIN увеличивали нагрузку на базу данных.
Избыточное использование памяти: данные загружались в память даже при их ненужности.
Замедление работы API: запросы, возвращающие списки магазинов, замедлялись из-за лишних данных.
Решение
1. Перепроектирование связи
Связь была преобразована из OneToOne в ManyToOne. Теперь
2. Обновление схемы базы данных
С помощью Doctrine Migrations была изменена структура базы данных: старый внешний ключ для связи OneToOne был удалён, и добавлен ключ для ManyToOne.
3. Корректировка запросов
Теперь детали магазина загружаются только по необходимости
4. Профилирование
С помощью инструментов Symfony была подтверждена оптимизация. Теперь связанные сущности не загружаются без явного запроса.
Результаты
🟢Скорость выполнения запросов: уменьшилась в среднем на 35%.
🟢Использование памяти: значительно сократилось, так как избыточные данные больше не загружаются.
🟢Время ответа API: улучшилось на 20–30% для запросов с большими объёмами данных.
👉Ссылка на Medium
Во время работы над проектом Symfony возникла проблема с производительностью из-за неожиданного поведения Doctrine. В одной из сущностей была настроена связь OneToOne с параметром
fetch="LAZY»
, чтобы загружать связанные данные только при необходимости. Однако Doctrine загружал связанные сущности заранее, что приводило к избыточной нагрузке.Проблема
Пример: сущность
Store
имела связь OneToOne с сущностью StoreDetail
, содержащей метаданные о магазине. Даже при включённой ленивой загрузке Doctrine автоматически добавлял JOIN, что влияло на производительность:Усложнённые запросы: ненужные операции JOIN увеличивали нагрузку на базу данных.
Избыточное использование памяти: данные загружались в память даже при их ненужности.
Замедление работы API: запросы, возвращающие списки магазинов, замедлялись из-за лишних данных.
Решение
1. Перепроектирование связи
Связь была преобразована из OneToOne в ManyToOne. Теперь
StoreDetail
ссылался на Store
, что позволило Doctrine корректно применять ленивую загрузку.2. Обновление схемы базы данных
С помощью Doctrine Migrations была изменена структура базы данных: старый внешний ключ для связи OneToOne был удалён, и добавлен ключ для ManyToOne.
3. Корректировка запросов
Теперь детали магазина загружаются только по необходимости
4. Профилирование
С помощью инструментов Symfony была подтверждена оптимизация. Теперь связанные сущности не загружаются без явного запроса.
Результаты
🟢Скорость выполнения запросов: уменьшилась в среднем на 35%.
🟢Использование памяти: значительно сократилось, так как избыточные данные больше не загружаются.
🟢Время ответа API: улучшилось на 20–30% для запросов с большими объёмами данных.
👉Ссылка на Medium
🥱10👍3🤔3❤1
❗Вакансии «Библиотеки программиста» — ждем вас в команде!
Мы постоянно растем и развиваемся, поэтому создали отдельную страницу, на которой будут размещены наши актуальные вакансии. Сейчас мы ищем:
👉контент-менеджеров для ведения телеграм-каналов
Подробности тут
Мы предлагаем частичную занятость и полностью удаленный формат работы — можно совмещать с основной и находиться в любом месте🌴
Ждем ваших откликов 👾
Мы постоянно растем и развиваемся, поэтому создали отдельную страницу, на которой будут размещены наши актуальные вакансии. Сейчас мы ищем:
👉контент-менеджеров для ведения телеграм-каналов
Подробности тут
Мы предлагаем частичную занятость и полностью удаленный формат работы — можно совмещать с основной и находиться в любом месте🌴
Ждем ваших откликов 👾
job.proglib.io
Вакансии в медиа «Библиотека программиста»
Количество проектов в редакции постоянно растет, так что нам всегда нужны специалисты
ResultTransformer в Symfony проектах
Symfony со стандартным набором возможностей представляет собой мощное и универсальное решение, способное справляться с широким спектром бизнес-задач. Существует подход, который известен далеко не каждому разработчику на Symfony, а если и известен, то чаще всего поверхностно и редко применяется на практике. Настало время подробнее рассмотреть эту менее известную, но интересную сторону фреймворка.
Один из таких подходов связан с использованием функциональности Doctrine, позволяющей возвращать готовые DTO, что избавляет разработчика от ручной работы по преобразованию данных. Этот процесс, известный как ResultTransformer, автоматизирует преобразование данных в DTO, значительно упрощая задачу программиста.
Однако, стоит учитывать, что этот метод имеет ряд ограничений. Он может оказаться избыточным и подходит далеко не для всех случаев. Применение подхода целесообразно лишь в определённых сценариях, где его преимущества действительно оправданы.
Symfony со стандартным набором возможностей представляет собой мощное и универсальное решение, способное справляться с широким спектром бизнес-задач. Существует подход, который известен далеко не каждому разработчику на Symfony, а если и известен, то чаще всего поверхностно и редко применяется на практике. Настало время подробнее рассмотреть эту менее известную, но интересную сторону фреймворка.
Один из таких подходов связан с использованием функциональности Doctrine, позволяющей возвращать готовые DTO, что избавляет разработчика от ручной работы по преобразованию данных. Этот процесс, известный как ResultTransformer, автоматизирует преобразование данных в DTO, значительно упрощая задачу программиста.
Однако, стоит учитывать, что этот метод имеет ряд ограничений. Он может оказаться избыточным и подходит далеко не для всех случаев. Применение подхода целесообразно лишь в определённых сценариях, где его преимущества действительно оправданы.
Хабр
ResultTransformer в Symfony проектах
Symfony со стандартным набором «батареек» представляет из себя монструозное решение, способное реализовать если и не любые, то очень многие задачи бизнеса. Поделюсь подходом, о котором...
👍4
Forwarded from Библиотека собеса по PHP | вопросы с собеседований
[Git] Зачем команда git bundle?
Команда
Основные случаи использования git bundle:
1. Передача репозитория офлайн:
Если репозиторий большой, но доступ к сети отсутствует, можно создать файл с полным содержимым репозитория и передать его через USB-накопитель или другое физическое устройство.
2.Обновление репозитория офлайн:
Если нужно синхронизировать изменения между двумя репозиториями без доступа к сети, можно упаковать изменения в bundle и передать его.
3. Создание резервной копии:
4. Доставка изменений:
Это удобный способ передать патчи или ветки, которые можно позже интегрировать в другой репозиторий.
Примеры использования:
Создание полного архива репозитория:
Здесь флаг
Упаковка определённой ветки:
Это создаст архив с содержимым только ветки main.
Проверка содержимого bundle:
Проверяет, что файл корректен и пригоден для использования.
Клонирование из bundle:
Команда
git bundle
используется для упаковки репозитория или его части в один файл. Этот файл можно передать, скопировать или сохранить, а затем использовать для восстановления или обновления репозитория в другом месте. Основное назначение этой команды — перенос изменений без необходимости наличия сетевого подключения, например, в случаях, когда доступ к удалённому репозиторию ограничен.Основные случаи использования git bundle:
1. Передача репозитория офлайн:
Если репозиторий большой, но доступ к сети отсутствует, можно создать файл с полным содержимым репозитория и передать его через USB-накопитель или другое физическое устройство.
2.Обновление репозитория офлайн:
Если нужно синхронизировать изменения между двумя репозиториями без доступа к сети, можно упаковать изменения в bundle и передать его.
3. Создание резервной копии:
git bundle
может использоваться для создания архива репозитория с сохранением всей истории.4. Доставка изменений:
Это удобный способ передать патчи или ветки, которые можно позже интегрировать в другой репозиторий.
Примеры использования:
Создание полного архива репозитория:
git bundle create my-repo.bundle --all
Здесь флаг
--all
указывает, что нужно упаковать все ветки и историю.Упаковка определённой ветки:
git bundle create my-feature.bundle main
Это создаст архив с содержимым только ветки main.
Проверка содержимого bundle:
git bundle verify my-repo.bundle
Проверяет, что файл корректен и пригоден для использования.
Клонирование из bundle:
git clone my-repo.bundle my-new-repo
❤14🔥7👍4
Написание высококачественных тестов
В статье обсуждается важность написания качественных тестов и подчеркивается, что их часто недооценивают. Автор отмечает, что разработчики нередко просто проверяют наличие тестов, вместо того чтобы уделять внимание их качеству. Это может приводить к проблемам: тесты оказываются ненадежными, сложными для понимания или слишком долгими в выполнении.
Минимализм в тестах
Рекомендуется писать тесты минимального размера, содержащие только необходимый код. Это упрощает их понимание в будущем. Тест должен быть максимально лаконичным, но при этом полностью завершённым.
Стремление к 100% покрытию кода
Автор критикует подход, при котором допускается, например, 90% покрытие, так как это создает иллюзию надежности. Вместо этого предлагается избегать ненужного кода (например, геттеров и сеттеров, которые не используются) и исключать из анализа строки, которые невозможно покрыть тестами.
Написание качественных проверок (assertions)
Тесты пишутся для проверки поведения кода, и правильная формулировка проверок имеет решающее значение. Подчеркивается важность понятных сообщений об ошибках, которые помогают быстро разобраться в проблеме. Он критикует использование слишком общих проверок, которые затрудняют диагностику, и рекомендует выбирать подходящие инструменты, такие как специализированные проверки в PHPUnit.
Снапшот-тестирование
Автор также обсуждает методику снапшот-тестирования, которая часто используется в фронтенд-разработке. Она фиксирует текущее состояние компонентов и позволяет быстро выявить изменения. Однако метод имеет недостатки, такие как хрупкость тестов и неочевидность их намерений.
Рекомендации
Для улучшения тестирования автор советует:
🔸Упрощать код тестов, оставляя только необходимое.
🔸Стремиться к 100% покрытию кода, исключая из анализа непокрываемые участки.
🔸Использовать правильные проверки, которые дают понятные сообщения об ошибках.
В статье обсуждается важность написания качественных тестов и подчеркивается, что их часто недооценивают. Автор отмечает, что разработчики нередко просто проверяют наличие тестов, вместо того чтобы уделять внимание их качеству. Это может приводить к проблемам: тесты оказываются ненадежными, сложными для понимания или слишком долгими в выполнении.
Минимализм в тестах
Рекомендуется писать тесты минимального размера, содержащие только необходимый код. Это упрощает их понимание в будущем. Тест должен быть максимально лаконичным, но при этом полностью завершённым.
Стремление к 100% покрытию кода
Автор критикует подход, при котором допускается, например, 90% покрытие, так как это создает иллюзию надежности. Вместо этого предлагается избегать ненужного кода (например, геттеров и сеттеров, которые не используются) и исключать из анализа строки, которые невозможно покрыть тестами.
Написание качественных проверок (assertions)
Тесты пишутся для проверки поведения кода, и правильная формулировка проверок имеет решающее значение. Подчеркивается важность понятных сообщений об ошибках, которые помогают быстро разобраться в проблеме. Он критикует использование слишком общих проверок, которые затрудняют диагностику, и рекомендует выбирать подходящие инструменты, такие как специализированные проверки в PHPUnit.
Снапшот-тестирование
Автор также обсуждает методику снапшот-тестирования, которая часто используется в фронтенд-разработке. Она фиксирует текущее состояние компонентов и позволяет быстро выявить изменения. Однако метод имеет недостатки, такие как хрупкость тестов и неочевидность их намерений.
Рекомендации
Для улучшения тестирования автор советует:
🔸Упрощать код тестов, оставляя только необходимое.
🔸Стремиться к 100% покрытию кода, исключая из анализа непокрываемые участки.
🔸Использовать правильные проверки, которые дают понятные сообщения об ошибках.
🤩1
«Я создал одно и то же приложение на всех версиях PHP (1995-2025)»
Здесь автор создает приложение на PHP 2 и постепенно улучшает его, параллельно рассказывая о нововведениях каждой вышедшей версии языка. Интересное видео на вечер
Здесь автор создает приложение на PHP 2 и постепенно улучшает его, параллельно рассказывая о нововведениях каждой вышедшей версии языка. Интересное видео на вечер
👍12🔥2👏1😁1
Использование технологии withoutWrapping для сглаживания ответов API
Ресурсы API Laravel по умолчанию оборачивают ответы в ключ 'data'. Хоть это и полезно для многих сценариев, иногда требуется более плоская структура ответа, и тогда вы можете отключить обертывание ресурсов.
Ресурсы API Laravel по умолчанию оборачивают ответы в ключ 'data'. Хоть это и полезно для многих сценариев, иногда требуется более плоская структура ответа, и тогда вы можете отключить обертывание ресурсов.
👍8❤2👾1