繁体   English   中英

node-postgres准备好的语句-SQL注入

[英]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 longtable_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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM