Addslashes: примеры (PHP)
addslashes(string $str): stringОписание функции addslashes
Функция addslashes экранирует специальные символы в строке, добавляя перед ними обратный слеш (\\). Это используется для подготовки строк перед вставкой их в базу данных или для передачи в команды оболочки, где символы могут быть интерпретированы особым образом.
Когда применяется функция
Основное применение — подготовка данных для запросов к базам данных, особенно при использовании функций вроде mysql_query в старом коде. В современных приложениях для этого используют подготовленные выражения. Также функция может быть полезна при формировании строк для JavaScript или других контекстов, требующих экранирования.
Аргументы функции
- string (обязательный) — входная строка, которую необходимо экранировать.
Функция возвращает модифицированную строку.
Короткие примеры использования addslashes
Экранирование кавычек
echo addslashes("O'Reilly");O\'Reilly
Экранирование двойных кавычек и обратного слеша
echo addslashes('Он сказал: \"Привет!\" и ушел. Путь: C:\\Windows');Он сказал: \"Привет!\" и ушел. Путь: C:\\Windows
Экранирование нулевого байта
echo bin2hex(addslashes("Null\0Byte"));4e756c6c5c0042797465
Похожие функции в PHP
- stripslashes — удаляет экранирующие слеши, добавленные addslashes.
- mysqli_real_escape_string или PDO::quote — предпочтительные способы экранирования для конкретных СУБД с учетом кодировки соединения.
- htmlspecialchars — преобразует специальные символы в HTML-сущности, используется для вывода в HTML, а не для запросов к БД.
Подготовленные выражения PDO или MySQLi являются современной и безопасной альтернативой для работы с базами данных.
Типичные ошибки
Двойное экранирование
$str = "Test's";
echo addslashes(addslashes($str));Test\\'s
Это приводит к появлению лишних слешей в данных.
Использование для защиты от SQL-инъекций в современном коде
// НЕ БЕЗОПАСНО для всех СУБД и контекстов
$user_input = $_POST['input'];
$query = "SELECT * FROM users WHERE name = '" . addslashes($user_input) . "'";Функция не учитывает кодировку соединения с БД и может быть обойдена. Вместо нее следует использовать подготовленные выражения.
Экранирование уже экранированных данных
$data = "O'Reilly";
$escaped = addslashes($data);
// ... позже, ошибочное повторное экранирование
echo addslashes($escaped);O\\'Reilly
Изменения в новых версиях PHP
В PHP 8.0 не было внесено существенных изменений в поведение функции addslashes. Однако в целом, начиная с PHP 5.4, магические кавычки (magic_quotes_gpc) были удалены, что сделало функцию более предсказуемой, так как ранее она могла применяться автоматически к входящим данным.
Расширенные примеры использования addslashes
Обработка массива данных
$data = ["O'Reilly", 'Путь: C:\\', '"Цитата"'];
$escaped = array_map('addslashes', $data);
print_r($escaped);Array
(
[0] => O\'Reilly
[1] => Путь: C:\\
[2] => \"Цитата\"
)Имитация экранирования для встроенного JavaScript
$message = "Сообщение с 'кавычками' и \"разными\" символами.";
echo '<script>alert("' . addslashes($message) . '");</script>';<script>alert("Сообщение с \'кавычками\' и \"разными\" символами.");</script>Сравнение с mysqli_real_escape_string
$link = mysqli_connect("localhost", "user", "pass", "db");
$input = "O'Reilly\0";
echo "addslashes: " . addslashes($input) . "\n";
echo "mysqli_real_escape_string: " . mysqli_real_escape_string($link, $input);addslashes: O\'Reilly\0 mysqli_real_escape_string: O\'Reilly\0
При корректной настройке кодировки соединения mysqli_real_escape_string работает надежнее.
Экранирование для шаблонов командной строки
$filename = "file'name.txt";
$command = "cat " . escapeshellarg($filename); // Лучше использовать escapeshellarg
echo "Команда: $command";Команда: cat 'file'\''name.txt'
Для shell-команд рекомендуется escapeshellarg, но addslashes может применяться в простых случаях.
Аналоги в других языках
Python
import json
print(json.dumps('O\'Reilly'))"O'Reilly"
Для SQL-запросов используют параметризованные запросы или экранирование через библиотеки БД.
JavaScript
console.log('O\'Reilly'.replace(/['"\\]/g, '\\$&'));O\'Reilly
MySQL
SELECT QUOTE('O\'Reilly');'O\'Reilly'
В SQL часто используют параметризованные запросы, а QUOTE экранирует строку для использования в SQL-запросе.