【问题标题】:Prevent SQL injection in oracle防止oracle中的SQL注入
【发布时间】:2014-06-03 11:05:53
【问题描述】:

首先我尝试使用以下代码

strQuery = @"SELECT PASSWORD FROM IBK_USERS where upper(user_id) =upper('" + UserPrefix + "')";

try
{
    ocommand = new OracleCommand();
    if (db.GetConnection().State == ConnectionState.Open)
    {
        ocommand.CommandText = strQuery;
        ocommand.Connection = db.GetConnection();                       
        odatareader = ocommand.ExecuteReader();
        odatareader.Read();

最后我转换了上面的查询以防止像那样的 sql 注入

strQuery = @"SELECT PASSWORD FROM IBK_USERS where upper(user_id) =upper(:UserPrefix)";
try
{
    ocommand = new OracleCommand();
    if (db.GetConnection().State == ConnectionState.Open)
    {
        ocommand.CommandText = strQuery;
        ocommand.Connection = db.GetConnection();

        ocommand.Parameters.Add(":UserPrefix",OracleDbType.Varchar2,ParameterDirection.Input);
        ocommand.Parameters[":UserPrefix"].Value = UserPrefix;
        odatareader = ocommand.ExecuteReader();

但这不起作用

【问题讨论】:

  • 定义“不工作”。你看到了什么意外的行为?什么错误信息?什么堆栈跟踪?
  • 这不是 SQL 标签编程语言。代码 sn -p 不完整。
  • 我认为不能在 oracle DB 的上层函数中设置参数
  • 你打开连接了吗?此外,将函数应用到WHERE 中的字段会导致糟糕的性能,因为您会阻止数据库使用任何索引。如果要进行不区分大小写的查询,请应用正确的排序规则。
  • 是的,当我使用第一个代码时,所有数据都是正确的..

标签: c# sql oracle ado.net


【解决方案1】:

去掉参数名前面的冒号。所以不是...

ocommand.Parameters.Add(":UserPrefix", ...);

...这样做...

ocommand.Parameters.Add("UserPrefix", ...);

同上设置参数值。


与您的问题没有直接关系:在 WHERE 子句中使用 upper(user_id) 可能需要基于函数的索引才能有效运行。另外,user_id 真的需要是一个字符串吗?你不能把它变成整数吗?

【讨论】:

    猜你喜欢
    • 2020-09-08
    • 2011-06-12
    • 1970-01-01
    • 2011-04-30
    • 2013-02-28
    • 2011-04-25
    • 2013-03-24
    • 1970-01-01
    相关资源
    最近更新 更多