Что означает экранирование спецсимволов в контексте безопасности?

«Что означает экранирование спецсимволов в контексте безопасности?» — вопрос из категории Безопасность, который задают на 28% собеседований PHP Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

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

Контексты и правильные подходы:

  1. SQL-инъекции: Никогда не используйте ручное экранирование (типа addslashes()). Всегда применяйте подготовленные выражения (prepared statements).

    // НЕПРАВИЛЬНО (уязвимо)
    $sql = "SELECT * FROM users WHERE name = '" . addslashes($input) . "'";
    
    // ПРАВИЛЬНО (безопасно)
    $stmt = $pdo->prepare("SELECT * FROM users WHERE name = ?");
    $stmt->execute([$input]);
  2. XSS (Межсайтовый скриптинг): Для вывода пользовательских данных в HTML используйте функции контекстного экранирования.

    // Экранирование для HTML-контекста
    echo htmlspecialchars($userInput, ENT_QUOTES, 'UTF-8');
    
    // Для атрибутов JavaScript внутри HTML (редкий, но опасный случай)
    $jsonData = json_encode($userInput, JSON_HEX_TAG | JSON_HEX_APOS | JSON_HEX_QUOT);
  3. Командная инъекция (Command Injection): Избегайте передачи пользовательского ввода в shell-команды. Если необходимо, используйте escapeshellarg().

    // Безопасное построение команды
    $safeInput = escapeshellarg($userInput);
    system("ls -la " . $safeInput);

Главный принцип: Понимать контекст, в котором будут использоваться данные (SQL, HTML, JS, Shell), и применять соответствующий механизм экранирования или, что лучше, параметризацию.