Ответ
Экранирование — это процесс нейтрализации специального значения символа, чтобы он интерпретировался как данные, а не как команда. Это критически важно для предотвращения инъекционных атак.
Контексты и правильные подходы:
-
SQL-инъекции: Никогда не используйте ручное экранирование (типа
addslashes()). Всегда применяйте подготовленные выражения (prepared statements).// НЕПРАВИЛЬНО (уязвимо) $sql = "SELECT * FROM users WHERE name = '" . addslashes($input) . "'"; // ПРАВИЛЬНО (безопасно) $stmt = $pdo->prepare("SELECT * FROM users WHERE name = ?"); $stmt->execute([$input]); -
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); -
Командная инъекция (Command Injection): Избегайте передачи пользовательского ввода в shell-команды. Если необходимо, используйте
escapeshellarg().// Безопасное построение команды $safeInput = escapeshellarg($userInput); system("ls -la " . $safeInput);
Главный принцип: Понимать контекст, в котором будут использоваться данные (SQL, HTML, JS, Shell), и применять соответствующий механизм экранирования или, что лучше, параметризацию.