You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#使用OracleConnection遇SQL注入问题,修改代码后不生效求助

问题根因

  1. 字符串常量内的变量不会被C#解析:你把this.DB_SOURCE、this.DB_LOGIN等C#变量直接写在引号包裹的字符串常量里,编译器只会把这些文本当成普通字符串处理,不会替换成对应变量的实际值,所以输出的就是变量名本身。
  2. 属性名拼写错误:日志输出代码中connection.Data Source中间多了空格,正确的属性名是无空格的connection.DataSource,此处会触发编译错误。
  3. 对SQL注入的场景认知有误:你最初单独给OracleConnectionStringBuilder的DataSource、UserID、Password属性赋值的写法本身就是安全的,不存在注入风险,反而你修改后直接拼接字符串传入构造函数的写法更容易引入安全问题。

修正代码

你最初的连接字符串赋值写法已经是官方推荐的安全实现,不需要调整,修正后的完整代码如下:

this.USER_ID = args[0].ToString();
this.DB_SOURCE = args[1].ToString();
this.DB_LOGIN = args[2].ToString();
this.DB_PASSWORD = args[3].ToString();

OracleCommand cmd = new OracleCommand();
OracleConnectionStringBuilder connection = new OracleConnectionStringBuilder();
connection.DataSource = this.DB_SOURCE;
connection.UserID = this.DB_LOGIN;
connection.Password = this.DB_PASSWORD;

// 修正日志输出的属性名错误
EventLog.WriteEntry(sSource, " Data Source:" + connection.DataSource, EventLogEntryType.Information);
EventLog.WriteEntry(sSource, "User id:" + connection.UserID, EventLogEntryType.Information);
EventLog.WriteEntry(sSource, "Password:" + connection.Password, EventLogEntryType.Information);

cmd.Connection = new OracleConnection(connection.ConnectionString);
cmd.Connection.Open();

SQL注入规避补充说明

你当前调整的连接字符串逻辑本身没有注入风险,SQL注入风险通常出现在SQL语句构造阶段:如果后续你需要执行带用户输入参数的SQL,不要直接把用户输入拼接到SQL文本中,要用参数化查询实现,示例如下:

// 错误写法:直接拼接用户输入,存在SQL注入风险
string wrongSql = $"SELECT * FROM USER_INFO WHERE USER_ID = '{this.USER_ID}'";
cmd.CommandText = wrongSql;

// 正确写法:参数化查询,完全规避SQL注入风险
string safeSql = "SELECT * FROM USER_INFO WHERE USER_ID = :USER_ID";
cmd.CommandText = safeSql;
// Oracle参数用冒号作为前缀
cmd.Parameters.Add(new OracleParameter(":USER_ID", this.USER_ID));

内容的提问来源于stack exchange,提问作者sid

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 14:45:04