防止 Java 程序中的 SQL 注入攻击

2022-09-03 08:30:42

我必须向我的java程序添加一个语句来更新数据库表:

String insert =
    "INSERT INTO customer(name,address,email) VALUES('" + name + "','" + addre + "','" + email + "');";

我听说这可以通过SQL注入来利用,例如:

DROP TABLE customer; 

我的程序有一个Java GUI,所有名称,地址和电子邮件值都是从中检索的。我想知道黑客如何将以下代码()添加到我的插入语句中,以及如何防止这种情况。JtextfieldsDROP TABLE customer;


答案 1

您需要使用预准备语句。例如:

String insert = "INSERT INTO customer(name,address,email) VALUES(?, ?, ?);";
PreparedStatement ps = connection.prepareStatement(insert);
ps.setString(1, name);
ps.setString(2, addre);
ps.setString(3, email);

ResultSet rs = ps.executeQuery();

这将防止注射攻击。

黑客将其放入其中的方式是,如果您插入的字符串来自某个地方的输入 - 例如,网页上的输入字段,或应用程序中表单上的输入字段或类似内容。


答案 2

我想知道黑客如何将这种代码(“DROP TABLE customer;”)添加到我的插入语句中

例如:

name = "'); DROP TABLE customer; --"

将生成此值到插入:

INSERT INTO customer(name,address,email)     VALUES(''); DROP TABLE customer; --"','"+addre+"','"+email+"');

我特别想知道如何防止这种情况

使用预准备语句和 SQL 参数(示例“窃取”来自 Matt Fellows):

String insert = "INSERT INTO customer(name,address,email) VALUES(?, ?, ?);";
PreparedStament ps = connection.prepareStatment(insert);

还要分析您在此类变量上的值,并确保它们不包含任何不允许的字符(例如名称中的“;”)。


推荐