我是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");
}
非常感谢您的回复:)
答案 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