【发布时间】:2019-02-16 18:13:57
【问题描述】:
我有一个变量,它是一个字符串数组。我想传递变量的所有值,将它的所有元素连接成一个字符串。
但我不确定这是否会带来 SQL 注入风险。 我的代码:
private string concatenateStrings(string[] sa)
{
StringBuilder sb = new StringBuilder();
foreach (string s in sa)
{
if (sb.Length > 0)
{
sb.Append(",");
}
sb.Append("'");
sb.Append(s);
sb.Append("'");
}
return sb.ToString();
}
public void UpdateClaimSts(string[] ids)
{
string query = @"UPDATE MYTABLE
SET STATUS = 'X'
WHERE TABLEID in (" + concatenateStrings(ids) + ")";
OracleCommand dbCommand = (OracleCommand)this.Database.GetSqlStringCommand(query) as OracleCommand;
this.Database.ExecuteNonQuery(dbCommand, this.Transaction);
}
我尝试更改查询以使用参数化查询:
string query = @"UPDATE MYTABLE
SET STATUS = 'X'
WHERE TABLEID in (:ids)";
OracleCommand dbCommand = (OracleCommand)this.Database.GetSqlStringCommand(query) as OracleCommand;
dbCommand.Parameters.Add(":ids", OracleType.VarChar).Value = concatenateStrings(ids);
this.Database.ExecuteNonQuery(dbCommand, this.Transaction);
但它不起作用。有什么想法吗?
【问题讨论】:
-
dbCommand.Parameters.AddWithValue("@mydata", ids)
-
在你的第一个例子中,如果我的第一个
id是1');DROP TABLE MYTABLE;--(例如)那么你会有一些麻烦 -
@TrishSiquian 它不起作用。基本上,您所做的与我在第二个示例中尝试做的相同。
-
@Rafalon 这就是为什么我要求关于如何防止 SQL 注入的建议。
-
@Rafalon 与某些数据库不同,Oracle 不允许在一条语句中使用两个命令,因此这种 SQL 注入攻击类型会引发错误。还有其他攻击方法,例如
1) OR 1=1绕过过滤器并更新每一行或1) AND EXISTS( SELECT 1 FROM password_table WHERE user = 'Admin' AND hash = '0123456' )以查找其他表和敏感数据的存在。
标签: c# sql oracle sql-injection