java.lang.reflect.InvocationTargetException Класс кодировщика (org.owasp.esapi.reference.DefaultEncoder) CTOR выдал исключение

Я новичок в 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");
}

Большое спасибо за Ваш ответ :)


person T E M    schedule 18.12.2012    source источник
comment
Можете ли вы опубликовать код, который вызывает эту ошибку, или хотя бы некоторые подробности о вашей настройке?   -  person WebChemist    schedule 18.12.2012


Ответы (3)


Просто чтобы дать вам совет по использованию API, всегда обязательно читайте прилагаемую документацию. Там вы можете найти информацию, которая поможет вам в использовании API. Я считаю, что это была проблема зависимости. Вы можете проверить это здесь.

Надеюсь это поможет.

person Johne Altamera    schedule 18.12.2012

Вы используете неправильный 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");
}
person Hiro2k    schedule 18.12.2012
comment
Так что мне не нужно использовать ESAPI в пользовательских вводах, если есть подготовленные заявления? - person T E M; 18.12.2012
comment
Точно, просто помните, что переменная stm имеет тип PreparedStatement. Кроме того, строка запроса намного чище без всей конкатенации. Также, если вам нравится ответ, проголосуйте за него или примите его. - person Hiro2k; 18.12.2012
comment
Хм, хорошо. Я просто думаю, что использование ESAPI и подготовленных заявлений поможет мне защитить мой веб-проект. Можете ли вы предложить какую-либо функцию безопасности, которую я могу добавить для своего проекта? - person T E M; 18.12.2012
comment
Для защиты вашего веб-сайта требуется гораздо больше, чем просто атаки SQL Injection, но подготовленные операторы — лучший инструмент для этой работы, и он уже встроен в Java, поэтому вам не нужно включать что-либо еще. - person Hiro2k; 18.12.2012
comment
Да. Большое спасибо :) - person T E M; 18.12.2012

Hiro2K абсолютно прав. OracleCodec и другие подобные кодеки базы данных SQL не предназначены для замены параметризованных типов (в Java с использованием PrepareStatements). Скорее, они предназначены для тех (надеюсь, очень немногих) нишевых случаев, когда вы не сможете использовать PrepareStatement. Одним из примеров может быть ситуация, когда вам нужно вызвать некий сторонний API, который, как вы знаете, под капотом вызывает драйвер JDBC Oracle, но вы не уверены, использует ли этот API параметризованные типы.

Однако, тем не менее, я не вижу ничего, что вы сделали в том, как вы вызвали ESAPI, что привело бы к тому, что CTOR DefaultEncoder выдал InvocationTargetException. Это то, чего я раньше не видел. Это может быть связано с чем-то в вашем файле ESAPI.properties (например, если вы пытались использовать файл ESAPI 1.4 ESAPI.properties с ESAPI 2.0.x).

Не могли бы вы опубликовать трассировку стека исключений, чтобы я мог взглянуть на нее? Возможно, вы нашли ошибку.

Спасибо,

-Кевин Уолл

person Kevin W. Wall    schedule 18.12.2012