1

我正在构建一个网络表单,我想用来自外部 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 会通过绑定正确清理参数,还是有一种方法可以让我更安全?

4

1 回答 1

1

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

从文档:

执行(sql,*绑定变量)

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

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

于 2012-04-09T14:51:00.463 回答