MST
星途 面试题库

面试题:Node.js 中如何防范 SQL 注入攻击

在 Node.js 项目中,如果使用数据库(如 MySQL ),请描述如何通过合适的方法防范 SQL 注入攻击。请举例说明使用的库以及关键代码实现。
14.8万 热度难度
前端开发Node.js

知识考点

AI 面试

面试题答案

一键面试
  1. 使用参数化查询(占位符)
    • 使用的库:在Node.js中操作MySQL,常用的库是mysql2
    • 安装库
npm install mysql2
  • 关键代码示例
const mysql = require('mysql2');

// 创建连接池
const pool = mysql.createPool({
  host: 'localhost',
  user: 'root',
  password: 'password',
  database: 'test',
  waitForConnections: true,
  connectionLimit: 10,
  queueLimit: 0
});

// 准备SQL语句,使用占位符
const sql = 'SELECT * FROM users WHERE username =? AND password =?';
const values = ['testUser', 'testPassword'];

pool.query(sql, values, (err, results, fields) => {
  if (err) throw err;
  console.log(results);
});
  1. 对输入数据进行严格校验和过滤
    • 关键代码示例
// 假设使用express框架接收输入数据
const express = require('express');
const app = express();
app.use(express.json());

// 模拟校验函数,简单示例,实际应用需更严格
function validateUsername(username) {
  return /^[a-zA-Z0-9_]{3,20}$/.test(username);
}

function validatePassword(password) {
  return /^.{6,20}$/.test(password);
}

app.post('/login', (req, res) => {
  const { username, password } = req.body;
  if (!validateUsername(username) ||!validatePassword(password)) {
    return res.status(400).send('Invalid input');
  }
  // 继续执行数据库查询操作
});
  1. 使用ORM(对象关系映射)
    • 使用的库Sequelize是一个流行的ORM库。
    • 安装库
npm install sequelize mysql2
  • 关键代码示例
const { Sequelize, DataTypes } = require('sequelize');

// 创建Sequelize实例
const sequelize = new Sequelize('test', 'root', 'password', {
  host: 'localhost',
  dialect:'mysql'
});

// 定义模型
const User = sequelize.define('user', {
  username: DataTypes.STRING,
  password: DataTypes.STRING
});

// 查询示例
User.findOne({
  where: {
    username: 'testUser',
    password: 'testPassword'
  }
}).then(user => {
  console.log(user);
}).catch(err => {
  console.error(err);
});