2014-03-24 68 views
-2

我是用一個Java servlet這樣引號的字符串沒有正確結束異常

Connection con; 
PreparedStatement ps,ps1; 
ResultSet rs; 
    try{ 
     Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); 

    } 
    catch (ClassNotFoundException e) 
      { 
       System.out.println("Drivers Not Found"); 
      } 
try{ 
    con=DriverManager.getConnection("jdbc:odbc:SharedCryptography", "fyp", "fyp"); 


}catch(SQLException e1) 
{ 
} 
String query="UPDATE tbGroup SET GPassword='"+mypassword+"' where GName='"+GroupNamee+"' and OEmail='"+OwnerId+"'"; 
java.sql.Statement stmt = con.createStatement(); 
stmt.executeUpdate(query); 

在Oracle DATABSE更新密碼,但它給值java.sql.SQLException:[甲骨文] [ODBC] [奧拉] ORA- 01756:引用字符串沒有正確結束

難道我做錯了什麼在裏面請幫助

+1

做一你的價值觀中有單引號字符嗎? – rgettman

+0

@rgettman你在談論什麼價值? – user3445854

+2

Thi當程序員沒有正確地逃避查詢參數時會發生什麼。你應該真的使用準備好的語句 – BackSlash

回答

1

看到這個你要絕對避免在SQL語句的字符串連接。你會遇到各種安全和穩定性問題。你的問題是簡單地用事先準備好的聲明來解決。

String sql="UPDATE tbGroup SET GPassword=? where GName=? and OEmail=?"; 
PreparedStatement ps = con.prepareStatement(sql); 
ps.setString(1, myPassword); 
ps.setString(2, groupName); 
ps.setString(3, ownerId); 
ps.executeUpdate(); 

如果你這樣做,沒有「'」或‘%’或‘_’或「您的參數會引起任何問題或者你可以試試。逃避你的角色,但何必呢 - 的PS方法不僅更強大,更易於閱讀,它往往也更高性能的

對於安全問題的一般說明,請參見:https://www.owasp.org/index.php/SQL_injection

1

你的一個變量(可能是密碼)的有報價或它分號?由於您通過字符串連接構建查詢,因此您很容易受到SQL注入攻擊。看起來你不小心通過注射攻擊自己。如果你有一個正確的惡意格式的變量,你可能會對你的數據庫造成很大的損害。

請使用參數化查詢

PreparedStatement stmt = con.prepareStatement("UPDATE tbGroup SET GPassword= ? where GName= ? and OEmail=?") 

stmt.setString(1, mypassword); 
... 
stmt.executeUpdate(); 

更多細節

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

+1

在此PreparedStatement stmt = con.prepareStatement(「UPDATE tbGroup SET GPassword =?where GName =?and OEmail =?」)from where爲第二和第三個問號賦予價值? – user3445854

+1

是的?是您隨後用setString(index,value)設置的變量的佔位符。由於某些愚蠢的原因,編號從1開始而不是從0開始。 – dkatzel

相關問題