Maison >base de données >tutoriel mysql >Comment puis-je utiliser en toute sécurité l'extension MySQL en PHP pour éviter les injections SQL et autres pièges ?

Comment puis-je utiliser en toute sécurité l'extension MySQL en PHP pour éviter les injections SQL et autres pièges ?

Susan Sarandon
Susan Sarandonoriginal
2024-12-12 13:27:10124parcourir

How Can I Securely Use the MySQL Extension in PHP to Avoid SQL Injection and Other Pitfalls?

Requêtes MySQL sécurisées avec l'extension MySQL

Introduction

Malgré la prévalence du PDO, la famille de fonctions mysql_* reste un choix courant pour l'interaction avec les bases de données PHP. Bien que cette bibliothèque soit parfaitement sûre lorsqu'elle est utilisée correctement, son utilisation entraîne souvent des problèmes de sécurité et techniques. Cet article fournit un exemple de code parfait qui montre comment utiliser l'extension MySQL en toute sécurité.

Éviter les pièges courants

Les fonctions mysql_* sont connues pour plusieurs problèmes courants, notamment :

  • Injection SQL
  • Gestion des erreurs problèmes
  • Injection de scripts intersites (XSS)

Exemple de code

L'exemple de code suivant implémente un script PHP simple qui met à jour un ligne de table de base de données basée sur des variables POST tout en atténuant les risques ci-dessus :

<?php

header('Content-type: text/html; charset=utf-8');
error_reporting(E_ALL | E_STRICT);
ini_set('display_errors', 1);

$config = array(
    'host' => '127.0.0.1',
    'user' => 'my_user',
    'pass' => 'my_pass',
    'db' => 'my_database'
);

$connection = @mysql_connect($config['host'], $config['user'], $config['pass']);

if (!$connection) {
    trigger_error('Unable to connect to database: ' . mysql_error(), E_USER_ERROR);
}

if (!mysql_select_db($config['db'])) {
    trigger_error('Unable to select db: ' . mysql_error(), E_USER_ERROR);
}

if (!mysql_set_charset('utf8')) {
    trigger_error('Unable to set charset for db connection: ' . mysql_error(), E_USER_ERROR);
}

$result = mysql_query(
    'UPDATE tablename SET name = "' . mysql_real_escape_string($_POST['name']) . '" WHERE id = "' . mysql_real_escape_string($_POST['id']) . '"'
);

if ($result) {
    echo htmlentities($_POST['name'], ENT_COMPAT, 'utf-8') . ' updated.';
} else {
    trigger_error('Unable to update db: ' . mysql_error(), E_USER_ERROR);
}
?>

Clé Caractéristiques

  • Gestion des erreurs : Les erreurs sont capturées et signalées avec trigger_error(), supprimant les messages d'erreur détaillés en mode production.
  • SQL prévention des injections : les valeurs POST sont échappées à l'aide de mysql_real_escape_string() pour empêcher l'injection SQL attaques.
  • Prise en charge d'Unicode : La connexion à la base de données est configurée pour prendre en charge Unicode.
  • Mode de production : Les messages d'erreur peuvent être supprimés en définissant display_errors sur 0 en production mode.

Conclusion

Cet exemple de code fournit une base solide pour des requêtes MySQL sécurisées utilisant la famille de fonctions mysql_*. Il résout les pièges courants en implémentant une gestion appropriée des erreurs, en empêchant l'injection SQL et en prenant en charge Unicode. En adoptant ces pratiques, les développeurs peuvent écrire des applications basées sur des bases de données sécurisées et fiables.

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:
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