我正在构建一个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是否会通过绑定正确清理参数,还是有一种方法可以让我更安全?
答案 0 :(得分:1)
由于您在内部调用OCI8#exec()
,传递给它的第二个参数将被绑定为查询的参数,您无需担心额外的转义。它应该通过exec()
调用在内部进行保护。
exec(sql,* bindvars)
执行sql语句。返回值的类型取决于sql语句的类型:select;插入,更新和删除;创造,改变和堕落;和PL / SQL。
当指定bindvars时,它们在执行之前被绑定为绑定变量。