Fortify Sql 注入 for Oracle
Posted
技术标签:
【中文标题】Fortify Sql 注入 for Oracle【英文标题】:Fortify Sql Injection for Oracle 【发布时间】:2015-12-19 03:26:48 【问题描述】:当我使用 fortify 静态代码分析器扫描我的项目时,它会发现 Sql Injection 结果。
在 Recommendations 窗口 fortify 说:“SQL 注入漏洞的根本原因是攻击者能够更改 SQL 查询中的上下文,导致程序员打算解释为数据的值被解释为命令相反,当构建 SQL 查询时,程序员知道什么应该被解释为命令的一部分,什么应该被解释为数据。参数化 SQL 语句可以通过禁止数据导向的上下文更改来强制执行此行为,并防止几乎所有 SQL 注入攻击. 参数化 SQL 语句是使用常规 SQL 字符串构造的,但是当需要包含用户提供的数据时,它们会创建绑定参数,这些参数是随后插入的数据的占位符。绑定参数允许程序显式地向数据库指定什么应该被当作命令,什么应该被当作数据。当程序准备好执行一条语句时,它指定给databa为每个绑定参数的值设置运行时值,而不会有数据被解释为命令的风险。"
请看我的代码。我已经在使用参数化 SQL 语句。那么问题是什么?我错过了什么?
我的代码摘要;
Dim stateid As String = HttpContext.Current.Request.QueryString.Item("stateid"))
Dim colArgs As COLLECTIONS.ParamterCollection
colArgs = New COLLECTIONS.ParamterCollection
colArgs.Add(DATA.DataPreps.PrepStringForDB(stateid ))
Dim sSQL As String = "SELECT * FROM STATE WHERE N_STATE_ID = :P"
PrepareSQL(sSQL, colArgs, objDBConfigObject)
Dim objCommand As OracleCommand = new OracleCommand(sSQL, connection)
objCommand.CommandTimeout = m_nConnectionTimeout
For Each objArgument In colArgs
objParam = New Oracle.DataAccess.Client.OracleParameter(":P" & CStr(nInArgIndex), objArgument.enOracleType)
objParam.Value = objArgument.varValue
objCommand.Parameters.Add(objParam)
nInArgIndex += 1
objArgument = Nothing
objParam = Nothing
Next
objCommand.CommandType = CommandType.Text
objDataAdapter = New Oracle.DataAccess.Client.OracleDataAdapter(objCommand)
nRecordsAffected = objDataAdapter.Fill(objDataSet)
【问题讨论】:
尝试删除 ':P' 周围的单引号,看看是否会改变结果? 这是我写在这里的错误。没有引号。我编辑了代码 您确定收到这部分代码的警告吗?您的项目中是否还有其他代码不使用参数化查询?我不知道您使用的工具是否包含易于理解的位置信息,但如果没有,您应该能够通过删除您已检查为安全的代码部分轻松检查(您使用 VCS,对?) 并重新运行分析。 这是对我的代码的总结,实际上项目是非常大的分层应用程序。 Fortify 说“OracleServerExecuteQuery() 方法调用使用来自不受信任来源的输入构建的 SQL 查询。此调用可能允许攻击者修改语句的含义或执行任意 SQL 命令。” 【参考方案1】:您可以使用 DBMS_ASSERT 验证所有用户输入。阅读此内容
http://docs.oracle.com/cd/B28359_01/appdev.111/b28419/d_assert.htm#BABIEIFE
【讨论】:
【参考方案2】:参数化查询不是灵丹妙药。我想补充几点:
objParam.OracleDbType = Oracle.DataAccess.Client.OracleDbType.VarChar(这是db列数据类型)
确保您正在执行输入验证以消除任何危险的 SQLi 字符。
对传递的参数执行一些健全性检查。例如,字符串 stateid 的最大字符数是多少?
【讨论】:
以上是关于Fortify Sql 注入 for Oracle的主要内容,如果未能解决你的问题,请参考以下文章
Fortify漏洞之Dynamic Code Evaluation: Code Injection(动态脚本注入)和 Password Management: Hardcoded Password(密
Fortify 扫出Access control database;return jdbcTemplate.queryForList(sql);sql指令包