/ / node-postgres vorbereitete Anweisung - sql injection - node.js, postgresql, node-postgres

node-postgres vorbereitete Anweisung - sql injection - node.js, postgresql, node-postgres

Ich bin neu bei Node-Postgres und kann diesen Fehler nicht beheben, wenn ich versuche, sicherzustellen, dass keine SQL-Injektion mit meiner vorbereiteten Anweisung möglich ist.

Hier ist ein Ausschnitt des Codes

// 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));
}
});

Immer wenn ich die Geodaten (als eine Nachricht von dem Client, der socket.io verwendet) eingeben, gibt die socket.emit einen Fehler zurück, der sagt

Ungültige Geometrie

Der Code funktioniert jedoch einwandfrei, wenn ich ihn entferne [""; DROP TABLE user;"], aus dem Code, d.h.

// the query
var queryresult = client.query({name: "where", values: [msg]}, function(err) {
if (err) {
socket.emit("query error", String(err));
}
});

(oben) funktioniert perfekt. Jede Hilfe, die mir hilft zu verstehen, was ich hier falsch mache, wäre großartig.

Antworten:

0 für die Antwort № 1
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"
});

Ergebnisse zu SQL etw

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));

was wahrscheinlich funktionieren könnte, wenn lat Nad long sind table_name Attribute

Nächster:

var queryresult = client.query({name: "where", values: [msg]}, function(err) {
if (err) {
socket.emit("query error", String(err));
}
});

tut:

execute "where" (msg_value);

was wahrscheinlich funktioniert, wenn sie vom kompatiblen Datentyp sind

und schlussendlich:

var queryresult = client.query({name: "where", values: [msg]},[""; DROP TABLE user;"], function(err) {
if (err) {
socket.emit("query error", String(err));
}
});

Läuft SQL:

execute "where" ("""; DROP TABLE user;");

was einen Fehler ergibt, da dieser Text keine gültige Geometrie ist ...

hier bemerkbar lient.query(text QUERY,array VALUES) hier wird als verwendet lient.query(object QUERY,array VALUES) und VALUES überwand so ein QUERY-Objekt, dieses dein [msg] wurde "ignoriert" ...

NB

Prüfen, ob vorbereitete Aussagen zu solchen Aussagen passenSQL-Injektion ist sinnlos, da diese Funktion mit der Idee umgesetzt wurde, für solche Injektionen sicher zu sein. Selbst wenn Sie beispielsweise Datentyp-Text verwenden würden (um Typinkonsistenzen zu vermeiden) und versuchen, Semikolon und Anweisung drop zu injizieren, würde prepared statement die Injektion als Literal-Wert behandeln und somit sicher sein. z.B:

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()
});

Protokolle:

null [ anonymous { resulting_att: ""; DROP TABLE user;" } ]

und nicht versucht etwas fallen zu lassen.