sql
  • jsp
  • jdbc
  • 2011-11-24 76 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字符串。

    相关问题