È possibile impedire le iniezioni SQL in Node.js (preferibilmente con un modulo) nello stesso modo in cui PHP aveva istruzioni preparate che le proteggevano.
Se é cosi, come? In caso contrario, quali sono alcuni esempi che potrebbero aggirare il codice che ho fornito (vedi sotto).
Alcuni contesti:
Sto realizzando un'applicazione web con uno stack back-end costituito da Node.js + MySql utilizzando il modulo node-mysql . Dal punto di vista dell'usabilità, il modulo è grande, ma non ha ancora attuato qualcosa di simile al PHP prepared statement (anche se sono consapevoli che è sul todo ).
Dalla mia comprensione, l'implementazione di istruzioni preparate da parte di PHP, tra le altre cose, ha aiutato molto nella prevenzione delle SQL injection. Sono preoccupato, tuttavia, che la mia app node.js possa essere aperta ad attacchi simili, anche con l'escape della stringa fornito per impostazione predefinita (come nello snippet di codice di seguito).
node-mysql sembra essere il connettore mysql più popolare per node.js, quindi mi chiedevo cosa potrebbero fare gli altri (semmai) per tenere conto di questo problema - o se è anche un problema con node.js per cominciare (non sono sicuro di come ciò non sarebbe, poiché è coinvolto l'input lato utente / client).
Devo passare a node-mysql-native per il momento, poiché fornisce istruzioni preparate? Sono riluttante a farlo, perché non sembra essere attivo come node-mysql (anche se ciò potrebbe significare solo che è completo).
Ecco uno snippet del codice di registrazione dell'utente, che utilizza il modulo sanitizer , insieme alla sintassi simile a un'istruzione preparata da node-mysql (che, come accennato in precedenza, esegue l'escape dei caratteri), per prevenire rispettivamente lo scripting cross site e le iniezioni sql:
// 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?
});