Node.js:防止 SQL 查询来自 SQL 注入
Node.js: Preventing SQL Queries from SQL Injections
我正在使用 AWS Lambda 和 API 网关开发 REST API Node.js。我正在使用 MySQL 数据库。我是 Java 人,对 Node.JS 还很陌生。刚满一天。
我意识到有多种方法可以防止 Node.js 中的 SQL 注入。下面是我的代码
const mysql = require('mysql');
const PropertiesReader = require('properties-reader');
const prop = PropertiesReader('properties.properties');
const con = mysql.createConnection({
host : prop.get('server.host'),
user : prop.get("server.username"),
password : prop.get("server.password"),
port : prop.get("server.port"),
database : prop.get("server.dbname")
});
exports.getRoleByID = (event, context, callback) => {
const { id } = event.queryStringParameters;
console.log("id", id);
// allows for using callbacks as finish/error-handlers
context.callbackWaitsForEmptyEventLoop = false;
const sql = "select * from role where idrole = ?";
con.query(sql, [id], function (err, result) {
if (err) throw err;
var response = {
"statusCode": 200,
"headers": {
"Content-Type": "application/json"
},
"body": JSON.stringify(result),
"isBase64Encoded": false
};
callback(null, response)
});
};
如您所见,我正在使用 ?
应用 SQL 注入保护。但我也注意到,做这样的事情会给予保护
var sql = 'SELECT * FROM users WHERE id = ' + connection.escape(userId);
使用哪种方式来保护代码免受 SQL 注入?我用的方式还是connetion.escape()
的方式?或者其他方式?
使用 ?
占位符更易于读写,并且可能会提供更高的性能,因为参数可以更有效地编码(例如,数字可以作为二进制表示形式通过网络发送,而不是字符串)。
我正在使用 AWS Lambda 和 API 网关开发 REST API Node.js。我正在使用 MySQL 数据库。我是 Java 人,对 Node.JS 还很陌生。刚满一天。
我意识到有多种方法可以防止 Node.js 中的 SQL 注入。下面是我的代码
const mysql = require('mysql');
const PropertiesReader = require('properties-reader');
const prop = PropertiesReader('properties.properties');
const con = mysql.createConnection({
host : prop.get('server.host'),
user : prop.get("server.username"),
password : prop.get("server.password"),
port : prop.get("server.port"),
database : prop.get("server.dbname")
});
exports.getRoleByID = (event, context, callback) => {
const { id } = event.queryStringParameters;
console.log("id", id);
// allows for using callbacks as finish/error-handlers
context.callbackWaitsForEmptyEventLoop = false;
const sql = "select * from role where idrole = ?";
con.query(sql, [id], function (err, result) {
if (err) throw err;
var response = {
"statusCode": 200,
"headers": {
"Content-Type": "application/json"
},
"body": JSON.stringify(result),
"isBase64Encoded": false
};
callback(null, response)
});
};
如您所见,我正在使用 ?
应用 SQL 注入保护。但我也注意到,做这样的事情会给予保护
var sql = 'SELECT * FROM users WHERE id = ' + connection.escape(userId);
使用哪种方式来保护代码免受 SQL 注入?我用的方式还是connetion.escape()
的方式?或者其他方式?
使用 ?
占位符更易于读写,并且可能会提供更高的性能,因为参数可以更有效地编码(例如,数字可以作为二进制表示形式通过网络发送,而不是字符串)。