2014-06-17 69 views
1

我有,我想在Java運行查詢:SQL查詢用單引號

SELECT md5(CONCAT(md5('{clear password}') , '{salt}')); 

它爲我的應用程序連接,並使用相同的用戶名/密碼爲我的論壇。

它的工作,但是當salt包含字符'它給出一個錯誤:

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 1 

我怎麼會用Java編寫此查詢,以應付',如果它的存在,而不是如果它不存在?

關於。

+3

向我們展示您用於設置參數的代碼。如果你在做字符串連接,你需要正確地轉義字符串。由於http://en.wikipedia.org/wiki/SQL_injection,這也是一個非常糟糕的主意。您應該使用準備好的語句。這將解決這兩個問題。 –

+0

@Chris Thompson嗨。 resultSet = statement.executeQuery(「選擇md5(CONCAT(md5(\」「+密碼+」\「),\」「+ pwdSalt +」\「」);是我用什麼,我會如何編寫查詢爲已預備聲明?你可以舉例 – user3523456

回答

3

如果我按照你的問題,那麼你可以像這樣的東西做 -

String sql = "select md5(CONCAT(md5(?), ?))"; 
PreparedStatement ps = null; 
ResultSet rs = null; 
try { 
    ps = conn.prepareStatement(sql); 
    ps.setString(1, password); 
    ps.setString(2, pwdSalt); 
    rs = ps.executeQuery(); 
} catch (SQLException e) { 
    e.printStackTrace(); 
} 

另一種可能的解決方案是進行散列和鹽Java -

// A password hashing method. 
public static String hashPassword(String in, String salt) { 
    try { 
    MessageDigest md = MessageDigest.getInstance("MD5"); // <-- Or, SHA-256 
    md.update(salt.getBytes());  // <-- Prepend salt. 
    md.update(in.getBytes()); 
    // md.update(salt.getBytes());  // <-- Or, append salt. 

    byte[] out = md.digest(); 
    return bytesToHex(out);   // <-- Return the Hex Hash. 
    } catch (NoSuchAlgorithmException e) { 
    e.printStackTrace(); 
    } 
    return ""; 
} 

private static String bytesToHex(byte[] byteArr) { 
    StringBuilder sb = new StringBuilder(); 
    Formatter fmt = new Formatter(sb); 
    for (byte b : byteArr) { 
    fmt.format("%02x", b); 
    } 
    return sb.toString(); 
} 

最後,我不會在2014年使用MD5。SHA-256將是我的偏好ENCE。

+0

工作就像一個魅力,萬分感謝! – user3523456

1

準備查詢的例子:

/* 
* Some code 
*/ 
String strSQL = "select md5(concat(md5(?),?))" 
try(PreparedStatement ps = conn.prepareStatement(strSQL)) { 
    ps.setString(1, password); 
    ps.setString(2, pwdSalt); 
    try(ResultSet rs = ps.executeQuery()) { 
     rs.first(); 
     // Do whatever you need to do 
    } catch(SQLException e) { 
     // ... 
    } 
} catch(SQLException e) { 
    // ... 
} 

/* 
* More code 
*/