我有应用扫描,可以通过它扫描我的项目,但使用类似的语句
preparedStatement = conn.prepareStatement(sql);
存在SQL.Injection漏洞,我正在使用esapi api在准备好的语句中设置值,例如。
preparedStatement.setString(1 , OracleEncoder.encode(code) );
OracleEncoder正在执行此操作
ESAPI.encoder().encodeForSQL( ORACLE_CODEC,param);
任何想法我该如何解决此漏洞?
假设您正在执行静态分析,appscan不会为您的ESAPI API标记,您应该在appscan中为您的encodeForSQL方法创建一个SQLi验证器标记。这样,下次扫描时,扫描引擎将获取新标记并了解esapi调用已消除了SQLi威胁。
您不需要将绑定参数编码为prepareStatement,
// preparedStatement.setString(1 , OracleEncoder.encode(code) );
preparedStatement.setString(1 , code );
PreparedStatement.setString()
JavaDoc的相关部分说,
驱动程序在将其发送到数据库时,将其转换为SQL VARCHAR或LONGVARCHAR值(取决于参数的大小,相对于驱动程序对VARCHAR值的限制。
如果您在代码中使用ESAPI库函数和准备好的语句,则可以将此问题标记为不是问题。准备语句是避免SQL注入的缓解技术之一。
preparedStatement = conn.prepareStatement(sql);