我有使用oracle视图/函数的rails代码。这是我的代码:
def run_query
connection.exec_query(
"SELECT * FROM TABLE(FN_REQ(#{demo_type_param},#{demo_tid_param}}))")
end
当运行Brakeman分析仪时,它会警告可能的"sql注入攻击"
我需要了解这是否是有效的警告,如果是,如何补救?
由于这是一个函数而不是一个实际的表,我不确定什么是正确的方法。如果它是一个普通模型,我会遵循这个模式:
Model.where("mycolumn1= ? AND mycolumn2= ?", demo_type_param, demo_tid_param).firs
吨
是的,这是真实的。几乎每次通过简单地连接变量构建任何 SQL 查询时,您都容易受到 SQL 注入的影响。通常,每次插入到查询中的数据看起来像有效的 SQL 并可能导致执行其他查询时,都会发生 SQL 注入。
唯一的解决方案是手动强制实施适当的转义或使用预准备语句,后者是首选解决方案。
使用ActiveRecord/Rails,您可以直接将exec_query
与绑定一起使用
sql = 'SELECT * FROM TABLE(FN_REQ(?,?))'
connection.exec_query(sql, 'my query', [demo_type_param, demo_tid_param])
在这里,Rails 将在数据库上准备语句,并在执行时向其添加参数,确保所有内容都正确转义并从 SQL 注入中保存。