Checkmarx 高亮代码为 sqlinjection 漏洞
Posted
技术标签:
【中文标题】Checkmarx 高亮代码为 sqlinjection 漏洞【英文标题】:Checkmarx highlight code as sqlinjection vulnerability 【发布时间】:2018-01-01 12:04:30 【问题描述】:Checkmarx将以下代码sn-p表示为sql注入漏洞。
在 checkmarx 报告中描述如下代码 sn-p 如下所示
" 从 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友好的方式。之后,不应该将代码sn-p突出显示为高sql注入漏洞。
【问题讨论】:
【参考方案1】:SQL 注入攻击包括通过从客户端到应用程序的输入数据插入或“注入”SQL 查询。
来源:SQL Injection - OWASP
在您的代码中,如 Checkmarx 工具所示,执行 SQL 查询 sqlLine
,完全未检查。我们可以看到它来自某种流,但问题是这些查询的确切来源是什么。
如果流在您的完全控制之下,这意味着您确切地知道它包含什么,您可以认为它是不可利用的。这种情况的示例可以是使用硬编码查询或从定义的“白名单”中选择(或比较) - 一个已知的好/允许的查询列表。 重要提示:仅当查询字符串由 100% 受信任的来源控制时,才可被视为不可利用
如果流或查询本身可以通过某种方式被用户控制/更改/影响,您应该考虑不可信和不安全的查询。在这种情况下,必须采取措施防止 SQL 注入。从您的代码 sn-p 中,您构建查询的方式并不清楚,因此此处无法提出具体建议。您应该仔细阅读OWASP SQL Injection Prevention Cheat Sheet中的预防方法并选择适合您的方法。
祝你好运!
【讨论】:
“这些查询的确切来源是什么” - 类路径,根据发布的代码。以上是关于Checkmarx 高亮代码为 sqlinjection 漏洞的主要内容,如果未能解决你的问题,请参考以下文章
Spring data JPA Checkmarx 漏洞-@Query 注解的资源访问授权不当