Addslashes: примеры (PHP)

Использование 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

Обработка массива данных

Пример php
$data = ["O'Reilly", 'Путь: C:\\', '"Цитата"'];
$escaped = array_map('addslashes', $data);
print_r($escaped);
Array
(
    [0] => O\'Reilly
    [1] => Путь: C:\\
    [2] => \"Цитата\"
)

Имитация экранирования для встроенного JavaScript

Пример php
$message = "Сообщение с 'кавычками' и \"разными\" символами.";
echo '<script>alert("' . addslashes($message) . '");</script>';
<script>alert("Сообщение с \'кавычками\' и \"разными\" символами.");</script>

Сравнение с mysqli_real_escape_string

Пример php
$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 работает надежнее.

Экранирование для шаблонов командной строки

Пример php
$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-запросе.

PHP addslashes function comments

En
Addslashes Quote string with slashes