Maison  >  Article  >  interface Web  >  Méthodes pour empêcher l'injection SQL dans node-mysql

Méthodes pour empêcher l'injection SQL dans node-mysql

不言
不言original
2018-06-30 11:38:542889parcourir

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.


Méthode 2 : Utiliser l'espace réservé du paramètre de requête de connection.query() :


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éthode est automatiquement appelée en interne pour encoder les paramètres entrants. Par exemple :

connection.escape()

Le programme ci-dessus peut également être réécrit comme suit :

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'

Méthode 3 : Utilisez escapeId() pour encoder l'identifiant de la requête SQL :
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()

Par exemple :

mysql.escapeId(identifier)
connection.escapeId(identifier)
pool.escapeId(identifier)

Méthode 4 : Utiliser mysql.format() pour échapper aux paramètres :
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()

Ce qui précède représente l'intégralité du contenu de cet article. J'espère qu'il sera utile à l'étude de chacun. Pour plus de contenu connexe, veuillez suivre le site Web PHP chinois !

Recommandations associées :
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 la différence entre fs.stat et fs.fstat dans node.js

Format de données de formulaire NodeJs transmission Méthode de fichier

À 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!

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