在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注入攻擊。