108 votes

Prévention de l'injection SQL dans Node.js

Est-il possible d'empêcher les injections SQL dans Node.js (de préférence avec un module) de la même manière que PHP avait des instructions préparées qui les protégeaient.

Si oui, comment ? Si non, quels sont les exemples qui pourrait contourner le code que j'ai fourni (voir ci-dessous).


Un peu de contexte :

Je suis en train de créer une application web avec une pile back-end composée de Node.js + MySql en utilisant l'outil de gestion de l'application. node-mysql module. Du point de vue de la facilité d'utilisation, le module est excellent, mais il n'a pas encore implémenté quelque chose de similaire à la fonction de PHP Déclarations préparées (bien que je sois conscient que c'est sur le site de la Commission européenne). todo ).

D'après ce que j'ai compris, PHP met en œuvre des déclarations préparées, entre autres choses, a beaucoup aidé dans la prévention des injections SQL. Je crains cependant que mon application node.js ne soit ouverte à des attaques similaires, même avec l'échappement des chaînes fourni par défaut (comme dans l'extrait de code ci-dessous).

node-mysql semble être le connecteur mysql le plus populaire pour node.js, donc je me demandais ce que d'autres personnes pourraient faire (le cas échéant) pour tenir compte de ce problème - ou si c'est même un problème avec node.js pour commencer (je ne vois pas comment ce ne serait pas, puisque l'entrée côté utilisateur/client est impliquée).

Dois-je passer à node-mysql-native pour l'instant, puisqu'il fournit des déclarations préparées ? J'hésite à le faire, car il ne semble pas être aussi actif que node-mysql (bien que cela puisse simplement signifier qu'il est complet).

Voici un extrait du code d'enregistrement de l'utilisateur, qui utilise la balise désinfectant ainsi que la syntaxe de type déclaration préparée de node-mysql (qui, comme je l'ai mentionné plus haut, permet l'échappement des caractères), afin d'empêcher les scripts intersites et les injections sql, respectivement :

// Prevent xss
var clean_user = sanitizer.sanitize(username);

// assume password is hashed already
var post = {Username: clean_user, Password: hash};

// This just uses connection.escape() underneath
var query = connection.query('INSERT INTO users SET ?', post,
   function(err, results)
   {
       // Can a Sql injection happen here?
   });

-1voto

Bird Dad Points 95

Le plus simple est de gérer toutes les interactions avec la base de données dans son propre module que vous exportez vers vos routes. Si votre route n'a pas de contexte de la base de données, alors SQL ne peut pas y toucher de toute façon.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X