Maison >développement back-end >Problème PHP >évasion php sql
PHP et SQL sont tous deux des langages de programmation couramment utilisés pour traiter les données dans les applications Web. Lors du traitement des données saisies par l’utilisateur, il faut prêter attention à la sécurité des données. Parce que les utilisateurs peuvent essayer d'injecter du code malveillant ou des requêtes SQL pour accéder ou voler des informations sensibles. Pour éviter que cela ne se produise, les données saisies doivent être échappées afin d'éliminer tout risque possible. Cet article présentera l'échappement des données en PHP et SQL.
En PHP, il existe deux fonctions courantes qui peuvent être utilisées pour échapper les données d'entrée, à savoir addslashes()
et mysqli_real_escape_string(). <code>addslashes()
和mysqli_real_escape_string()
。
1.1 addslashes()
addslashes()
函数可以将字符串中的引号、反斜杠等特殊字符转义,以避免在数据库中引发问题。例如,如果用户试图输入I'm a hacker
,这个字符串会导致PHP语法错误,因为它会破坏SQL语句的引号结构。通过使用addslashes()
,可以将这个字符串转义为I'm a hacker
,使其可以被正确解析。代码如下:
$username = "I'm a hacker"; $username = addslashes($username);
1.2 mysqli_real_escape_string()
mysqli_real_escape_string()
函数是通过一个连接相关的函数,可以用于转义SQL语句中的特殊字符。在使用这个函数之前,必须先创建一个到数据库的连接。以下是示例代码:
$conn = mysqli_connect($host, $user, $password, $dbname); $string = "I'm a hacker"; $string = mysqli_real_escape_string($conn, $string);
使用mysqli_real_escape_string()
转义字符串时,总是要将它与创建到数据库的连接关联起来。否则,无法进行转义处理。
在SQL语句中,可以通过使用参数化查询来避免注入攻击。使用参数化查询,可以将数据转换为常数,从而避免恶意代码的注入。
2.1 参数化查询
参数化查询是指在SQL语句中使用参数代替实际数据值。这些参数只是在执行语句时被绑定到实际的值。在PHP中,可以使用PDO对象来执行参数化查询,例如:
$pdo = new PDO('mysql:host=localhost;dbname=test', $user, $password); $stmt = $pdo->prepare('SELECT * FROM users WHERE username = :username'); $stmt->execute(['username' => $username]);
在这个示例中,使用冒号(:)为用户名创建了一个占位符。然后,使用execute()
方法将占位符绑定到实际的用户名值上。
2.2 预处理语句
另一种防止SQL注入的方法是使用预处理语句。在这种情况下,SQL查询中的所有变量都被视为参数,并在查询执行之前被转义。在PHP中,可以使用mysqli
扩展来执行预处理语句,例如:
$conn = mysqli_connect($host, $user, $password, $dbname); $stmt = mysqli_prepare($conn, 'SELECT * FROM users WHERE username = ?'); mysqli_stmt_bind_param($stmt, 's', $username); mysqli_stmt_execute($stmt);
在这个示例中,mysqli_prepare()
函数用于准备查询语句,并在执行之前绑定所有参数。使用s
参数类型来绑定字符串变量。然后,使用mysqli_stmt_execute()
函数来执行查询。
综上所述,数据转义是很重要的,可以防止Web应用程序中的SQL注入攻击。在PHP中,可以使用addslashes()
或mysqli_real_escape_string()
addslashes()
🎜🎜addslashes()
peut échapper aux caractères spéciaux tels que les guillemets et les barres obliques inverses dans les chaînes pour éviter de causer des problèmes dans la base de données. Par exemple, si l'utilisateur tente de saisir Je suis un hacker
, cette chaîne provoquera une erreur de syntaxe PHP car elle rompt la structure des guillemets de l'instruction SQL. En utilisant addslashes()
, cette chaîne peut être échappée vers Je suis un hacker
afin qu'elle puisse être analysée correctement. Le code est le suivant : 🎜rrreee🎜1.2 mysqli_real_escape_string()
🎜🎜mysqli_real_escape_string()
La fonction est une fonction liée à la connexion qui peut être utilisée pour échapper des caractères spéciaux dans SQL déclarations. Avant d'utiliser cette fonction, une connexion à la base de données doit être créée. Voici l'exemple de code : 🎜rrreee🎜Lorsque vous échappez une chaîne à l'aide de mysqli_real_escape_string()
, associez-la toujours à la création d'une connexion à la base de données. Sinon, la fuite ne peut pas être effectuée. 🎜execute()
pour lier l'espace réservé à la valeur réelle du nom d'utilisateur. 🎜🎜2.2 Déclarations préparées🎜🎜Une autre façon d'empêcher l'injection SQL consiste à utiliser des instructions préparées. Dans ce cas, toutes les variables de la requête SQL sont traitées comme des paramètres et sont échappées avant l'exécution de la requête. En PHP, vous pouvez utiliser l'extension mysqli
pour exécuter des instructions préparées, telles que : 🎜rrreee🎜Dans cet exemple, la fonction mysqli_prepare()
est utilisée pour préparer l'instruction de requête et Liez tous les paramètres avant l’exécution. Utilisez le type de paramètre s
pour lier des variables de chaîne. Ensuite, utilisez la fonction mysqli_stmt_execute()
pour exécuter la requête. 🎜🎜Pour résumer, la fuite de données est importante pour empêcher les attaques par injection SQL dans les applications Web. En PHP, vous pouvez utiliser la fonction addslashes()
ou mysqli_real_escape_string()
pour échapper des chaînes. Dans les instructions SQL, vous pouvez utiliser des requêtes paramétrées ou des instructions préparées pour empêcher les attaques par injection. Dans tous les cas, vous pouvez améliorer la sécurité de vos applications Web. 🎜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!