SQL 注入 - 如果我们将多个预定义字符串与用户值连接起来
Posted
技术标签:
【中文标题】SQL 注入 - 如果我们将多个预定义字符串与用户值连接起来【英文标题】:SQL Injection - if we concatenate multiple pre-defined strings with a user value 【发布时间】:2021-02-20 01:12:02 【问题描述】:如果我创建一个基于字符串连接但具有一些预定义值的数据库,那么我的数据库是否容易受到 SQL 注入的影响?
例如:在下面的示例中,我提供了一个预定义的下拉菜单,用户可以从中选择值并将其提取到字符串中,然后将所有字符串连接为 表名 em>(在这种情况下是 course。这样做是为了在运行时根据要求制作表格。
我正在创建一个简单的 java 项目,但不管语言如何,在这种情况下是否可以进行 SQL 注入?
对不起,如果这是一个蹩脚的问题,但想知道未来案例的场景。
String department = jComboBox1.getSelectedItem().toString();
String year = jComboBox2.getSelectedItem().toString();
String batch = jComboBox3.getSelectedItem().toString();
String subject = jTextField1.getText();
String assigned = jComboBox4.getSelectedItem().toString();
String course = department+"_"+year+"_"+batch+"_"+subject;
Class.forName("com.mysql.cj.jdbc.Driver");
con = DriverManager.getConnection("pathToDB");
pst = con.prepareStatement("insert into courses(course,department,subject,teacher_assigned) values (?,?,?,?)");
pst.setString(1,course);
pst.setString(2,department);
pst.setString(3,subject);
pst.setString(4,assigned);
int result = pst.executeUpdate();
if(result==1)
JOptionPane.showMessageDialog(null,"Courses has been added, please ask teacher to assign themselves.");
else
JOptionPane.showMessageDialog(null,"Some issue with connection");
jTextField1.setText("");
String strQuery="CREATE TABLE $table_name"+ "("+ " id int primary key AUTO_INCREMENT, attenndancedate Date, rollno int);";
String query =strQuery.replace("$table_name",course);
pst1 = con.prepareStatement(query);
boolean resultcreate = pst1.execute();
if(resultcreate)
JOptionPane.showMessageDialog(null,"Create table worked, hooray!!!");
else
JOptionPane.showMessageDialog(null,"Some issue with connection for create table");
【问题讨论】:
使用 PreparedStatement 应该是一种习惯。它更快、更安全。 @Spectric 有没有其他方法可以在运行时制作动态表并避免 SQL 注入? 根据用户的要求创建表格本身就是一种非常糟糕的做法。了解关系数据库架构,并为所有数据提供一个预定义的表。问题解决了 @YourCommonSense 我不是要求/告诉用户创建表格。它只是-基于用户的某些条目,我想创建一个表。现在,这对其他人来说可能是一种不好的做法,但对我来说,它看起来像“更有活力”。因此,我没有接受它作为一种不好的做法,而是试图找到一种解决这种不好做法的方法。我是新手,所以努力学习。 :-D 【参考方案1】:您的代码容易发生 SQL 注入。如果用户在subject
中输入这样的内容:
sometable (id int primary key); --
那么你的表定义id int primary key AUTO_INCREMENT, attenndancedate Date, rollno int
将被(id int primary key)
覆盖。
【讨论】:
似乎没有回答所提出的问题。 “也许使用第三方库”算不上一个 OP 提出的问题是“在这种情况下是否可以进行 SQL 注入?”,我提出了一个 SQL 注入示例。虽然对第三方库的推荐不好,但同意你的看法。 嗨@nkrivenko据说如果我们使用准备好的语句,我们可以防止我们的代码被SQL注入。现在我正在接受用户的输入,然后尝试将其添加到一些字符串值中,然后使用它来创建表......我的代码仍然容易受到 SQL 注入的影响吗?以上是关于SQL 注入 - 如果我们将多个预定义字符串与用户值连接起来的主要内容,如果未能解决你的问题,请参考以下文章