簡體   English   中英

如何在Java中准備一個字符串,該字符串最終將傳遞到SQL中進行搜索

[英]How to prepare a string in java that will eventually passed into SQL for a search

這就是我想要做的

用戶輸入一個字符串。 這被傳遞到一個Java程序中,然后該程序對sql server運行查詢,並嘗試查找出現此字符串的記錄。 最終針對sql服務器運行的查詢是這樣的

Select * from users where name like '*userPassedInText*'

我的問題是,如果此字符串具有某些字符,例如',則查詢中斷。 我知道理想的方法是使用

PreparedStatement statement= con.prepareStatement   (myStatement );

但是出於某些原因,我必須傳遞一個字符串。 話雖這么說,Java中是否有任何實用程序可以准備要發送給SQL Server的字符串?

要回答您的緊迫問題:您只需要用兩個單引號字符替換所有“單引號”字符:

String original ="it's a problem when you have a single quote in SQL params"; // String contains a single quote
String escaped = original.replaceAll("'","''"); // replace all single quotes with 2 single quotes

但是我為您哭泣,不要簡單地接受用戶傳入的任何內容(特別是考慮到您的變量名稱為userPassedInText !!)。 我強烈敦促大家閱讀以下內容:

https://www.owasp.org/index.php/Preventing_SQL_Injection_in_Java

...因為如果您只是接受用戶輸入的內容,那么他​​們就可以輸入“某些帶單引號的文本或1 == 1”。 然后,SQL將返回數據庫表中的所有記錄。 您肯定要使用prepareStatements。 而且,作為獎勵,您不必手動將單引號替換為兩個單引號。

我認為您可以嘗試這種方式,創建連接,並通過prepareStatement方法提供查詢:

try {
  String url = "jdbc:odbc:databaseName";
  String driver = "sun.jdbc.odbc.JdbcOdbcDriver";
  String user = "guest";
  String password = "guest";
  Class.forName(driver);
  Connection connection = DriverManager.getConnection(url,user, password);
  String changeLastName = "UPDATE authors SET lastname = ? WHERE authid = ?";
  PreparedStatement updateLastName = connection.prepareStatement(changeLastName);

  updateLastName.setString(1, "Martin"); // Set lastname placeholder value
  updateLastName.setInt(2, 4); // Set author ID placeholder value

  int rowsUpdated = updateLastName.executeUpdate(); // execute the update
  System.out.println("Rows affected: " + rowsUpdated);
  connection.close();
} catch (ClassNotFoundException cnfe) {
  System.err.println(cnfe);
} catch (SQLException sqle) {
  System.err.println(sqle);
}

這里是原始鏈接: http : //www.java2s.com/Code/JavaAPI/java.sql/ConnectionprepareStatementStringsql.htm

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM