2

我是 ESAPIm 的新手,几天来我一直在寻找答案。我收到以下错误:

Attempting to load ESAPI.properties via file I/O.
Attempting to load ESAPI.properties as resource file via file I/O.
Not found in 'org.owasp.esapi.resources' directory or file not readable: C:\Documents and Settings\Administrator\Desktop\TEM - Workspace\testSecurity\ESAPI.properties
Not found in SystemResource Directory/resourceDirectory: .esapi\ESAPI.properties
Found in 'user.home' directory: C:\Documents and Settings\Administrator\esapi\ESAPI.properties
Loaded 'ESAPI.properties' properties file
Attempting to load validation.properties via file I/O.
Attempting to load validation.properties as resource file via file I/O.
Not found in 'org.owasp.esapi.resources' directory or file not readable: C:\Documents and Settings\Administrator\Desktop\TEM - Workspace\testSecurity\validation.properties
Not found in SystemResource Directory/resourceDirectory: .esapi\validation.properties
Found in 'user.home' directory: C:\Documents and Settings\Administrator\esapi\validation.properties
Loaded 'validation.properties' properties file
java.lang.reflect.InvocationTargetException Encoder class (org.owasp.esapi.reference.DefaultEncoder) CTOR threw exception

希望尽快找到真正的答案。这是我使用 ESAPI 登录的代码:

/* throws SQLExceptions */
public void login(String username, String password)
{
    try
    {
        if(con == null)
            connect();
        if(con != null)
        {
            Codec ORACLE_CODEC = new OracleCodec();

            String query = "SELECT * FROM tblmember where username = '"+ ESAPI.encoder().encodeForSQL(ORACLE_CODEC, username) +"'AND password '"+ESAPI.encoder().encodeForSQL(ORACLE_CODEC, password)+"' FROM ";

            stm = con.createStatement();
            rs = stm.executeQuery(query);

            if(rs.next())
            {
                System.out.println(rs.getString("address"));
                System.out.println(ESAPI.encoder().encodeForSQL(ORACLE_CODEC,"address"));
            }
        }
        else
        {
            System.out.println("Not Connected!");
        }
    }
    catch(Exception ex)
    {
        System.out.println(ex.getMessage() + " login");
    }           
}

public static void main(String[] args) throws SQLException 
{
    SQLInjection sq = new SQLInjection();
    sq.login("username", "password");
}

非常感谢您的回复:)

4

3 回答 3

2

只是为您提供有关使用 API 的提示,请始终确保您阅读了包含的文档。在那里,您可以找到有助于您使用 API 的信息。我相信这是一个依赖问题。你可以在这里查看

希望这可以帮助。

于 2012-12-18T07:36:09.990 回答
1

您为此使用了错误的 API。Java 已经为您提供了正确的机制,以避免使用准备好的语句在查询中转义输入。ESAPI 可以用于验证输入,但您仍然不想连接字符串来执行此操作。坦率地说,我不喜欢 ESAPI 必须加载才能工作的所有库。

public void login(String username, String password)/*throws SQLExceptions*/{
    try{
        if(con == null)
            connect();
        if(con != null){

            String query = "SELECT * FROM tblmember where username = ? AND password = ? FROM usertable";

            stm = con.prepreStatment(query);
            stm.setString(1, username);
            stm.setString(2, password);
            rs = stm.executeQuery(query);

            if(rs.next()){
                System.out.println(rs.getString("address"));                    
            }
        }else
            System.out.println("No user found with that username and password.");
        }
    }catch(Exception ex){
        System.out.println(ex.getMessage() + " login");
    }

}
public static void main(String[] args) throws SQLException {
    SQLInjection sq = new SQLInjection();

    sq.login("username", "password");
}
于 2012-12-18T03:43:10.793 回答
0

Hiro2K 是绝对正确的。OracleCodec 和其他类似的 SQL DB 编解码器并非旨在替代参数化类型(在 Java 中,使用 PrepareStatements)。相反,它们适用于那些(希望很少)您可能无法使用 PrepareStatement 的小众情况。一个示例可能是您必须调用某些第三方 API,您知道这些 API 在后台调用了 Oracle JDBC 驱动程序,但您不确定该 API 是否使用参数化类型。

但是,也就是说,我没有看到您在调用 ESAPI 时所做的任何事情,这会导致 DefaultEncoder CTOR 抛出 InvocationTargetException。这是我以前从未见过的。它可能与您的 ESAPI.properties 文件中的某些内容有关(例如,如果您尝试将 ESAPI 1.4 ESAPI.properties 文件与 ESAPI 2.0.x 一起使用)。

您可以发布您的异常堆栈跟踪,以便我看一下吗?你可能发现了一个错误。

谢谢,

-凯文墙

于 2012-12-18T04:05:58.903 回答