使用 Nodejs 和 Postgres 防止 SQL 注入
Prevent SQL Injection with Nodejs and Postgres
我正在开发一个后端来与 PostgreSQL 数据库交互,并且正在寻找一些帮助来防止 SQL 注入。我了解 SQL 注入的概念,并在网上找到了一些防止这些攻击的示例,但不确定 SQL 提供商之间的预防技术是否不同。
这是我用来查询数据的函数:
var pg = require("pg");
var client = new pg.Client(connectionString);
client.connect();
module.exports = async function newQuery(query) {
var result = await client.query({
rowMode: 'array',
text: query
});
return result.rows
}
下面是一些使用该函数的标准查询 (query()
):
SELECT
query("SELECT profilename, profiledescription, approved FROM profiledb
WHERE usercompany='"+ req.query.userCompany +"';").then(data => {
res.send(data)
})
更新
query("UPDATE profiledb SET approved='Approved' WHERE id='"+ req.query.id +"';").then(data =>
res.send(data)
)
插入
query("INSERT INTO profiledb (profilename, profiledescription, approved) VALUES ('"+
req.query.profileTitle +"', '"+ req.query.profileBody +"', 'Pending');");
我可以使用什么代码来查询数据而不冒 SQL 注入攻击的风险。
谢谢!!!
使用 parameterized query and pass your request arguments as values
.
module.exports = async function newQuery(query, values) {
var result = await client.query({
rowMode: 'array',
text: query,
values
});
return result.rows
}
query("SELECT profilename, profiledescription, approved FROM profiledb WHERE usercompany=;", [req.query.userCompany]).then(data => {
res.send(data)
});
query("UPDATE profiledb SET approved='Approved' WHERE id=;", [req.query.id]).then(data => {
res.send(data)
})
query("INSERT INTO profiledb (profilename, profiledescription, approved) VALUES (, , 'Pending');", [req.query.profileTitle, req.query.profileBody]);
您应该使用参数化查询或准备好的语句,只是永远不要自己连接字符串。
这个特定库的文档很好,所以我建议您更详细地阅读它们。
查询示例:docs and client.query signature: example
您的查询可以这样写:
query("SELECT profilename, profiledescription, approved FROM profiledb
WHERE usercompany = ", [req.query.userCompany]).then(...)
同样适用于更新和插入等。
或者你可以只传递一个具有属性的对象:像这样的文本和值
const queryOpts = {
text: "SELECT profilename, profiledescription, approved FROM profiledb WHERE usercompany = ",
values: [req.query.userCompany]
}
query(queryOpts).then(...)
我正在开发一个后端来与 PostgreSQL 数据库交互,并且正在寻找一些帮助来防止 SQL 注入。我了解 SQL 注入的概念,并在网上找到了一些防止这些攻击的示例,但不确定 SQL 提供商之间的预防技术是否不同。
这是我用来查询数据的函数:
var pg = require("pg");
var client = new pg.Client(connectionString);
client.connect();
module.exports = async function newQuery(query) {
var result = await client.query({
rowMode: 'array',
text: query
});
return result.rows
}
下面是一些使用该函数的标准查询 (query()
):
SELECT
query("SELECT profilename, profiledescription, approved FROM profiledb
WHERE usercompany='"+ req.query.userCompany +"';").then(data => {
res.send(data)
})
更新
query("UPDATE profiledb SET approved='Approved' WHERE id='"+ req.query.id +"';").then(data =>
res.send(data)
)
插入
query("INSERT INTO profiledb (profilename, profiledescription, approved) VALUES ('"+
req.query.profileTitle +"', '"+ req.query.profileBody +"', 'Pending');");
我可以使用什么代码来查询数据而不冒 SQL 注入攻击的风险。
谢谢!!!
使用 parameterized query and pass your request arguments as values
.
module.exports = async function newQuery(query, values) {
var result = await client.query({
rowMode: 'array',
text: query,
values
});
return result.rows
}
query("SELECT profilename, profiledescription, approved FROM profiledb WHERE usercompany=;", [req.query.userCompany]).then(data => {
res.send(data)
});
query("UPDATE profiledb SET approved='Approved' WHERE id=;", [req.query.id]).then(data => {
res.send(data)
})
query("INSERT INTO profiledb (profilename, profiledescription, approved) VALUES (, , 'Pending');", [req.query.profileTitle, req.query.profileBody]);
您应该使用参数化查询或准备好的语句,只是永远不要自己连接字符串。 这个特定库的文档很好,所以我建议您更详细地阅读它们。
查询示例:docs and client.query signature: example
您的查询可以这样写:
query("SELECT profilename, profiledescription, approved FROM profiledb
WHERE usercompany = ", [req.query.userCompany]).then(...)
同样适用于更新和插入等。 或者你可以只传递一个具有属性的对象:像这样的文本和值
const queryOpts = {
text: "SELECT profilename, profiledescription, approved FROM profiledb WHERE usercompany = ",
values: [req.query.userCompany]
}
query(queryOpts).then(...)