NodeJS 如何防止SQL注入?

q9yhzks0  于 12个月前  发布在  Node.js
关注(0)|答案(2)|浏览(143)

假设我有下面的代码,其中studentId来自用户输入,

const sql  = 'select Name from student where Id = ' + studentId;
connection.exec(sql)

上面的代码很容易被SQL注入。我想知道下面的两个选项是否都可以解决SQL注入攻击,并且是相同的。

选项1.使用PL/SQL变量声明,将用户输入与模板绑定

const sql  = `DECLARE @Id=${studentId}; select Name from student where Id = @Id;`;
connection.exec(sql)

选项2.使用库提供的参数选项

const sql  = 'select Name from student where Id = @Id;';
parameters.add({name: Id, value: studentId})
connection.exec(sql,parameters)
u7up0aaq

u7up0aaq1#

最好的方法是使用对象连接的执行函数,发送请求和参数。

function prepareSQL() {
  const sql = `INSERT INTO USERS VALUES (@val1, @val2)`;

  const request = new Request(sql, (err, rowCount) => {
    if (err) {
      throw err;
    }

  });

  // Must add parameters
  request.addParameter('val1', TYPES.Int);
  request.addParameter('val2', TYPES.Int);

  request.on('prepared', () => {
    console.log('request prepared');
    executePreparedSQL(request);
  });

  connection.prepare(request);
}

function executePreparedSQL(request) {
  connection.execute(request, { val1: 1, val2: 2 });

  request.on('requestCompleted', () => {
    console.log('DONE!');
    connection.close();
  });
}

你可以在这里看到这个例子。
关于函数execute的更多信息请参见官方文档。

omtl5h9j

omtl5h9j2#

假设studentId的值类似于:
return“1; DROP TABLE some_table”
案例1容易受到SQL注入的攻击,因为它也只是一种字符串连接的形式。在这种情况下,生成的SQL查询将是
return 1; DROP TABLE some_table;从学生中选择姓名,其中ID = @ID;
因此,情况2始终是首选,因为它使用绑定参数

相关问题