使用多个AND / OR子句阻止sql注入,Activerecord #where

时间:2014-08-26 22:34:49

标签: postgresql ruby-on-rails-4 rails-activerecord

我对rails很新。我有一个模型'消息'使用:' belongs_to:sender'和' belongs_to:接收器'关系。 我正在尝试在两个用户之间创建一个消息线程:' current_user'和' params'。 在MessagesController的show controller操作中,我想使用这个sql查询的等价物:

Message.find_by_sql(
    "SELECT *
    FROM messages
    WHERE
        (sender_id = #{current_user.id} OR sender_id = #{params[:id]})
    AND
        (receiver_id = #{current_user.id} OR receiver_id = #{params[:id]});"
)

如果我在寻找一条消息,我会使用此Activerecord查询来阻止SQL注入:

Message.where('sender_id = ? OR receiver_id = ?', current_user.id, current_user.id).find(params[:id])

我目前的查询是:

Message.where(sender_id: [current_user.id, params[:id]], receiver_id: [current_user.id, params[:id]])

此查询目前是否防止SQL注入?

1 个答案:

答案 0 :(得分:1)

这是安全的。最终查询类似sender_id IN (1, 2) AND receiver_id IN (3, 4),所有整数值都被清理。你可以简单地运行测试:

Message.where(sender_id: [current_user.id, "' is dangerous"], receiver_id: [current_user.id, params[:id]])

并在控制台中查看原始SQL输出。非法整数应转换为0。