【问题标题】:How to escape apostrophes from user input如何从用户输入中转义撇号
【发布时间】:2018-08-24 18:03:56
【问题描述】:

所以我将 .csv 文件中的信息导入数据库。但是,我在 csv 文件中用户输入的描述有问题,因为它们包含破坏 SQL 导入的撇号。

我的 Import 语句是 String 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) 有时会包含撇号。例如“My name's Bob”,并且 Bob 中的撇号破坏了周围的撇号,这些撇号需要声明该值是 SQL 的字符串。

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

谢谢!

【问题讨论】:

  • 使用参数化查询而不是连接字符串。
  • @TheImpaler 的回答提到了这一点及其解决方案,但“SQL 注入”是您在尝试滚动自己的字符转义代码时面临的主要问题。如果您使用可以为您管理参数的库,这对您来说会更安全,也更容易。

标签: java sql jdbc escaping


【解决方案1】:

问题是您将 SQL 语句组装为字符串,并连接参数值。这是非常不可取的。

改用更易于使用的PreparedStatements。可以不加任何修改地传递参数,并且不会干扰 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"(包括撇号),查询也能正常工作。

【讨论】:

  • 好的,非常感谢!我不太确定prepared statement的目的,但这很有意义。
【解决方案2】:

使用 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 );
            }
        }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-02-11
    • 2012-03-24
    • 1970-01-01
    • 1970-01-01
    • 2013-07-13
    • 2018-08-26
    相关资源
    最近更新 更多