c# - IN 子句中连接字符串的 SQL 注入预防
问题描述
我有一个变量,它是一个字符串数组。我想传递变量的所有值,将它的所有元素连接成一个字符串。
但我不确定这是否会带来 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);
但它不起作用。有任何想法吗?
解决方案
创建一个 PL/SQL 过程(在 PL/SQL 包中),如下所示:
TYPE TArrayOfVarchar2 IS TABLE OF MYTABLE.TABLEID%TYPE INDEX BY PLS_INTEGER;
PROCEDURE UPDATE_MYTABLE(TABLEIDs IN TArrayOfVarchar2) IS
BEGIN
FORALL i IN INDICES OF TABLEIDs
UPDATE MYTABLE SET STATUS = 'X' WHERE TABLEID = TABLEIDs(i);
END;
并像这样拨打电话:
using (OracleCommand cmd = new OracleCommand("BEGIN UPDATE_MYTABLE(:tableId); END;"), con))
{
cmd.CommandType = CommandType.Text;
// or
// OracleCommand cmd = new OracleCommand("UPDATE_MYTABLE"), con);
// cmd.CommandType = CommandType.StoredProcedure;
var par = cmd.Parameters.Add("tableId", OracleDbType.Varchar2, ParameterDirection.Input);
par.CollectionType = OracleCollectionType.PLSQLAssociativeArray;
par.Value = sa;
par.Size = sa.Length;
cmd.ExecuteNonQuery();
}
推荐阅读
- ubuntu - 如何使用 Cron 来管理和调度数据和网络使用
- sql - 试图同时按两列计数和分组
- excel - 将数据导出为 CSV 文件时出现 VBA 运行时错误 1004
- php - Laravel 多个 orWhere 与 and 子句 Eloquent
- python - 从选择标签返回选定的值,没有 Flask 中的提交按钮
- html - 2列的CSS布局,当宽度<150px时右列向下对齐
- sql - SQL Server - 将日期转换为工作日并在第二列中计算工作日的每个实例
- graph - 理论计算机科学:这个问题与顶点覆盖有关吗?
- java - 在外部库构造对象中访问 Spring 应用程序上下文
- go - 处理多个 api 检查它是否为空的优雅方法