Dans le développement de PHP, la prévention des attaques d'injection SQL est une pratique de sécurité cruciale. L'utilisation d'instructions préparées et de paramètres de liaison est l'une des façons les plus recommandées à l'heure actuelle. Parmi eux, bien que la fonction mysqli_stmt :: att_get ne soit pas aussi directe que les paramètres de liaison utilisés, il a également une signification positive pour améliorer la sensibilisation à la sécurité des développeurs et les compétences dans le processus de compréhension de son rôle et de ses principes. Cet article introduira le rôle de MySQLI_STMT :: ATTR_GET et expliquera son rôle auxiliaire dans la prévention de l'injection SQL.
mysqli_stmt :: att_get est une fonction utilisée pour obtenir la valeur d'attribut de l'objet instruction actuel. Son objectif principal est de vérifier ou d'obtenir les valeurs de certaines propriétés internes lors de l'utilisation de l'objet mysqli_stmt pour un traitement ou un débogage supplémentaire.
La syntaxe est la suivante:
public mysqli_stmt::attr_get(int $attribute): int|false
Où $ attribut est l'attribut que vous souhaitez obtenir, comme MySQLI_STMT_ATTR_UPDATE_MAX_LENGTH , et la valeur de retour est la valeur actuelle de l'attribut, ou il renvoie false en cas de défaillance.
Bien que MySQLI_STMT :: ATTR_GET lui-même n'empêche pas directement l'injection SQL, cela ressemble plus à un outil de débogage, mais dans le processus d'utilisation des instructions de prétraitement, il peut aider les développeurs à vérifier l'état sûr de l'exécution de l'instruction ou à l'utiliser pour confirmer que la liaison de paramètre est efficace. Plus important encore, il rend les développeurs habitués progressivement à fonctionner via l'objet mysqli_stmt , loin de la méthode d'écriture à haut risque d'épissage directement SQL.
Ci-dessous, nous utilisons un exemple d'utilisation des instructions de prétraitement pour illustrer comment empêcher l'injection de SQL via une méthode régulière et démontrer comment utiliser ATTR_GET pour la vérification des attributs.
Supposons que nous ayons un système de connexion utilisateur et que le front-end soumet le nom d'utilisateur, nous devons interroger les enregistrements dans la base de données en fonction de ce nom d'utilisateur.
$username = $_GET['username'];
$sql = "SELECT * FROM users WHERE username = '$username'";
$result = $mysqli->query($sql);
Si le nom d'utilisateur entré par l'utilisateur est admin '- , le SQL ci-dessus sera épissé comme:
SELECT * FROM users WHERE username = 'admin' --'
Cela saute la vérification du mot de passe, provoquant de graves vulnérabilités de sécurité.
$mysqli = new mysqli("localhost", "user", "password", "database");
$stmt = $mysqli->prepare("SELECT * FROM users WHERE username = ?");
$stmt->bind_param("s", $_GET['username']);
$stmt->execute();
$result = $stmt->get_result();
// Facultatif:Vérifier une valeur de propriété
$attr = $stmt->attr_get(MYSQLI_STMT_ATTR_UPDATE_MAX_LENGTH);
if ($attr !== false) {
// Valeur d'attribut de sortie,Utilisé pour déboguer ou vérifier le comportement des déclarations
echo "Attributs de l'instruction actuelle:$attr";
}
Dans le code ci-dessus:
Prepare () crée un modèle SQL précompilé.
bind_param () lie l'entrée utilisateur en tant que paramètres et ne sera pas analysé en tant que code SQL.
ATTR_GET () peut être utilisé pour obtenir des attributs d'instruction, ce qui peut aider les développeurs à juger l'état de comportement actuel de l'objet de déclaration dans certains scénarios.
Supposons que nous voulons obtenir les paramètres du nom d'utilisateur à partir d'une page où le formulaire est soumis https://m66.net/login.php et interrogez les informations de l'utilisateur:
<form action="https://m66.net/login.php" method="get">
<input type="text" name="username" />
<input type="submit" value="Se connecter" />
</form>
Code de traitement côté serveur:
$mysqli = new mysqli("localhost", "user", "password", "database");
$stmt = $mysqli->prepare("SELECT id, email FROM users WHERE username = ?");
$stmt->bind_param("s", $_GET['username']);
$stmt->execute();
$result = $stmt->get_result();
while ($row = $result->fetch_assoc()) {
echo "utilisateurID:" . $row['id'] . "<br>";
echo "Mail:" . $row['email'] . "<br>";
}
// utiliser attr_get Vérifier les propriétés
$attr = $stmt->attr_get(MYSQLI_STMT_ATTR_UPDATE_MAX_LENGTH);
if ($attr !== false) {
error_log("stmt propriété:$attr", 0);
}
Bien que MySQLI_STMT :: ATTR_GET ne soit pas une fonction qui empêche directement l'injection SQL, il s'agit d'un outil puissant pour comprendre l'état des objets d'instruction dans le contexte des requêtes paramétrées à l'aide de l'interface MySQLI_STMT . Combiné avec Pread () et Bind_param () , il aide non seulement à construire des requêtes sécurisées, mais améliore également la débogabilité et la robustesse du code. Les développeurs doivent toujours donner la priorité à l'utilisation de requêtes paramétrées et à utiliser des fonctions d'outil telles que ATTR_GET pour améliorer davantage le contrôle de transparence et de sécurité du code.