\n\n// Для командной строки\nescapeshellarg($filename);\n```\n\n### Ключевые принципы правильной фильтрации:\n\n1. **Всегда проверяй на бэкенде** – никогда не доверяй данным с фронтенда\n2. **Белые списки предпочтительнее черных** – разрешай только известное хорошее\n3. **Контекстно-зависимая фильтрация** – данные для HTML, SQL и shell требуют разных подходов\n4. **Ранняя фильтрация** – отсеивай невалидные данные как можно раньше\n5. **Стандартные библиотеки предпочтительнее самописных решений** – используй встроенные функции PHP и возможности фреймворков\n\n### Распространенные ошибки:\n```php\n// НЕПРАВИЛЬНО - уязвимость к SQL-инъекциям\n$query = \"SELECT * FROM users WHERE id = \" . $_GET['id'];\n\n// НЕПРАВИЛЬНО - недостаточная фильтрация\n$input = strip_tags($_POST['content']); // strip_tags не защищает от всех XSS\n\n// ПРАВИЛЬНЫЙ ПОДХОД - многоуровневая защита\n$id = filter_var($_GET['id'], FILTER_VALIDATE_INT);\nif ($id === false) { throw new InvalidArgumentException(); }\n$stmt = $pdo->prepare(\"SELECT * FROM users WHERE id = ?\");\n$stmt->execute([$id]);\n```\n\nФильтрация – это непрерывный процесс, который должен сопровождать данные на всем пути через приложение: от момента получения до сохранения и вывода. Каждый уровень имеет свою зону ответственности и дополняет другие уровни, создавая robust-систему безопасности.","dateCreated":"2026-04-05T20:47:19.115754","upvoteCount":0,"author":{"@type":"Person","name":"deepseek-v3.2"}}}}
← Назад к вопросам

Где происходит фильтрация данных?

2.2 Middle🔥 241 комментариев
#Архитектура и паттерны#Базы данных и SQL

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI5 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Фильтрация данных в Backend-разработке на PHP

Фильтрация данных в контексте PHP Backend-разработки происходит на нескольких уровнях, образуя многоуровневую систему безопасности, известную как "защита в глубину" (defense in depth). Это критически важно для предотвращения уязвимостей и обеспечения целостности данных.

1. Уровень клиента (браузер/фронтенд)

Это самый начальный, но НЕДОСТАТОЧНЫЙ уровень. Фильтрация здесь происходит через:

  • HTML5-атрибуты (type="email", pattern, min/max)
  • JavaScript-валидацию
// Пример на фронтенде
if (!email.includes('@')) {
    alert('Некорректный email');
}

Важно: Этот уровень легко обойти, отключив JavaScript или используя инструменты разработчика. Он служит для улучшения UX, но не для безопасности.

2. Уровень сети и веб-сервера

  • WAF (Web Application Firewall) – фильтрует вредоносные запросы до их попадания в приложение
  • Модули веб-сервера (например, mod_security для Apache)
  • Настройки PHP в php.ini:
; Базовые настройки безопасности
allow_url_fopen = Off
expose_php = Off
disable_functions = exec,system,passthru

3. Уровень фреймворка (основной уровень фильтрации)

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

// Пример в Laravel
$validated = $request->validate([
    'email' => 'required|email|max:255',
    'age' => 'required|integer|min:18|max:120',
    'username' => 'required|alpha_dash|unique:users',
]);

Санитизация (очистка) данных

// Фильтрация переменных
$clean_email = filter_var($email, FILTER_SANITIZE_EMAIL);
$clean_int = filter_var($age, FILTER_SANITIZE_NUMBER_INT);
$clean_html = htmlspecialchars($user_input, ENT_QUOTES, 'UTF-8');

4. Уровень бизнес-логики приложения

  • Проверка прав доступа: может ли пользователь выполнять эту операцию?
  • Валидация бизнес-правил: соответствует ли сумма лимитам, доступен ли товар?
  • Логическая целостность: корректны ли связи между данными?
class OrderService {
    public function createOrder(array $data, User $user) {
        // Проверка бизнес-правил
        if ($user->creditLimit < $data['total']) {
            throw new InsufficientFundsException();
        }
        
        // Проверка доступности товара
        if (!$this->inventoryService->isAvailable($data['product_id'])) {
            throw new ProductUnavailableException();
        }
    }
}

5. Уровень базы данных

Подготовленные выражения (prepared statements)

// Защита от SQL-инъекций
$stmt = $pdo->prepare("SELECT * FROM users WHERE email = :email AND status = :status");
$stmt->execute([
    'email' => $email,
    'status' => 'active'
]);

Валидация на уровне схемы БД

-- Ограничения на уровне базы данных
CREATE TABLE users (
    id INT PRIMARY KEY AUTO_INCREMENT,
    email VARCHAR(255) NOT NULL UNIQUE CHECK (email LIKE '%@%.%'),
    age INT CHECK (age >= 18),
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

6. Уровень вывода (escaping)

Перед выводом данных в HTML, JavaScript, SQL или CLI:

// Для HTML
echo htmlspecialchars($user_content, ENT_QUOTES, 'UTF-8');

// Для JavaScript (в шаблонизаторе)
<script>
    var userName = <?= json_encode($user_name, JSON_HEX_TAG) ?>;
</script>

// Для командной строки
escapeshellarg($filename);

Ключевые принципы правильной фильтрации:

  1. Всегда проверяй на бэкенде – никогда не доверяй данным с фронтенда
  2. Белые списки предпочтительнее черных – разрешай только известное хорошее
  3. Контекстно-зависимая фильтрация – данные для HTML, SQL и shell требуют разных подходов
  4. Ранняя фильтрация – отсеивай невалидные данные как можно раньше
  5. Стандартные библиотеки предпочтительнее самописных решений – используй встроенные функции PHP и возможности фреймворков

Распространенные ошибки:

// НЕПРАВИЛЬНО - уязвимость к SQL-инъекциям
$query = "SELECT * FROM users WHERE id = " . $_GET['id'];

// НЕПРАВИЛЬНО - недостаточная фильтрация
$input = strip_tags($_POST['content']); // strip_tags не защищает от всех XSS

// ПРАВИЛЬНЫЙ ПОДХОД - многоуровневая защита
$id = filter_var($_GET['id'], FILTER_VALIDATE_INT);
if ($id === false) { throw new InvalidArgumentException(); }
$stmt = $pdo->prepare("SELECT * FROM users WHERE id = ?");
$stmt->execute([$id]);

Фильтрация – это непрерывный процесс, который должен сопровождать данные на всем пути через приложение: от момента получения до сохранения и вывода. Каждый уровень имеет свою зону ответственности и дополняет другие уровни, создавая robust-систему безопасности.

Где происходит фильтрация данных? | PrepBro