防止SQL注入

假设您想根据来自命令行中参数的待办事项查询待办事项,您可能会想到以下代码:

let mysql = require('mysql');
let config = require('./config.js');

let connection = mysql.createConnection(config);

let id = process.argv[2]; // pass argument to query
let sql = `SELECT * FROM todos WHERE id=` + id ;

connection.query(sql, (error, results, fields) => {
  if (error) {
    return console.error(error.message);
  }
  console.log(results);
});

connection.end();

让我们选择ID为1的待办事项:

>node select.js 1
    [ RowDataPacket { id: 1, title: 'Learn how to insert a new row', completed: 1 } ]

它可以正常工作。
但是,存在一个问题,可疑用户可能通过在参数中传递SQL代码来利用程序。

为了防止这种SQL注入,您需要使用上一个示例中的占位符(?),或使用mysql或连接对象的escape()方法,如下所示:

let sql = `SELECT * FROM todos WHERE id = ` + mysql.escape(id);

在本教程中,您学习了如何从node.js程序查询MySQL数据库中的数据。

执行一个简单的查询

以下select.js程序从todoapp数据库的todos表中选择所有数据:

let mysql = require('mysql');
let config = require('./config.js');

let connection = mysql.createConnection(config);

let sql = `SELECT * FROM todos`;
connection.query(sql, (error, results, fields) => {
  if (error) {
    return console.error(error.message);
  }
  console.log(results);
});

connection.end();

让我们运行select.js程序。

>node select.js
[ RowDataPacket { id: 1, title: 'Learn how to insert a new row', completed: 1 },
  RowDataPacket { id: 2, title: 'Insert a new row with placeholders', completed:0 },
  RowDataPacket { id: 3, title: 'Insert multiple rows at a time', completed: 0 },
  RowDataPacket { id: 4, title: 'It should work perfectly', completed: 1 } ]

它按预期返回了4行。

从Node.js查询MySQL数据库中的数据

简介:在本教程中,您将学习如何从node.js应用程序中查询MySQL表中的数据。

从node.js应用程序查询MySQL数据库中数据的步骤如下:

  • 建立与MySQL数据库服务器的连接。

  • 执行SELECT语句并处理结果集。

  • 关闭数据库连接。

将数据传递给查询

以下select2.js程序仅选择完成的待办事项:

let mysql = require('mysql');
let config = require('./config.js');

let connection = mysql.createConnection(config);

let sql = `SELECT * FROM todos WHERE completed=?`;
connection.query(sql, [true], (error, results, fields) => {
  if (error) {
    return console.error(error.message);
  }
  console.log(results);
});

connection.end();

在本示例中,我们使用问号(?)作为已完成字段的占位符值。

当我们调用query()方法时,我们传递了一个数组作为第二个参数。
占位符将按顺序替换为数组的值。

>node select2.js
[ RowDataPacket { id: 1, title: 'Learn how to insert a new row', completed: 1 },
  RowDataPacket { id: 4, title: 'It should work perfectly', completed: 1 } ]

select2.js程序返回两行,其中完成的列为1,这意味着在Node.js中为true

日期:2019-11-20 08:52:40 来源:oir作者:oir