【问题标题】:Ruby/Rails/PostgreSQL PGError: syntax error at or nearRuby/Rails/PostgreSQL PGError:在或附近出现语法错误
【发布时间】:2010-10-28 13:00:13
【问题描述】:

我在尝试从 postgresql 数据库中的表中选择 cookie 值时出现标题错误,我不知道为什么。选择此表中的其他字段可以正常工作。

这是中断的地方:

user=UniqueUser.find(:all, :select => 'DISTINCT visitor_id', :conditions=> "visitor_id=#{visitorid}")

该列被定义为字符变化(255)

这是错误:

187/lib/ruby/gems/1.8/gems/activerecord-2.3.5/lib/active_record/connection_adapt
ers/abstract_adapter.rb:219:in `log': PGError: ERROR:  syntax error at or near "
c5a" (ActiveRecord::StatementInvalid)
LINE 1: ...M "unique_users" WHERE (visitor_id=d5fb0ff2-319e-4c5a-b07c-a...

Rails 似乎应该在 where 子句中的数据字段周围加上引号。

我当然不是 Rails 专家,所以我做错了可能很简单,感谢任何帮助。

【问题讨论】:

  • 你的 SQL 输出是什么?
  • 嗨 shingara,我看到的唯一输出是我在上面粘贴的。 ...M "unique_users" WHERE (visitor_id=d5fb0ff2-319e-4c5a-b07c-a... 可能有一种方法可以获得确切的陈述,但我不知道,Swanand 解决了我的问题,所以我我想我现在不会担心了。谢谢你的帮助。

标签: ruby-on-rails ruby postgresql


【解决方案1】:

您没有正确地转义您的输入。试试这个:

user = UniqueUser.find(:all, :select => 'DISTINCT visitor_id', :conditions=> ['visitor_id = ?', visitorid])

【讨论】:

  • 恭喜,您刚刚将您的应用暴露给 SQL 注入 :)
  • Ariejan- 如果您有时间详细说明,我将不胜感激。我了解 SQL 注入,但不了解它与这个 Rails 示例的关系。谢谢!
  • OP代码存在注入漏洞,因为visitorid是使用#{}直接注入到SQL语句中的。如果某个用户以某种方式将值0 OR 1=1 输入到visitorid 中,您的SQL 语句最终将如下所示:SELECT visitor_id FROM visitors WHERE visitor_id = 1 OR 1=1,并且查询将返回系统中所有用户ID 的列表。或者更糟糕的是,一个更复杂的字符串可能允许某人在第一个查询之后执行第二个查询,并取回他们想要的任何信息。通过使用如上所示的问号将所有变量以 Rails 方式传递给 SQL 来防止这种情况发生。
  • @Ariejan :您能解释一下在这种情况下如何进行 SQL 注入吗? :conditions => 转义用户输入,因此 ? 将其视为准备好的查询。其实条件数组是用来避免 SQL注入的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-26
  • 1970-01-01
  • 2020-02-05
  • 2017-03-16
相关资源
最近更新 更多