Rails OCI8防止注射

时间:2012-04-09 14:13:01

标签: ruby-on-rails ruby-on-rails-3 oracle sql-injection oci8

我正在构建一个webform,我想用外部oracle数据库预先填充数据。我们正在使用rails OCI8插件。

我想通过直接在查询中使用URL参数来确保我不会让自己开放注射。

例如在控制器中:

  def new
    if params[:provider] && u = findByUserName(params[:provider])
        monkey = {
            :employeeEmail => u['EMAIL_ADDRESS'],
            :employeeFirst => u['FIRST_NAME'],
            :employeeLast => u['LAST_NAME'],
            :userID => u['LOGIN_ID'],
            :supervisorUserID => u['SUPERVISOR_ID'],
            :supervisorName => u['SUPERVISOR_NAME'],
            :supervisorEmail => u['SUPERVISOR_EMAIL']
        }
        @service = Service.new(monkey)
    else
        @service = Service.new
    end
  end

正如您所见,params [:provider]直接传递给OCI8查询:

def findByUserName(id)
    if id
        cursor = cursor_exec("SELECT DISTINCT 
                    <QUERY INFO HERE>
            AND external_user = :id
            ORDER BY last_name, first_name", id)
        collection = cursor.fetch_hash()
        cursor.close
        logoff
        collection
    end
end

Cursor_exec函数

def cursor_exec(sql, *params)
  @conn = OCI8.new('user','pass','server')
  if params.length > 0
    cursor = @conn.exec(sql, *params)
  else
    cursor = @conn.exec(sql)
  end 
end

OCI8是否会通过绑定正确清理参数,还是有一种方法可以让我更安全?

1 个答案:

答案 0 :(得分:1)

由于您在内部调用OCI8#exec(),传递给它的第二个参数将被绑定为查询的参数,您无需担心额外的转义。它应该通过exec()调用在内部进行保护。

From the docs:

  

exec(sql,* bindvars)

     

执行sql语句。返回值的类型取决于sql语句的类型:select;插入,更新和删除;创造,改变和堕落;和PL / SQL。

     

当指定bindvars时,它们在执行之前被绑定为绑定变量。