【问题标题】:rails query generates oci:error quoted string incorrectly terminatedrails 查询生成 oci:error 引用的字符串错误终止
【发布时间】:2015-05-14 23:44:52
【问题描述】:

我在应用程序中有以下代码(非常旧):

  results << User.all(
  :select => "'#{entry.name}' AS user_name, '#{entry.lastname}, #{entry.firstname}' AS user_full_name, display_name", 
  :order => "display_name")

生成以下查询我得到以下 oci 错误:

  OCIError: ORA-01756: quoted string not properly terminated: 
SELECT 'theupsstore2579' AS user_name, 'O'Brien, Perry' AS user_full_name, display_name FROM "Users" WHERE..

有什么好的方法可以解决我的查询吗?

使用quote_string 是一种好方法吗

【问题讨论】:

    标签: ruby-on-rails ruby oracle ruby-on-rails-2 oracle-call-interface


    【解决方案1】:

    是的,有一个好方法。永远不要在 sql 查询中使用插值字符串,例如 "string bit #{interpolated_bit}" - 这对安全性非常不利,并导致 SQL 注入攻击。

    在这种情况下 - 因为其中一个名称包含 ' 字符(在姓氏 O'Brien 中 - 并且一旦将该值插入到您的 SQL 字符串中,它就会像对待任何 ' 字符一样对待它并结束字符串 - 即使'(即Brien 位)之后还有更多内容

    这会导致您的数据库出现语法错误。

    但是 - 以这种方式使用内插字符串也会让您对 SQL 注入开放 - 如果有人在他们的姓氏字段中输入 '; DROP TABLE users;(或等效项)怎么办?并且您的代码愉快地将其放入 SQL 并运行它?您使用内插字符串的方式是安全的。但是 Rails 提供了安全的替代方案——它们是你应该经常使用的。

    例如内置的 arel 方法(whereselectorder 等)并使用经过消毒的? 语法,而不是

    results << User.all(
      :select => "'#{entry.name}' AS user_name, '#{entry.lastname}, #{entry.firstname}' AS user_full_name, display_name", 
      :order => "display_name")
    

    你可以试试

    results << User.select("'?' AS user_name, '?, ?' AS user_full_name, display_name", entry.name, entry.lastname, entry.firstname).order("display_name")
    

    (尽管我质疑您为什么要强制所有用户使用相同的名称 - 您是否真的希望这些条件成为仅选择具有这些名称的用户的条件?)

    我强烈建议您通读所有 Rails 指南。在这种情况下,尤其是关于如何使用Active Record queries

    您可能还想阅读安全指南 - 特别是在这种情况下,Rails guide SQL injection section

    【讨论】:

    • 这是 rails 2,我可以在上面的查询中添加 :conditions 吗?
    • @newbie 您是否有需要使用 Rails 2 的原因?它现在已经过时多年,不再受支持。我强烈建议升级。
    • 这是一个旧的遗留应用程序,我们还没有资源/时间来升级/重写它。
    • 我没有复制上面代码中的条件部分::conditions => ["id IN (?)", array]。我会调查这个
    • 啊,对 - 我的同情。当然-是的,您可以转换为条件...我隐约记得一种将选择传递给旧式导轨的方法。
    猜你喜欢
    • 1970-01-01
    • 2015-07-11
    • 1970-01-01
    • 2021-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多