如何避免用户输入中的撇号

时间:2018-08-24 18:03:57

标签: java sql jdbc escaping

因此,我正在将信息从.csv文件导入数据库。但是我在csv文件中用户输入的描述遇到了麻烦,因为它们包含的单引号破坏了SQL导入。

我的导入语句是字符串sqlJob =

"INSERT INTO job (ID, Job_Contact, Internal_Comment, Customer_Name," 
  + " Duration, Job_Location, Job_Completion_Date, Job_Technician," 
  + " Job_Asset, Job_Type, Job_Description) VALUES ('"
  +csvRecord.get(i)+"', '"+csvRecord.get(26)+"', '"+csvRecord.get(16)
  +"', '"+csvRecord.get(2)+"', '"+csvRecord.get(31)+"', '"+csvRecord.get(27)
  +"', '"+csvRecord.get(28)+"', '"+csvRecord.get(29)+"', '"+csvRecord.get(30)
  +"', '"+csvRecord.get(33)+"', '"+csvRecord.get(34)+"');";

简化形式为

"INSERT INTO job (ID, Description) VALUES ('"
  + csvRecord.get(i) + "', '" + csvRecord.get(34) + "');";

问题是csvRecord.get(34)有时会包含撇号。例如,“我的名字叫Bob”,而Bob中的撇号打破了声明该值是SQL字符串所需的周围的撇号。

是否有一种简单的方法来解析字符串并在撇号前面添加转义字符,或者是否应以其他方式格式化原始SQL命令。

谢谢!

2 个答案:

答案 0 :(得分:8)

问题是您正在将SQL语句组装为字符串,并串联参数值。绝对不建议这样做。

使用PreparedStatement代替,它们更易于使用。您可以传递参数而无需进行任何修改,并且它们不会干扰SQL语句的正确执行。

作为一项宝贵的奖励,您的代码将摆脱SQL注入问题。

JDBC Tutorial中的示例:

String updateString = "update COFFEES set SALES = ? where COF_NAME = ?";
PreparedStatement updateSales = con.prepareStatement(updateString);
updateSales.setInt(1, numSales);
updateSales.setString(2, coffeeName);
updateSales.executeUpdate();

如您所见,参数未连接到字符串中,但是它们将代替?符号。

即使coffeeName的值是"Africa's Best"(包括撇号),查询也可以正常工作。

答案 1 :(得分:1)

使用 PreparedStatement ,这样您就可以保存了。

 String name = request.getParameter( "ID" );
        String message = request.getParameter( "Job_Contact" );

        Connection c = null;
        try
        {
            String url = "jdbc:mysql://localhost/**"databasename"**;
            String username = "**<Database Login>**";
            String password = "**<Database password>**";

            **// at the ? section you can add any quantity you need to**

            String sql = "insert into **<databasename>**(name, message) values (?, ?)";

            c = DriverManager.getConnection( url, username, password );
            PreparedStatement pstmt = c.prepareStatement( sql );
            pstmt.setString( 1, name );
            pstmt.setString( 2, message );
            pstmt.executeUpdate();
        }
        catch( SQLException e )
        {
            throw new ServletException( e );
        }
        finally
        {
            try
            {
                if( c != null ) c.close();
            }
            catch( SQLException e )
            {
                throw new ServletException( e );
            }
        }