2017-09-22 4 views
1

Selon MySQL package documentation de Node.js:Les fonctions d'échappement dans le paquetage mysql Node.js sont-elles suffisantes pour interroger de manière sécurisée une base de données mysql (sans l'utilisation d'instructions préparées)?

Afin d'éviter des attaques par injection SQL, vous devez toujours échapper à toutes les données fournis par l'utilisateur avant de l'utiliser dans une requête SQL. Vous pouvez le faire en utilisant les méthodes mysql.escape(), connection.escape() ou pool.escape().

Je ne trouve aucune documentation/référence à l'utilisation d'instructions préparées avec mysql, sauf dans une référence à l'utilisation de '?' personnages. Il indique ce qui suit:

Vous pouvez également utiliser? caractères comme des espaces réservés pour les valeurs que vous aimeriez avoir échappé ...

Cela ressemble à des instructions préparées dans MySQL, mais il vraiment utilise simplement la même méthode connection.escape() en interne.

De mon expérience à parler à d'autres développeurs, le consensus général dans la communauté des développeurs est que les déclarations préparées sont SEULEMENT moyen sûr d'effectuer des requêtes MySQL de Node.js cependant, comme vous pouvez le voir avec la paquet mysql, il n'y a pas de support évident pour les instructions préparées. Cependant, il est indiqué que leur méthode pour éviter l'injection SQL est via l'utilisation des fonctions d'échappement.

Ma question:

sont les fonctions d'échappement du paquet mysql suffisant pour interroger une base de données en toute sécurité de MySQL (sans l'utilisation d'instructions préparées)?

Répondre

1

L'échappement est en fait tout aussi sûr que l'utilisation de requêtes paramétrées, si vous le faites de manière cohérente.

Mais il est recommandé d'utiliser des paramètres car cela simplifie le code. Par conséquent, les développeurs sont probablement plus susceptibles de le faire.

Si la bibliothèque Node.js le rend aussi pratique que les paramètres, mais l'implémente en interne en modifiant les chaînes de requête, en remplaçant les marques ? par les valeurs des paramètres, alors vous êtes bon.

Pour ce que ça vaut, le pilote MySQL de Python le fait aussi, ainsi que l'extension PDO de PHP lorsque l'option "emulate preparees" est activée. Tant que ces bibliothèques sont bien testées, elles devraient être sûres. FWIW, l'échappement et les paramètres sont limités dans la prévention d'injection SQL, car dans les deux cas, vous ne pouvez protéger que les valeurs que vous associeriez à votre requête SQL. Vous ne pouvez pas protéger les identifiants (comme les noms de tables ou les noms de colonnes), les mots-clés ou les expressions SQL, etc. Dans ce cas, veillez à vérifier tout contenu dynamique avant de le combiner avec votre requête SQL.

Voir aussi: