代码之家  ›  专栏  ›  技术社区  ›  Phil

Rails ActiveRecord Sanitize_SQL Replaces?串

  •  0
  • Phil  · 技术社区  · 6 年前

    我有一个由受信任的管理员编写的普通SQL查询,它将在Rails(4.2)应用程序中运行。我正在用消毒 ActiveRecord::Base.send(:sanitize_sql, ...) 允许用户输入作为条件,使用 ? 绑定变量的字符。代码必须允许任意的SQL,所以我对关于为什么这不是Rails方式等的参数不感兴趣。

    问题是我不能包括 ? 在SQL的结果字段中,不带基础 replace_bind_variables 方法替换预期的文本 ? 在结果中。

    例如,一个简单的查询是:

    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 或某种变体允许文字 ? 要包含在查询中以便不替换的字符?有什么办法可以摆脱他们吗?

    1 回复  |  直到 6 年前
        1
  •  0
  •   Phil    6 年前

    最后,我通读了ActiveRecord源代码,在没有大量代码更改的情况下无法确定处理这种情况的方法。似乎没有办法逃脱 ? 字符。

    为了解决这个查询,我最终使用了SQL chr() 函数生成一个字符,该字符将通过Santization步骤而不受影响:

    select 'http://www.google.com' || chr(63) || 'q=' || res from some_table where a = ?;
    

    ASCII字符63是 ? .

    虽然不是一个完美的解决方案,但我至少可以在不需要进行大量代码更改的情况下将这一个SQL查询引入系统。