Checkmarx将以下代码段表示为sql注入漏洞。
在checkmarx报告中描述了下面的代码片段,如下所示
“从readLine元素获取用户输入。然后该元素的值 流经代码而未经过适当的消毒或验证 这可能会启用SQL注入攻击“
为简洁起见,我没有提供全文。
InputStreamReader isr = null;
BufferedReader br = null;
try{
ClassPathResource defaultReports = new ClassPathResource(dbVendor + "/sql_inserts.sql");
isr = new InputStreamReader(defaultReports.getInputStream());
br = new BufferedReader(isr);
c = session.connection();
String sqlLine = null;
while((sqlLine = br.readLine()) != null) {
sqlLine = sqlLine.trim();
Statement st = null;
try{
st = c.createStatement();
st.execute(sqlLine);
}catch(SQLException e){
}catch(Exception e){
}finally{
if (st != null)
st.close();
}
}
}
// sql_inserts.sql文件包含一组插入语句
我想将上面的代码转换为checkmarx友好的方式。之后的复选标记不应该突出显示为高sql注入漏洞的代码片段。
答案 0 :(得分:0)
SQL注入攻击包括插入或注入"通过从客户端到应用程序的输入数据进行SQL查询。
在代码中,如Checkmarx工具所示,执行SQL查询sqlLine
,完全取消选中。我们可以看到它来自某种流,但问题是这些查询的来源究竟是什么。
如果流完全由您控制,这意味着您确切知道它包含的内容,您可以认为它不可利用。此类案例的示例可以是使用硬编码查询,也可以选择(或比较)已定义的白名单" - 已知的好/允许的查询列表。 重要提示:仅当查询字符串由100%受信任的来源控制时才会被视为无法利用
如果流或查询本身可以以某种方式被用户控制/更改/影响,您应该认为查询不受信任且不安全。在这种情况下,必须采取防止SQL注入的步骤。您的代码段中不清楚构建查询的方式,因此无法在此处建议特定的建议。您应该仔细检查OWASP SQL Injection Prevention Cheat Sheet中的预防方法,并为您选择合适的方法。
祝你好运!