PHP — идеальный язык для веба, но сколько сайтов падало просто потому, что разработчик поленился использовать prepared statements или хешировать пароли? Бесконечно много. Если ты до сих пор хранишь пароли в plain text или вставляешь данные в SQL через конкатенацию строк — ты не разработчик, ты живое приглашение для хакера.

Так что, давай коротко и жёстко: какие минимум-движения должен сделать любой PHP-разработчик, чтобы его код не сдох от первой же атаки.

Prepared Statements

SQL-инъекции — это когда твой код превращается в бесплатный админ-панель для чужих рук. Лечится одной таблеткой — подготовленные выражения.

$stmt = $pdo->prepare('SELECT * FROM users WHERE email = :email');
$stmt->execute(['email' => $email]);

Всё. Забудь про "SELECT * FROM users WHERE email='$email'". Если ты так делаешь, то либо ты ленивый, либо ты работаешь на хакеров.

Валидация входных данных

Пользователь бывает хитёр: он введёт 1' OR '1'='1, он введёт <script>, он введёт «qwe» в поле для телефона. Твоя задача — не верить ни одному байту, что приходит от него.

$email = filter_input(INPUT_POST, 'email', FILTER_VALIDATE_EMAIL);
if ($email === false) {
    throw new Exception("Пошёл нахер со своим email");
}

HTTPS

До сих пор встречаются проекты без HTTPS. Если у тебя так — выключи свой сервер и иди работать таксистом. Пароли и данные через HTTP — это как писать пин-код на лбу.

Пароли

Никогда, слышишь, никогда не храни пароль в базе в открытом виде. Даже в dev-окружении. Если в коде у тебя md5($password), знай: тебя уже проклинают sysadmin и твои будущие пользователи.

$hash = password_hash($password, PASSWORD_DEFAULT);

if (password_verify($password, $hash)) {
    // Пользователь ввёл верный пароль
}

CSRF

CSRF — это когда злоумышленник заставляет пользователя сделать запрос от его имени. У тебя нет CSRF-токенов? Поздравляю, ты только что выдал ключи от квартиры с мебелью. Добавляй токен в форму, проверяй при запросе. Без вариантов.

XSS

Любой ввод от пользователя — это потенциальный:

 <script>alert('pwned')</script>

Да, всё так просто.

echo htmlspecialchars($user_input, ENT_QUOTES, 'UTF-8');

Если ты этого не делаешь — твой сайт скоро будет показывать не твой контент, а «поздравляем, вы выиграли айфон».

Обновления и зависимости

Composer — не игрушка. Пакеты устаревают, баги латают. Если ты не обновляешь зависимости, то твой проект живёт на динамитной шашке с горящей фитильной верёвкой.

Ограничение доступа

Не давай пользователю то, что ему не нужно. Права на файлы, доступы в админку, открытые /phpmyadmin — это всё мины. Ставь аутентификацию, авторизацию и закрывай лишнее.

CSP

Content Security Policy — не серебряная пуля, но хороший забор против XSS. Настроил — и браузер не даст грузить левые скрипты. Лучше иметь, чем потом вытирать слёзы.

Вместо заключения

Безопасность — это не галочка в чеклисте. В PHP ты живёшь в мире, где дыр больше, чем в сыре, и твоя задача хотя бы не сделать новые своими руками.

  • Prepared statements спасут от SQL-инъекций.
  • password_hash спасёт пользователей от утечек.
  • CSRF-токены и XSS-фильтры спасут от школьников с браузером.
  • HTTPS и права доступа — минимальная гигиена.

Хочешь игнорировать? Игнорируй. Только не удивляйся, когда твой проект утром окажется в индексе Google как «онлайн-казино в Нигерии».