ruby-on-rails - Rails ActiveRecord sanitize_sql 替换 ? 在字符串中
问题描述
我有一个由受信任的管理员编写的普通 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
或某些变体允许将文字?
字符包含在查询中,以便它们不会被替换?有什么办法可以逃脱它们吗?
解决方案
最后,我通读了 ActiveRecord 源代码,如果没有大量代码更改,就无法确定一种处理这种情况的方法。似乎没有办法逃脱?
角色。
为了解决这个查询,我最终使用 SQLchr()
函数来生成一个字符,该字符将不加改动地通过清理步骤:
select 'http://www.google.com' || chr(63) || 'q=' || res from some_table where a = ?;
ASCII 字符 63 是?
.
虽然不是一个完美的解决方案,但我至少可以将这个 SQL 查询导入系统,而无需进行大量代码更改。
推荐阅读
- regex - ansible failed_when 字符串包含“fail”或“error”或“fault”不区分大小写
- javascript - 使用 Velocity 或类似工具从 JSON 页面定义文件生成动态网页
- python - python - 如何使用Python kivy在触摸时获取触摸屏的x,y坐标?
- sandbox - 主机可以选择将哪些系统调用传递给每个 webassembly 模块
- python - msg_dtype 如果 msg_dtype 不是 None else X.dtype) ValueError: Input contains NaN, infinity or a value too large for dtype('float64')
- r - 在 Rshiny 中编辑其值时更改数据表单元格的背景颜色
- python - 在 Python 中读取 Matlab 文件并转换为数据框
- python - 如何纠正/改进我的 CNN 模型?如何处理验证准确性冻结问题?
- iframe - 如何在 iframe 中启用陀螺仪
- android - CameraConstrainedHighSpeedCaptureSession 不适用于 API 级别 30 (Android 11)