


Au-delà de `Addslashes () ': Échappement contextuel pour une défense d'injection SQL robuste
SQL注入防护不能依赖addslashes(),因其不处理多字节编码且仅转义有限字符,易被绕过;应使用预处理语句(如PDO或MySQLi的参数化查询)将数据与SQL逻辑分离,确保输入不被解析为代码;若无法使用预处理,需根据上下文采用数据库特定的转义函数(如real_escape_string并设置正确字符集)、标识符白名单或引号包裹、整型输入强制类型转换等方法,实现分层防御。
When it comes to defending against SQL injection, relying solely on addslashes()
is a dangerous shortcut. While it might seem to work in some cases, it’s fundamentally flawed and insufficient for robust security. True protection requires contextual escaping—applying the right escaping method based on the specific context in which user data enters the SQL query.

Let’s break down why addslashes()
fails and what you should use instead.
Why addslashes()
is not enough
addslashes()
adds backslashes before quotes and a few other characters ('
, "
, \
, and NULL). But here’s the problem:

- It doesn’t account for different character encodings (like multi-byte encodings such as GBK), where an escaped character might be interpreted as part of a two-byte sequence, leading to exploitable vulnerabilities.
- It only escapes a limited set of characters, and its behavior isn’t tied to the actual SQL grammar or database driver.
- It assumes single-byte encodings and may fail under edge cases, making it unreliable.
Example: In a GBK encoding context,
'\'
followed by%bf%27
can be interpreted as a single character, allowing an attacker to bypassaddslashes()
and inject'
into the query.
Bottom line: Never use addslashes()
for SQL escaping.

Use Prepared Statements (Parameterized Queries)
The gold standard for preventing SQL injection is prepared statements with parameterized queries. This approach separates SQL logic from data, so user input is never interpreted as part of the SQL command.
Example using PDO (PHP):
$pdo = new PDO($dsn, $user, $pass); $stmt = $pdo->prepare("SELECT * FROM users WHERE email = ?"); $stmt->execute([$userEmail]); $user = $stmt->fetch();
Example using MySQLi:
$mysqli = new mysqli("localhost", "user", "pass", "db"); $stmt = $mysqli->prepare("SELECT * FROM users WHERE email = ?"); $stmt->bind_param("s", $userEmail); $stmt->execute(); $result = $stmt->get_result();
✅ Why it works:
- The SQL structure is fixed at prepare time.
- User data is sent separately and treated strictly as data.
- No amount of clever input can alter the query logic.
This is context-aware by design—you don’t need to escape manually because the database driver handles it safely.
When You Can’t Use Prepared Statements (Rare)
In rare cases—like dynamic table names or complex full-text search—you can’t use placeholders. In these situations, contextual escaping becomes essential.
1. Escaping Strings: Use Database-Specific Functions
Instead of addslashes()
, use the escaping function provided by your database driver:
- PDO:
$pdo->quote($string)
(but prefer prepared statements) - MySQLi:
$mysqli->real_escape_string($string)
Note:
real_escape_string()
only works correctly if:
- The connection charset is properly set (e.g.,
SET NAMES utf8mb4
)- You’re using a supported MySQL client library
$mysqli->set_charset("utf8mb4"); $escaped = $mysqli->real_escape_string($userInput); $query = "SELECT * FROM posts WHERE title = '$escaped'";
Still risky—only acceptable when prepared statements aren’t feasible.
2. Escaping Identifiers (Table/Column Names)
You can’t use placeholders for table names. Instead:
- Use backticks (in MySQL) and escape them properly.
- Whitelist allowed identifiers when possible.
function quoteIdentifier($identifier) { return '`' . str_replace('`', '``', $identifier) . '`'; } $query = "SELECT * FROM " . quoteIdentifier($tableName);
Even better: avoid dynamic identifiers entirely or use a whitelist:
$allowedTables = ['users', 'posts', 'comments']; if (!in_array($tableName, $allowedTables)) { die("Invalid table name"); }
3. Integers and Other Types
Always cast or validate:
$userId = (int)$input; $query = "SELECT * FROM users WHERE id = $userId"; // Safe if cast
Or use prepared statements anyway:
$stmt = $pdo->prepare("SELECT * FROM users WHERE id = ?"); $stmt->execute([(int)$input]);
Summary: Defense-in-Depth with Context
Context | Recommended Approach |
---|---|
String values in WHERE | ✅ Prepared statements (best) |
Dynamic table/columns | ✅ Whitelist or quote with backticks |
Integer inputs | ✅ Cast to (int) or use prepared |
Legacy code / edge cases | ✅ Use real_escape_string + UTF-8 set |
Never | ❌ addslashes()
|
The key takeaway: escaping is not one-size-fits-all. The correct defense depends on where and how untrusted data enters your SQL query. Prepared statements handle most cases safely and should be your default. When they can’t be used, apply strict input validation, whitelisting, and proper escaping—with full awareness of the context.
Basically: drop addslashes()
, use parameterized queries, and escape intelligently when you absolutely have to.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Outils d'IA chauds

Undress AI Tool
Images de déshabillage gratuites

Undresser.AI Undress
Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover
Outil d'IA en ligne pour supprimer les vêtements des photos.

Clothoff.io
Dissolvant de vêtements AI

Video Face Swap
Échangez les visages dans n'importe quelle vidéo sans effort grâce à notre outil d'échange de visage AI entièrement gratuit !

Article chaud

Outils chauds

Bloc-notes++7.3.1
Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

SublimeText3 version Mac
Logiciel d'édition de code au niveau de Dieu (SublimeText3)

preg_quote () EscapesRegex-SpecialCharacters, y compris BackslashesandTheDelimiter, totrareathemasliterals; 2.AvoidDouble-EscapingByPassingRawstrings (par exemple, «c: \ Path») Sanspre-escapedbackslasheshes;.

Heredoc gère les séquences d'interpolation variable et d'évasion de base telles que \ n, \ t, \\, \ $, mais ne traite pas \ "ou \ ', tandis que NowDoc n'effectue pas des variables d'interpolation et de tout traitement d'évasion. Tous les contenus, y compris \ n et les variables, sont devenues littéralement; 1. Les variables telles que le nom $ seront remplacées comme indique comme indique comme des nouvelles; 3. Aucune citation d'évasion n'est requise pour les deux;

Toujours EscapeOutputUsingContext-SpecificMethods: htmlSpecialCars () forhtmlContentAndAtTributes, rawurlencode () forurls, andjson_en code () withjson_hex_tag, json_hex_apos, json_hex_quot, etjson_unescaped_unicodeforjavascrip

INBASH, SOMIQUOTESTERATALLCHARACTERSLITERALLEMENT WHILEDUBLEQUOTESALOWVARIABLE EXPANSIONANDLIMITÉE

HTMLSpecialCars () est la principale ligne de défense contre les attaques XSS, convertissant des caractères spéciaux en entités HTML, garantissant que le contenu entré par le navigateur est traité comme du texte brut plutôt que comme un code exécutable. 1. Lorsque vous l'utilisez, vous devez spécifier le codage des caractères (comme «UTF-8») pour éviter d'analyser les vulnérabilités; 2. Activer toujours le drapeau ent_quotes pour échapper aux devis simples et doubles pour empêcher l'injection dans le contexte de la propriété; 3. Il doit être échappé à la sortie plutôt que stocké, éviter la solidification des données et une évasion répétée; 4. Il ne peut pas être invoqué pour se défendre contre tous les XS seuls. Il est nécessaire de traiter les URL en combinaison avec UrLencode (), JSON_encode () pour traiter les données JavaScript et utiliser HTMLP pour un texte riche

BackslashesgomissingInphpBecausetheyareTreatEdascaptectersInDouble-QuotedStrings, Sotofixthis: 1.usesingschingquotesforliteralPathsliL'c: \ Users \ John \ Documents ', 2.ordoublethebackSlashesSindoublequotesas "C: \\ use

AddSlashes () doit être évité pour les évasions SQL car il n'est pas sûr et non protégé de l'injection SQL; htmlSpecialChars () est utilisé pour la sortie HTML pour empêcher les attaques XSS; MySQLI_REAL_ESCACE_STRING () peut être utilisé pour les échappements de chaînes dans les requêtes MySQL, mais n'est qu'une option sous-optimale lorsque les instructions de prétraitement ne peuvent pas être utilisées. 1. AddSlashes () est obsolète et dangereux et ne doit pas être utilisé pour l'évasion SQL dans les applications modernes; 2. HtmlSpecialCars () doit être utilisé lors de la sortie de l'entrée de l'utilisateur et de la sortie en HTML pour empêcher les XS; 3. Mysqli_real_escape_string (

La protection contre l'injection SQL ne peut pas compter sur Addslashes () car elle ne traite pas le codage multi-octets et échappe uniquement aux caractères finis, qui est facilement contourné; Les instructions de prétraitement (telles que les requêtes paramétrées pour PDO ou MySQLI) doivent être utilisées pour séparer les données de la logique SQL pour s'assurer que l'entrée n'est pas analysée en code; Si le prétraitement ne peut pas être utilisé, les fonctions d'échappement spécifiques à la base de données (telles que Real_escape_String et définition du jeu de caractères correct), l'identifiant de la liste blanche ou de la marque de devis, le casting d'entrée entier et d'autres méthodes doivent être utilisés en fonction du contexte pour atteindre la défense hiérarchique.
