我有一个由受信任的管理员编写的简单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
或某些变体是否允许在查询中包含文字?
字符,以便不替换它们?有逃脱它们的方法吗?
答案 0 :(得分:0)
最后,我通读了ActiveRecord的源代码,并且没有大量的代码更改就无法找到一种处理这种情况的方法。似乎没有一种转义?
字符的方法。
为解决此查询的问题,我最终使用了SQL chr()
函数来生成一个字符,该字符将不加修饰地通过定格步骤:
select 'http://www.google.com' || chr(63) || 'q=' || res from some_table where a = ?;
ASCII字符63为?
。
尽管这不是一个完美的解决方案,但我至少可以将此SQL查询输入系统,而不必进行大量代码更改。