Rails和SQL注入:这样安全吗?

时间:2011-12-02 22:25:42

标签: sql ruby-on-rails database postgresql code-injection

@usersfound = User.find_by_sql(["

SELECT * from users where name @@ plainto_tsquery('english', ?) LIMIT 20 offset ?

  ",@query,@offset])

见上文,sql注入安全吗?我很擅长在rails中的数据库上执行直接sql命令。 (我知道可能有其他方法来执行此SPECIFIC查询,但我想知道,一般来说,使用find_by_sql和那种vars的插入是安全的 - 我有一些困难的查询与subselects和连接,这是真的可以做使用ActiveRecord。

感谢。

2 个答案:

答案 0 :(得分:2)

是的,这应该是安全的。如果你追踪代码,你会发现你的find_by_sql电话最终呼叫PGconn#send_query_prepared,绑定参数只是携带行李; send_query_prepared方法只是PQsendQueryPrepared API call in libpq

的包装器
static VALUE
pgconn_send_query_prepared(int argc, VALUE *argv, VALUE self)
{
    /* ... bunch of boiler plate marshalling stuff ... */
    result = PQsendQueryPrepared(conn, StringValuePtr(name), nParams, 
        (const char * const *)paramValues, paramLengths, paramFormats, 
        resultFormat);
    /* ... */
}

绑定参数最终在paramValues。所以除非PostgreSQL的C库准备好的语句处理中存在错误,否则你应该没问题。

答案 1 :(得分:1)

使用查询参数将动态值插入查询是安全的。

但这取决于Rails是否“伪造”查询参数,并且在准备语句之前实际上将@query和@offset组合到SQL字符串中。然后它就像在Rails中实现转义一样安全。