![](/img/trans.png)
[英]prepared statements on nodejs not working (with node-postgres)
[英]node-postgres prepared statement - sql injection
我是node-postgres的新手,并且在尝试确保准备好的语句无法进行sql注入时无法解决此错误。
这是代码片段
// the prepared statement
var preparedstatement = client.query({
text: "select ST_AsText(ST_Transform(geodata,4326)) from table_name where ST_Contains(ST_GeomFromText($1,4326),table_name.geodata)",
values: ["POINT(Lat Long)"],
name: 'where'
});
// the query
var queryresult = client.query({name: 'where', values: [msg]},["'; DROP TABLE user;"], function(err) {
if (err) {
socket.emit('query error', String(err));
}
});
每当我输入地理数据时(作为使用socket.io来自客户端的消息),socket.emit都会返回一条错误消息,指出
无效的几何
但是,当我从代码中删除["'; DROP TABLE user;"],
代码工作正常
// the query
var queryresult = client.query({name: 'where', values: [msg]}, function(err) {
if (err) {
socket.emit('query error', String(err));
}
});
(以上)效果很好。 任何帮助我了解我在这里做错事情的帮助都将非常有用。
var preparedstatement = client.query({
text: "select ST_AsText(ST_Transform(geodata,4326)) from table_name where ST_Contains(ST_GeomFromText($1,4326),table_name.geodata)",
values: ["POINT(Lat Long)"],
name: 'where'
});
结果到SQL smth像
prepare "where" as
select ST_AsText(ST_Transform(geodata,4326))
from table_name
where ST_Contains(ST_GeomFromText($1,4326),table_name.geodata);
execute "where" (POINT(Lat Long));
如果lat
nad long
是table_name
属性,这可能会起作用
下一个:
var queryresult = client.query({name: 'where', values: [msg]}, function(err) {
if (err) {
socket.emit('query error', String(err));
}
});
作用:
execute "where" (msg_value);
如果它们具有兼容的数据类型,则可能有效
最后:
var queryresult = client.query({name: 'where', values: [msg]},["'; DROP TABLE user;"], function(err) {
if (err) {
socket.emit('query error', String(err));
}
});
运行SQL:
execute "where" ('''; DROP TABLE user;');
由于此文本不是有效的几何图形,因此出现错误...
这里值得注意的是lient.query(text QUERY,array VALUES)
在这里用作lient.query(object QUERY,array VALUES)
而VALUES在QUERY对象中被克服,这使您的[msg]
被“忽略”了。
NB
检查准备好的语句是否适合此类sql注入是没有意义的,因为此功能的实现是为了确保此类注入的安全。 例如,即使您将使用数据类型的文本(以避免类型不匹配)并尝试插入分号和drop语句,prepared语句也将注入视为字面值,因此是安全的。 例如:
var preparedstatement = client.query({
text: "select $1::text resulting_att",
values: ['some default'],
name: 'ps_name'}
);
var queryresult = client.query({name: 'ps_name'},["'; DROP TABLE user;"], function(err,res) {
console.log(err,res.rows)
client.end()
});
日志:
null [ anonymous { resulting_att: '\'; DROP TABLE user;' } ]
并且不尝试掉任何东西。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.