@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。
感谢。
答案 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中实现转义一样安全。