我有一个由受信任的管理员编写的纯 SQL 查询,该查询将在 Rails (4.2) 应用程序中运行。我正在清理它ActiveRecord::Base.send(:sanitize_sql, ...)
以允许用户输入作为条件,使用?
绑定变量的字符。代码必须允许任意 SQL,所以我对为什么这不是 Rails 方式等的论点不感兴趣。
问题是,如果?
没有底层replace_bind_variables
方法替换?
结果中的预期文字,我就无法包含在 SQL 的结果字段中。
例如,一个简单的查询是:
select 'http://www.google.com?q=' || res from some_table where a = ?;
消毒:
ActiveRecord::Base.send(:sanitize_sql, [sql, 'not me'], :some_table)
清理失败,因为?
URL 中的 被替换为用于条件的数据,导致异常:
ActiveRecord::PreparedStatementInvalid: wrong number of bind variables (1 for 2)
问题是,是否sanitize_sql
或某些变体允许?
在查询中包含文字字符,以便它们不被替换?有什么办法可以逃避他们吗?
最后,我通读了 ActiveRecord 源代码,如果没有大量代码更改,我无法确定处理这种情况的方法。似乎没有办法转义?
字符。
为了解决这个查询,我最终使用 SQLchr()
函数生成一个字符,该字符将通过 santization 步骤原封不动:
select 'http://www.google.com' || chr(63) || 'q=' || res from some_table where a = ?;
ASCII 字符 63 是?
.
虽然不是一个完美的解决方案,但我至少可以将这个 SQL 查询输入系统,而无需进行大量代码更改。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句