我正在为我的学校做一个项目,我的任务是调试使用应用程序调用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注入,我是新手。感谢您的回复
答案 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