sql
  • jsp
  • jdbc
  • 2011-11-24 74 views 0 likes 
    0

    我編寫了以下部分,它是一個帶有兩個STRING參數的Java方法login和pass,表示用戶的登錄名和密碼,以檢查用戶是否在數據庫表中找到。JDBC ResultSet SQL錯誤

    Statement stmt = connection.createStatement(); 
    
    ResultSet rs = statement.executeQuery ("SELECT * FROM users WHERE username = '" 
         + login + "' AND passwd = '" + pass + "'"); 
    

    測試時代碼正常工作。我在一本書中讀到,有些情況下可能會產生SQL錯誤,但並未提及上述代碼可能導致SQL錯誤的情況。你能否簡要介紹一下這些情況?還有,我該如何編寫一個能夠防止發生這種錯誤的代碼版本?

    回答

    0

    第一個問題是這段代碼可以修改到SQL Injection。爲了避免這種情況,你可以使用Prepared Statements。這可能是本書可能討論的一個潛在威脅。

    http://www.unixwiz.net/techtips/sql-injection.html

    例如,使用事先準備好的聲明

    String query = "SELECT * FROM users WHERE username = ? AND passwd = ?"; 
    
    PreparedStatement ps = connection.prepareStatement(query); 
    
    ps.setString(1, login); 
    ps.setString(2, passwd); 
    
    Resultset rs = rs = ps.executeQuery(); 
    
    +1

    例如: '字符串登錄=「用戶名「;刪除數據庫;提交」;' –

    +0

    @BorisPavlović好的嚇人例如 – Zohaib

    +2

    @Zohaib:但這取決於數據庫很多。 Boris的攻擊不適用於Oracle或PostgreSQL,因爲它們不允許在單個'executeQuery()'調用中使用多個語句。我認爲(只有?)SQL Server和MySQL可以針對特定的攻擊行事。 –

    0

    你應該寫代碼,prevent SQL注入。使用PreparedStatement(參數化語句)和Stored proc而不是硬編碼的SQL字符串。

    相關問題