在Node.js中,防止SQL注入的最佳实践是使用参数化查询或预编译语句。这些方法可以确保用户输入的数据不会被解释为SQL代码的一部分,从而有效地防止SQL注入攻击。以下是一些建议:
例如,使用mysql库的参数化查询:
const mysql = require('mysql');
const connection = mysql.createConnection({
host: 'localhost',
user: 'your_user',
password: 'your_password',
database: 'your_database'
});
connection.connect();
const userId = '1; DROP TABLE users; --';
const query = 'SELECT * FROM users WHERE id = ?';
connection.query(query, [userId], (error, results, fields) => {
if (error) throw error;
console.log(results);
});
connection.end();
例如,使用pg库的预编译语句:
const { Client } = require('pg');
const client = new Client({
host: 'localhost',
user: 'your_user',
password: 'your_password',
database: 'your_database'
});
client.connect();
const userId = '1; DROP TABLE users; --';
const query = 'SELECT * FROM users WHERE id = $1';
client.query(query, [userId], (error, results) => {
if (error) throw error;
console.log(results.rows);
});
client.end();
例如,使用Sequelize库:
const { Sequelize, DataTypes } = require('sequelize');
const sequelize = new Sequelize('your_database', 'your_user', 'your_password', {
host: 'localhost',
dialect: 'mysql'
});
const User = sequelize.define('User', {
id: {
type: DataTypes.INTEGER,
primaryKey: true,
autoIncrement: true
},
name: DataTypes.STRING
});
(async () => {
await sequelize.sync();
const userId = '1; DROP TABLE users; --';
const users = await User.findAll({
where: {
id: userId
}
});
console.log(users);
})();
总之,遵循以上建议,使用参数化查询、预编译语句或ORM库,可以有效地防止Node.js应用程序中的SQL注入攻击。