这种代码是否容易出现SQL注入?

时间:2016-12-21 02:26:21

标签: sql-injection

我正在为我的学校做一个项目,我的任务是调试使用应用程序调用HPE Fortify发现的所有问题。应用程序生成的报告仅指出下面容易出现SQL注入的代码:

        String sql = " select Distinct p1.desc1,p2.desc2 from parameter  p1"
          +" inner join  parameter p2"
          +" on p1.ParaCode1='CR_DERIVE' and p1.ParaCode2=p2.Desc2"
          +" inner join parameter p3"
          + " on p2.ParaCode3=p3.ParaCode1 and p3.ParaCode3=p2.Desc2"
          +" where p2.paracode1='ATTRIBUTE'"
          + " and p2.ParaCode2='" + ddl_attribute.SelectedValue + "'";

但不是下面的代码:

strSQL = "SELECT Paracode2 FROM Parameter WHERE Paracode1 = 'PROGMGR' AND Desc1 = '" + login + "' AND Status = 'A' ";

我想知道为什么我不清楚SQL注入,我是新手。感谢您的回复

1 个答案:

答案 0 :(得分:0)

您将一些应用程序变量连接到您的SQL查询字符串中,因此安全性取决于这些变量的方式'价值设定。他们来自一些不受信任的投入吗?或者他们是从一些安全的应用程序数据中设置的?

如果HPE Fortify分析了您的代码并知道如何为您的login变量赋值,那么它可能会告诉您在SQL表达式中使用它是安全的。虽然它可能无法对SelectedValue变量做出结论,但它假设它不安全,因此可能导致SQL漏洞。

Perl语言做了类似的事情,没有使用像HPE Fortify这样的工具。每个Perl变量都是" tainted"或"无污染"取决于它的价值所在。因此,您可以判断变量在SQL中是否安全,或者在eval()或其他可能的代码注入情况下使用。很遗憾,更多的语言不支持类似的东西。

但我同意其他评论者的意见,你应该学会使用查询参数。这很简单,也很安全。如果你正确地平衡你的报价,你就可以停止眼睛疲劳。

您的代码示例看起来可能是Java。这是Java中的一个例子:

strSQL = "SELECT Paracode2 FROM Parameter"
       + " WHERE Paracode1 = 'PROGMGR' AND Desc1 = ? AND Status = 'A' ";

请注意,参数的?占位符在SQL字符串中没有单引号。您不能在占位符周围添加SQL引号。

PreparedStatement stmt = con.PreparedStatement(sql);
stmt.setString(1, login);
ResultSet rs = stmt.executeQuery();

有关帮助您了解SQL注入的更多信息,您可能会喜欢我的演示文稿SQL Injection Myths and Fallacies或我发表该演讲的视频:https://www.youtube.com/watch?v=VldxqTejybk