Table des matières
Why addslashes() is not enough
Use Prepared Statements (Parameterized Queries)
Example using PDO (PHP):
Example using MySQLi:
When You Can’t Use Prepared Statements (Rare)
1. Escaping Strings: Use Database-Specific Functions
2. Escaping Identifiers (Table/Column Names)
3. Integers and Other Types
Summary: Defense-in-Depth with Context
Maison développement back-end tutoriel php Au-delà de `Addslashes () ': Échappement contextuel pour une défense d'injection SQL robuste

Au-delà de `Addslashes () ': Échappement contextuel pour une défense d'injection SQL robuste

Jul 26, 2025 am 02:55 AM
PHP Escape Characters

SQL注入防护不能依赖addslashes(),因其不处理多字节编码且仅转义有限字符,易被绕过;应使用预处理语句(如PDO或MySQLi的参数化查询)将数据与SQL逻辑分离,确保输入不被解析为代码;若无法使用预处理,需根据上下文采用数据库特定的转义函数(如real_escape_string并设置正确字符集)、标识符白名单或引号包裹、整型输入强制类型转换等方法,实现分层防御。

"Beyond

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.

"Beyond

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:

"Beyond
  • 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 bypass addslashes() and inject ' into the query.

Bottom line: Never use addslashes() for SQL escaping.

"Beyond

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!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Outils d'IA chauds

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

Video Face Swap

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 !

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

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

Sujets chauds

Tutoriel PHP
1545
276
Navigation de l'enfer de barreaux arrière: une plongée profonde dans `preg_quote ()` et regex échappant Navigation de l'enfer de barreaux arrière: une plongée profonde dans `preg_quote ()` et regex échappant Jul 26, 2025 am 09:51 AM

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

Échappez le comportement des personnages dans les syntaxes Heredoc et Nowdoc de PHP Échappez le comportement des personnages dans les syntaxes Heredoc et Nowdoc de PHP Jul 26, 2025 am 09:45 AM

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;

Modèles d'échappement PHP moderne pour un code sécurisé et propre Modèles d'échappement PHP moderne pour un code sécurisé et propre Jul 26, 2025 am 09:51 AM

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

Single vs Quotes doubles: un guide définitif pour échapper au comportement des personnages Single vs Quotes doubles: un guide définitif pour échapper au comportement des personnages Jul 28, 2025 am 04:44 AM

INBASH, SOMIQUOTESTERATALLCHARACTERSLITERALLEMENT WHILEDUBLEQUOTESALOWVARIABLE EXPANSIONANDLIMITÉE

Fortifier vos opinions: le rôle critique de `htmlSpecialChars ()' dans la prévention des XSS Fortifier vos opinions: le rôle critique de `htmlSpecialChars ()' dans la prévention des XSS Jul 29, 2025 am 04:57 AM

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

L'escaper échappé: manipuler les barres de barres littérales dans les chaînes et les chemins PHP L'escaper échappé: manipuler les barres de barres littérales dans les chaînes et les chemins PHP Jul 26, 2025 am 09:35 AM

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

Une analyse comparative: `AddsLashes ()` contre `HtmlSpecialChars ()` contre `mysqli_real_escape_string ()` Une analyse comparative: `AddsLashes ()` contre `HtmlSpecialChars ()` contre `mysqli_real_escape_string ()` Jul 27, 2025 am 04:27 AM

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 (

Au-delà de `Addslashes () ': Échappement contextuel pour une défense d'injection SQL robuste Au-delà de `Addslashes () ': Échappement contextuel pour une défense d'injection SQL robuste Jul 26, 2025 am 02:55 AM

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.

See all articles