Tout le monde sait que l'injection SQL est un problème très dangereux pour les sites Web ou les serveurs. Si cet aspect n'est pas bien géré, le site Web peut être injecté à tout moment, c'est pourquoi cet article résume les problèmes dans node-mysql. reportez-vous à plusieurs pratiques courantes pour empêcher l’injection SQL.
Introduction à l'injection SQL
L'injection SQL est l'une des méthodes d'attaque réseau les plus courantes. Elle n'utilise pas le BUG du système d'exploitation. pour mettre en œuvre l'attaque. Au lieu de cela, elle vise la négligence du programmeur dans la programmation, via des instructions SQL, pour se connecter sans compte, et même falsifier la base de données.
Empêcher l'injection SQL dans node-mysql
Afin d'empêcher l'injection SQL, vous pouvez encoder les paramètres passés en SQL au lieu de directement String enchaînement. Dans node-mysql, il existe quatre méthodes courantes pour empêcher l'injection SQL :
Méthode 1 : utilisez escape() pour encoder les paramètres entrants :
Il existe trois méthodes d'encodage des paramètres :
mysql.escape(param) connection.escape(param) pool.escape(param)
Par exemple :
var userId = 1, name = 'test'; var query = connection.query('SELECT * FROM users WHERE id = ' + connection.escape(userId) + ', name = ' + connection.escape(name), function(err, results) { // ... }); console.log(query.sql); // SELECT * FROM users WHERE id = 1, name = 'test'
Les règles d'encodage pour la méthode escape() sont les suivantes :
Les nombres ne sont pas convertis
Booléens convertis en vrai/faux ;
Objet date converti en chaîne 'AAAA-mm-jj HH:ii:ss'
Tampons convertis ; en chaînes hexadécimales, telles que Convertir en 'a', 'b';
Le tableau multidimensionnel est converti en une liste de groupes, telle que [['a', 'b'], ['c ', 'd']] sera converti Pour 'a', 'b'), ('c', 'd');
Les objets seront convertis en paires clé=valeur. Les objets imbriqués sont convertis en chaînes ;
undefined/null sera converti en NULL ;
MySQL ne prend pas en charge NaN/Infinity et déclenchera une erreur MySQL.
Peut être utilisé comme espace réservé du paramètre de requête ? . Lors de l'utilisation d'espaces réservés pour les paramètres de requête, la méthodeest automatiquement appelée en interne pour encoder les paramètres entrants.Par exemple :
connection.escape()
var userId = 1, name = 'test'; var query = connection.query('SELECT * FROM users WHERE id = ?, name = ?', [userId, name], function(err, results) { // ... }); console.log(query.sql); // SELECT * FROM users WHERE id = 1, name = 'test'
var post = {userId: 1, name: 'test'}; var query = connection.query('SELECT * FROM users WHERE ?', post, function(err, results) { // ... }); console.log(query.sql); // SELECT * FROM users WHERE id = 1, name = 'test'
Si vous ne faites pas confiance au Identifiant SQL transmis par l'utilisateur (base de données, table, nom du personnage), vous pouvez utiliser la méthode escapeId() pour encoder. Le plus couramment utilisé pour le tri, etc.propose les trois méthodes suivantes avec des fonctions similaires :
escapeId()
mysql.escapeId(identifier) connection.escapeId(identifier) pool.escapeId(identifier)
var sorter = 'date'; var sql = 'SELECT * FROM posts ORDER BY ' + connection.escapeId(sorter); connection.query(sql, function(err, results) { // ... });
Préparer la requête, la fonction sélectionnera Le paramètre d'échappement de la méthode d'échappement appropriéest utilisé pour préparer l'instruction de requête, et la fonction sélectionnera automatiquement la méthode d'échappement appropriée pour le paramètre.Par exemple :
mysql.format()
var userId = 1; var sql = "SELECT * FROM ?? WHERE ?? = ?"; var inserts = ['users', 'id', userId]; sql = mysql.format(sql, inserts); // SELECT * FROM users WHERE id = 1
À propos de l'encodage, du décodage et du traitement tronqué des caractères côté serveur Nodejs
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!