java.lang.reflect.InvocationTargetException编码器类(org.owasp.esapi.reference.DefaultEncoder)CTOR抛出异常

时间:2012-12-18 02:39:20

标签: java eclipse security esapi invocationtargetexception

我是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");
}

非常感谢您的回复:)

3 个答案:

答案 0 :(得分:2)

为了给您一个使用API​​的提示,请务必阅读所包含的文档。在那里,您可以找到有助于您使用API​​的信息。我相信这是一个依赖性问题。您可以查看here

希望这有帮助。

答案 1 :(得分: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");
}

答案 2 :(得分: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一起使用)。

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

谢谢,

-kevin wall