PHP | Вопросы собесов
2.32K subscribers
35 photos
1.51K links
Сайт: https://easyoffer.ru/
Все каналы: t.me/+xGeAw6ckJ4liYzQy

Контакт для рекламы: @easyoffer_adv
Download Telegram
🤔 Что такое абстрагирование?

Это принцип программирования и проектирования, который позволяет выделить важные характеристики объекта или системы и скрыть их сложные детали. Основная цель абстрагирования – упростить сложные системы, делая их более понятными и управляемыми, сосредоточив внимание на их основных аспектах и поведении.

🚩Зачем нужно абстрагирование

🟠Снижение сложности
Сокращает количество деталей, с которыми нужно работать, что облегчает понимание и работу с системой.

🟠Повышение читаемости кода
Упрощает код, делая его более читаемым и легким для поддержки.

🟠Повторное использование кода
Создаёт возможность повторного использования общих функций и логики.

🟠Инкапсуляция
Позволяет скрывать реализацию и представлять только необходимые интерфейсы для взаимодействия.

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

🚩Как используется абстрагирование

Абстрагирование в программировании часто реализуется через классы и интерфейсы. Ниже приведены примеры абстракции в объектно-ориентированном программировании (ООП).

🚩Пример абстракции с использованием классов и интерфейсов

🟠Интерфейс
Определяет набор методов, которые должны быть реализованы, не указывая, как именно они должны быть реализованы.
interface Shape {
public function draw();
}


🟠Классы, реализующие интерфейс
Реализуют методы, определённые в интерфейсе.
class Circle implements Shape {
public function draw() {
echo "Drawing a circle";
}
}

class Square implements Shape {
public function draw() {
echo "Drawing a square";
}
}


Использование абстракции
function renderShape(Shape $shape) {
$shape->draw();
}

$circle = new Circle();
$square = new Square();

renderShape($circle); // Вывод: Drawing a circle
renderShape($square); // Вывод: Drawing a square


🚩Плюсы и минусы

➕Снижение сложности
Абстракция скрывает сложные детали реализации, облегчая работу с системой.
➕Улучшение читаемости
Код становится более понятным и структурированным.
➕Гибкость и расширяемость
Облегчает добавление новых функций и изменений.
➕Повторное использование
Позволяет использовать общий код в разных частях программы.
➖Избыточность
Иногда может приводить к избыточной сложности, если абстракции слишком сложные или используются неправильно.
➖Накладные расходы
Может потребоваться больше времени и усилий на создание абстракций и их поддержку.

Ставь 👍 и забирай 📚 Базу знаний
🤔 Как устроен типичный тест на opening point?

Тест на Opening Point (OP-тест) используется для проверки скорости, с которой игрок или программа находят критически важное первое решение в задаче. Такой тест чаще всего применяется в шахматах, игровых стратегиях, а также в программировании при оценке эвристик.

🚩Как устроен тест на Opening Point?

🟠Задаётся начальная позиция или состояние
Например, шахматная позиция, игровая ситуация или входные данные для алгоритма.

🟠Требуется найти оптимальный (или хороший) первый шаг
В шахматах это может быть лучший ход. В алгоритмах — первое удачное разбиение задачи.

🟠Замеряется время и корректность ответа
Важно, насколько быстро испытуемый (или программа) нашёл первый ход. Проверяется, соответствует ли он эталону (оптимальному решению).

🚩Пример из шахмат

В шахматах Opening Point тест оценивает, насколько быстро игрок или движок могут найти правильный ход в дебюте. Например:
> Позиция:
> 1. e4 e5
> 2. Nf3 Nc6
> 3. Bb5 a6
> 4. ?
Ожидаемый ход: Ba4 (Испанская партия).
Программа должна как можно быстрее выбрать этот ход, а тест фиксирует время поиска.

🚩Пример из программирования

Допустим, у нас есть массив чисел, и нужно быстро найти первый элемент, который удовлетворяет определённому условию.
function findOpeningPoint($arr, $condition) {
foreach ($arr as $item) {
if ($condition($item)) {
return $item;
}
}
return null; // Если не найдено
}

$array = [1, 3, 7, 10, 15];
$condition = fn($x) => $x > 5;

echo findOpeningPoint($array, $condition); // Выведет 7


Ставь 👍 и забирай 📚 Базу знаний
🤔 Что известно о Unit-тестах?

Это тесты, проверяющие отдельные единицы кода (обычно функции, методы или классы) в изоляции от внешних зависимостей.
Особенности:
- Быстрые, запускаются локально.
- Должны быть предсказуемыми и детерминированными.
- Не используют базу данных, сеть или файловую систему (для этого есть интеграционные и e2e-тесты).
- Помогают отлавливать баги на раннем этапе и облегчают рефакторинг.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
🤔 В чем отличие между двойным и тройным равно?

🚩Примеры разницы между `==` и `===`

Сравнение чисел и строк
var_dump(5 == "5");  // ✅ true (PHP приводит строку "5" к числу 5)
var_dump(5 === "5"); // ❌ false (5 - это int, "5" - это string)


Сравнение true и false
var_dump(0 == false);  // ✅ true  (0 считается как false)
var_dump(0 === false); // ❌ false (0 - это int, а false - это bool)


Сравнение null
var_dump(null == false);  // ✅ true  (PHP считает null как false)
var_dump(null === false); // ❌ false (null != boolean)


Ставь 👍 и забирай 📚 Базу знаний
👍1
🤔 Что такое вертикальное и масштабирование в БД?

Это два метода повышения производительности и пропускной способности баз данных.

🚩Вертикальное масштабирование (Vertical Scaling)

Вертикальное масштабирование, также известное как масштабирование "вверх" (scale up), предполагает улучшение производительности базы данных за счет увеличения ресурсов на одном сервере. Это может включать: Добавление большего объема оперативной памяти (RAM), Увеличение мощности процессора (CPU), Увеличение объема хранилища (SSD или HDD), Использование более быстрого сетевого оборудования

🟠Плюсы и минусы
➕Простота реализации
Легко выполнить, поскольку не требует изменения архитектуры приложения.
➕Единая точка управления
Администрирование базы данных проще, так как все данные находятся на одном сервере.
➖Ограничения оборудования
Есть пределы, до которых можно увеличивать ресурсы на одном сервере.
➖Единая точка отказа
Если сервер выходит из строя, вся база данных становится недоступной.

🟠Пример
Допустим, у вас есть сервер с 16 ГБ оперативной памяти и 4-ядерным процессором. Вертикальное масштабирование может включать замену его на сервер с 64 ГБ оперативной памяти и 16-ядерным процессором.

Ставь 👍 и забирай 📚 Базу знаний
🤔 Что такое namespaces?

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

🚩Зачем они нужны?

🟠Избежание конфликтов имен
В больших проектах могут быть сотни классов, функций и констант. Пространства имен помогают избежать ситуаций, когда разные части кода используют одинаковые имена.

🟠Упрощение организации кода
Они позволяют группировать связанные классы, интерфейсы, функции и константы, что делает код более читаемым и поддерживаемым.

🟠Упрощение автозагрузки
Пространства имен облегчают использование автозагрузчиков, таких как PSR-4, где классы и файлы организованы в соответствии с их пространствами имен.

🚩Как их использовать?

Для использования пространств имен, нужно объявить их в начале файла с помощью ключевого слова namespace.
<?php
namespace MyProject\Models;

class User {
public function getName() {
return "John Doe";
}
}
?>

Теперь класс User находится в пространстве имен MyProject\Models. Чтобы использовать этот класс в другом файле, нужно указать его полное имя:
<?php
require 'User.php';

$user = new \MyProject\Models\User();
echo $user->getName();
?>

Можно также использовать ключевое слово use для упрощения кода:
<?php
require 'User.php';

use MyProject\Models\User;

$user = new User();
echo $user->getName();
?>

Пространства имен могут содержать не только классы, но и функции и константы:
<?php
namespace MyProject\Utils;

const PI = 3.14;

function calculateCircleArea($radius) {
return PI * $radius * $radius;
}
?>

Использование этих элементов будет аналогичным:
<?php
require 'Utils.php';

echo \MyProject\Utils\calculateCircleArea(5);
echo \MyProject\Utils\PI;
?>


Ставь 👍 и забирай 📚 Базу знаний
🤔 Какую проблему решают фабрика и фабричный метод?

Фабрика и фабричный метод решают проблему создания объектов в программе, отделяя процесс их создания от бизнес-логики. Это помогает сделать код более гибким, давая возможность изменять способ создания объектов без изменения основного кода. Эти паттерны используются для улучшения тестируемости, расширяемости и поддерживаемости программы.

Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
🤔 Что такое acid?

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

🟠Атомарность (Atomicity)

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

🟠Согласованность (Consistency)

Означает, что каждая транзакция переводит базу данных из одного согласованного состояния в другое. Согласованность обеспечивает соблюдение всех правил и ограничений базы данных, таких как ключи, ограничения целостности и триггеры, после завершения транзакции.

🟠Изолированность (Isolation)
Определяет способ одновременного выполнения множества транзакций без оказания влияния друг на друга. Это свойство предотвращает проблемы, связанные с одновременным доступом, такие как "грязное чтение", "неповторяющееся чтение" и "фантомное чтение". СУБД обычно предлагают различные уровни изоляции, которые могут быть настроены в зависимости от нужд приложения.

🟠Долговечность (Durability)
Гарантирует, что как только транзакция была подтверждена, все изменения, сделанные транзакцией, сохраняются и остаются в базе данных даже в случае сбоя, например, при потере питания. Это означает, что система должна сохранять все записи в надежное, неизменяемое хранилище.

Ставь 👍 и забирай 📚 Базу знаний
🤔 Слово "global" для чего используется?

Ключевое слово global используется в PHP для доступа к глобальным переменным внутри функций.

🚩Как работает `global`?

Доступ к глобальной переменной внутри функции
$counter = 10; // Глобальная переменная

function increment() {
global $counter; // Доступ к глобальной переменной
$counter++;
}

increment();
echo $counter; // ✅ 11


Использование нескольких глобальных переменных
$a = 5;
$b = 10;

function sum() {
global $a, $b;
$b = $a + $b; // Меняем глобальную переменную $b
}

sum();
echo $b; // ✅ 15


🟠Альтернативный способ – `$GLOBALS`
Можно использовать суперглобальный массив $GLOBALS, который хранит все глобальные переменные.
$x = 3;
$y = 7;

function multiply() {
$GLOBALS['y'] = $GLOBALS['x'] * $GLOBALS['y'];
}

multiply();
echo $y; // ✅ 21


🚩Когда `global` – плохая идея?

Глобальные переменные усложняют отладку (их можно случайно изменить).
Функции становятся зависимыми от внешних данных (плохо для тестирования).
Лучше передавать переменные через аргументы функции.
Альтернативный способ (без global)
function increment($counter) {
return $counter + 1;
}

$counter = 10;
$counter = increment($counter);
echo $counter; // ✅ 11


Ставь 👍 и забирай 📚 Базу знаний
👍1
🤔 В чем разница между вертикальным и горизонтальным масштабированием?

Масштабирование (scaling) — это процесс увеличения мощности системы, чтобы она справлялась с увеличенной нагрузкой. В программировании и серверной архитектуре есть два типа масштабирования:
Вертикальное масштабирование (Vertical Scaling, Scale-Up)
Горизонтальное масштабирование (Horizontal Scaling, Scale-Out)

🚩Вертикальное масштабирование (Vertical Scaling)

- Улучшение одного сервера: больше оперативной памяти (RAM), мощнее процессор (CPU), быстрее диск (SSD/NVMe).
- Приложение остаётся на одном сервере, просто он становится мощнее.

🚩Горизонтальное масштабирование (Horizontal Scaling)

- Добавляются новые серверы, работающие параллельно.
- Нагрузка распределяется между несколькими машинами.
- Используются балансировщики нагрузки (Nginx, HAProxy, AWS ELB).

Ставь 👍 и забирай 📚 Базу знаний
🤔 Что такое типизация?

Типизация в программировании — это механизм, который определяет, как значения различных типов (например, целые числа, строки, объекты и т.д.) обрабатываются и взаимодействуют в языке программирования. Типизация помогает предотвратить ошибки, связанные с некорректным использованием данных, и улучшает читаемость и поддержку кода.

🚩Виды типизации

🟠Статическая типизация:
Типы переменных известны и проверяются на этапе компиляции. Примеры языков: Java, C++, TypeScript.
🟠Динамическая типизация:
Типы переменных определяются и проверяются во время выполнения программы. Примеры языков: Python, JavaScript, PHP.
🟠Сильная типизация:
Язык строго следит за типами, не позволяя неявные преобразования между ними. Примеры языков: Haskell, Java.
🟠Слабая типизация:
Язык допускает неявные преобразования между типами. Примеры языков: PHP, JavaScript.

PHP — язык с динамической и слабой типизацией, но с версией 7.0 и выше появилась возможность использовать строгую типизацию.
$number = 10;
$number = "ten"; // PHP позволяет это, так как тип переменной может изменяться


С PHP 7.0 можно использовать строгую типизацию для функций и методов. Это позволяет явно указывать, какого типа аргументы и возвращаемое значение должны быть.
declare(strict_types=1); // Включает строгую типизацию

function add(int $a, int $b): int {
return $a + $b;
}

echo add(2, 3); // Работает
// echo add(2, "3"); // Ошибка, так как второй аргумент не является целым числом


🚩Плюсы

➕Предотвращение ошибок:
Типизация помогает обнаруживать ошибки на ранних этапах разработки, таких как попытка выполнения некорректных операций с данными.
➕Улучшение читаемости и поддержки кода:
Явное указание типов делает код более понятным и предсказуемым, что облегчает его поддержку и развитие.
➕Оптимизация выполнения:
Статически типизированные языки позволяют компиляторам оптимизировать выполнение кода, так как типы известны на этапе компиляции.
➕Документирование кода:
Типизация служит дополнительной документацией, помогая разработчикам понять, какие данные ожидаются и возвращаются функциями и методами.

Ставь 👍 и забирай 📚 Базу знаний
🤔 Что такое агрегатные функции?

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

🚩Основные агрегатные функции

🟠COUNT()
Подсчитывает количество элементов в наборе. Эта функция может использоваться для подсчета количества строк в таблице или количества строк, соответствующих определенным критериям.
Пример: SELECT COUNT(*) FROM users; — подсчитывает количество всех строк в таблице users.

🟠SUM()
Суммирует числовые значения столбца. Используется для получения общей суммы числовых данных.
Пример: SELECT SUM(salary) FROM employees; — считает общую сумму зарплат всех сотрудников.

🟠AVG()
Вычисляет среднее значение числовых данных. Эта функция полезна для нахождения среднего значения определенного столбца.
Пример: SELECT AVG(price) FROM products; — рассчитывает среднюю цену продукта.

🟠MIN() и MAX()
Возвращают минимальное и максимальное значения в столбце соответственно. Эти функции используются для нахождения наименьших и наибольших значений.
Пример: SELECT MIN(age), MAX(age) FROM users; — находит минимальный и максимальный возраст среди пользователей.

🟠GROUP_CONCAT() (в MySQL) / STRING_AGG() (в PostgreSQL
)
Склеивают строки из столбца, объединяя их в одну строку с разделителем. Пример (MySQL): SELECT GROUP_CONCAT(username SEPARATOR ', ') FROM users WHERE city = 'New York'; — объединяет имена пользователей из Нью-Йорка через запятую.

Ставь 👍 и забирай 📚 Базу знаний
👍1
🤔 Какие паттерны знаешь?

В программировании и разработке ПО существует множество паттернов проектирования, включая:
- Порождающие: Singleton, Factory, Builder, Prototype.
- Структурные: Adapter, Decorator, Facade, Proxy, Bridge.
- Поведенческие: Observer, Strategy, Command, State, Template Method, Iterator, Mediator.
Эти паттерны помогают решать общие проблемы проектирования, повышая уровень абстракции и уменьшая связность компонентов?


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
🤔 Что такое middleware?

Это ПО, которое располагается между веб-сервером и приложением. Оно обрабатывает входящие запросы до того, как они достигнут вашего приложения, или обрабатывает исходящие ответы после того, как приложение их сгенерировало.

🚩Зачем нужен Middleware

🟠Управление запросами
Может изменять или проверять запросы перед передачей их в приложение. Например, оно может проверять наличие валидных токенов доступа для аутентификации или осуществлять проверку прав доступа.

🟠Перехват ответов
Также может изменять ответы перед тем, как они будут отправлены пользователю, например, добавлять нужные заголовки HTTP или сжимать данные.

🟠Логирование и мониторинг
Оно может записывать информацию о запросах и ответах для анализа трафика или обнаружения ошибок.

🟠Обработка ошибок
Часто используется для централизованной обработки ошибок, позволяя управлять ошибками элегантно и единообразно.

namespace App\Http\Middleware;

use Closure;
use Illuminate\Support\Facades\Auth;

class CheckAuthenticated
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
if (!Auth::check()) {
return redirect('/login');
}

return $next($request);
}
}


Ставь 👍 и забирай 📚 Базу знаний
🤔 Зачем нужно ключевое слово final?

Ключевое слово final в PHP используется для того, чтобы запретить наследование классов или переопределение методов в дочерних классах. Это помогает защитить важные части кода от изменения и сохранять логику в неприкосновенности. Final используется для обеспечения предсказуемости поведения в классах.

Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
👍1
🤔 В чем преимущество фасада?

Фасад (Facade) в PHP — это паттерн проектирования, который упрощает доступ к сложной системе классов, предоставляя единый интерфейс.

🚩Плюсы

➕Упрощает код
Фасад скрывает сложные детали реализации и предоставляет удобный интерфейс.
$logger = new Logger();
$db = new DatabaseConnection();
$mailer = new Mailer();

$user = new User($db, $logger, $mailer);
$user->register("example@example.com");


С фасадом (всё инкапсулировано в один класс)
$userFacade = new UserFacade();
$userFacade->register("example@example.com");


➕Ослабляет зависимость кода от реализации
Вы можете изменять внутреннюю структуру классов без влияния на клиентский код.

➕Улучшает поддержку и масштабируемость
- Если нужно добавить новую функциональность, можно просто изменить фасад, не переписывая весь код.
- Удобно при развитии проекта и подключении новых сервисов.

🚩Пример фасада в PHP

class PaymentGateway {
public function processPayment($amount) {
echo "Оплата на сумму $amount выполнена.\n";
}
}

class NotificationService {
public function sendNotification($message) {
echo "Отправлено уведомление: $message\n";
}
}

class OrderFacade {
private $payment;
private $notification;

public function __construct() {
$this->payment = new PaymentGateway();
$this->notification = new NotificationService();
}

public function placeOrder($amount) {
$this->payment->processPayment($amount);
$this->notification->sendNotification("Заказ оплачен на сумму $amount.");
}
}

// Использование
$order = new OrderFacade();
$order->placeOrder(1000);


Ставь 👍 и забирай 📚 Базу знаний
👍1
🤔 Зачем нужен шаблон Builder?

Шаблон Builder (Строитель) применяется для поэтапного создания сложных объектов. Он нужен, когда:
- Объект имеет много параметров, инициализация которых может быть сложной.
- Объект должен создаваться в разных конфигурациях, не загромождая конструктор.
- Код становится более читаемым, так как отделяется процесс создания от структуры объекта.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
👍1
🤔 Что известно о MVC?

Это паттерн проектирования, широко используемый для создания структурированных и масштабируемых приложений. Он разделяет приложение на три основных компонента: Модель (Model), Представление (View) и Контроллер (Controller).

🚩Основные компоненты

🟠Модель (Model)
Модель отвечает за данные и бизнес-логику приложения. Она управляет доступом к данным, логикой их обработки и взаимодействием с базой данных. В приложении электронной коммерции модель будет содержать классы, представляющие продукты, пользователей и заказы, а также методы для работы с этими данными (например, добавление нового продукта, обработка заказа и т.д.).

🟠Представление (View)
Представление отвечает за отображение данных пользователю. Оно формирует пользовательский интерфейс на основе данных, предоставляемых моделью. Веб-страницы, отображающие список продуктов, форму регистрации или страницу заказа, являются примерами представлений.

🟠Контроллер (Controller)
Контроллер действует как посредник между моделью и представлением. Он обрабатывает входные данные от пользователя, взаимодействует с моделью для выполнения необходимых операций и выбирает соответствующее представление для отображения результата. Контроллер может обрабатывать запрос на добавление нового продукта, получать данные от модели и затем отображать обновленный список продуктов через представление.

🚩Примеры

Model
// app/Models/Product.php
namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Product extends Model {
protected $fillable = ['name', 'price', 'description'];
}


Controller
// app/Http/Controllers/ProductController.php
namespace App\Http\Controllers;

use App\Models\Product;
use Illuminate\Http\Request;

class ProductController extends Controller {
public function index() {
$products = Product::all();
return view('products.index', compact('products'));
}

public function store(Request $request) {
Product::create($request->all());
return redirect()->route('products.index');
}
}


View
<!-- resources/views/products/index.blade.php -->
<!DOCTYPE html>
<html>
<head>
<title>Products</title>
</head>
<body>
<h1>Products</h1>
<ul>
@foreach($products as $product)
<li>{{ $product->name }} - ${{ $product->price }}</li>
@endforeach
</ul>
<form action="{{ route('products.store') }}" method="POST">
@csrf
<input type="text" name="name" placeholder="Product Name">
<input type="text" name="price" placeholder="Product Price">
<textarea name="description" placeholder="Product Description"></textarea>
<button type="submit">Add Product</button>
</form>
</body>
</html>


🚩Плюсы

➕Разделение обязанностей
Разделяет приложение на три компонента, каждый из которых отвечает за свою задачу. Это упрощает поддержку и масштабирование кода.

➕Улучшенная тестируемость
Разделение логики позволяет легко тестировать каждую часть приложения отдельно.

➕Гибкость и переиспользование
Компоненты MVC могут быть легко изменены или переиспользованы в других частях приложения или в других проектах.

➕Чистота и упорядоченность кода
Способствует созданию чистого и упорядоченного кода, что упрощает работу в команде и ускоряет разработку.

Ставь 👍 и забирай 📚 Базу знаний
🤔 Какие виды уязвимости знаешь?

В веб-разработке существует множество уязвимостей, но самые распространенные
SQL-инъекции (SQL Injection)
Межсайтовый скриптинг (XSS – Cross-Site Scripting)
Межсайтовая подделка запросов (CSRF – Cross-Site Request Forgery)
Ошибки аутентификации и управления сессиями
Необработанные пользовательские данные
Доступ к файлам и директориям (LFI/RFI – Local/Remote File Inclusion)
Ошибки конфигурации сервера и утечки данных

🟠SQL-инъекции (SQL Injection)
Атака, при которой злоумышленник вставляет вредоносный SQL-код в запрос, получая доступ к БД.
Чтение / изменение данных
Удаление таблиц
Получение паролей пользователей
Используем подготовленные запросы (Prepared Statements)
$db = new PDO("mysql:host=localhost;dbname=test", "root", "password");
$stmt = $db->prepare("SELECT * FROM users WHERE email = :email");
$stmt->execute([':email' => $_POST['email']]);
$user = $stmt->fetch();


🟠Межсайтовый скриптинг (XSS – Cross-Site Scripting)
Атака, при которой злоумышленник вставляет вредоносный JavaScript в веб-страницу.
Кража cookies и сеансов
Изменение содержимого страницы
Фишинг
Очистка данных перед выводом
echo htmlspecialchars($user_input, ENT_QUOTES, 'UTF-8');


🟠Межсайтовая подделка запросов (CSRF – Cross-Site Request Forgery)
Злоумышленник заставляет пользователя выполнить нежелательный запрос от его имени (например, перевести деньги).
Изменение данных без ведома пользователя
Подмена учетных записей
Используем CSRF-токены
$_SESSION['csrf_token'] = bin2hex(random_bytes(32));


При отправке формы проверяем
if ($_POST['csrf_token'] !== $_SESSION['csrf_token']) {
die("CSRF атака!");
}


🟠Ошибки аутентификации и управления сессиями
Если пароли хранятся неправильно или сессии уязвимы, злоумышленник может перехватить учетную запись пользователя.
Кража пароля
Перехват сессии
Храним пароли с password_hash(), а не в открытом виде:
$hash = password_hash("mypassword", PASSWORD_BCRYPT);


🟠Необработанные пользовательские данные
Приложение принимает и использует входные данные без проверки.
Возможность загрузки вредоносных файлов
Выполнение вредоносного кода
Проверяем загружаемые файлы (MIME-тип, расширение)
Используем валидацию данных:
$email = filter_var($_POST['email'], FILTER_VALIDATE_EMAIL);


🟠Доступ к файлам и директориям (LFI/RFI)
Злоумышленник может загружать и выполнять опасные файлы через параметры в URL.
Выполнение кода на сервере
Чтение конфиденциальных файлов
Запрещаем прямую загрузку файлов:
$whitelist = ['jpg', 'png', 'gif'];
$ext = pathinfo($_FILES['file']['name'], PATHINFO_EXTENSION);
if (!in_array($ext, $whitelist)) {
die("Недопустимый файл!");
}


🟠Ошибки конфигурации сервера и утечки данных
Если сервер настроен неправильно, можно случайно раскрыть важные данные.
Вывод ошибок PHP в браузере
Доступ к файлам .env, config.php
Отключаем display_errors в php.ini:
display_errors = Off


Защищаем файлы .env через .htaccess

  <Files .env>
Order allow,deny
Deny from all
</Files>


Ставь 👍 и забирай 📚 Базу знаний
🤔 Чем отличаются функции unset от unlink?

Функции unset() и unlink() в PHP выполняют совершенно разные задачи, несмотря на похожие названия.

🟠`unset()` – удаление переменной
unset() удаляет переменную из области видимости, но не освобождает память сразу.
$a = "Привет, мир!";
unset($a);
echo $a; // Ошибка: переменная не существует


🟠`unlink()` – удаление файла
unlink() удаляет файл с диска.
$file = "example.txt";

if (file_exists($file)) {
unlink($file); // Удаляет файл
echo "Файл удалён";
} else {
echo "Файл не найден";
}


Ставь 👍 и забирай 📚 Базу знаний
🤔 Имеет ли значение регистр заголовка?

Нет, не имеет.
В HTTP заголовки регистронезависимы.
Например, Content-Type, content-type, CONTENT-TYPE — это одно и то же.
Но значения заголовков могут быть чувствительны к регистру — зависит от конкретного поля.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний