SQL注入 - 如果我们将多个预定义的字符串与用户值连接起来

SQL Injection - if we concatenate multiple pre-defined strings with a user value

提问人:NIKHIL NAIR 提问时间:11/7/2020 最后编辑:Andrzej SydorNIKHIL NAIR 更新时间:11/8/2020 访问量:446

问:

如果我基于字符串的串联创建数据库,但使用一些预定义的值,那么我的数据库是否容易受到 SQL 注入的影响?

例如:在下面的示例中,我提供了一个预定义的下拉菜单,用户将从中选择值并将其提取到字符串中,然后所有字符串将被连接为表名(在这种情况下,它是当然的。这样做是为了在运行时根据要求创建表。

我正在创建一个简单的 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"); 
                }

java mysql sql sql 代码注入

评论

0赞 Spectric 11/7/2020
使用 PreparedStatement 应该是一种习惯。它更快、更安全。
0赞 NIKHIL NAIR 11/8/2020
@Spectric 有没有其他方法可以在运行时制作动态表并避免SQL注入?
1赞 Your Common Sense 11/8/2020
根据用户请求创建表本身就是一种非常糟糕的做法。了解关系数据库架构,并为所有数据使用一个预定义的表。问题解决
0赞 NIKHIL NAIR 12/7/2020
@YourCommonSense我不是在要求/告诉用户创建表。它就是这样 - 根据用户的某些条目,我想创建一个表。现在,这对其他人来说可能是一种不好的做法,但对我来说,它看起来“更有活力”。因此,我没有接受它是一种不良做法,而是试图找到这种不良做法的解决方法。我是一个新手,所以正在努力学习。:-D

答:

0赞 nkrivenko 11/7/2020 #1

您的代码容易发生 SQL 注入。如果用户在以下位置输入如下内容:subject

sometable (id int primary key); --

然后,您的表定义将被 覆盖。id int primary key AUTO_INCREMENT, attenndancedate Date, rollno int(id int primary key)

评论

0赞 Your Common Sense 11/8/2020
似乎没有回答提出的问题。“也许使用第三方库”几乎不算一个
0赞 nkrivenko 11/8/2020
OP 问的问题是“在这种情况下,是否可以进行 SQL 注入?”,我建议以 SQL 注入为例。虽然关于第三方库的建议不好,但同意你的看法。
0赞 NIKHIL NAIR 12/7/2020
嗨@nkrivenko有人说,如果我们使用准备好的语句,我们可以防止我们的代码进行SQL注入。现在我正在接受用户的输入,然后尝试将其添加到一些字符串值中,然后使用它来创建表......我的代码是否仍然容易受到 SQL 注入的影响?