Rails:对存储数组的安全查询

时间:2016-06-19 20:50:13

标签: sql ruby-on-rails arrays postgresql activerecord

我在Postgres数据库中对数组字段执行where查询时遇到问题 在我的rails应用程序中,我有一个名为» strace -f -e trace=execve /usr/bin/python -c "import subprocess; subprocess.Popen(['ls', '/usr'])" execve("/usr/bin/python", ["/usr/bin/python", "-c", "import subprocess; subprocess.Po"...], [/* 58 vars */]) = 0 strace: Process 8350 attached [pid 8350] execve("/usr/local/sbin/ls", ["ls", "/usr"], [/* 58 vars */]) = -1 ENOENT (No such file or directory) [pid 8350] execve("/usr/local/bin/ls", ["ls", "/usr"], [/* 58 vars */]) = -1 ENOENT (No such file or directory) [pid 8350] execve("/usr/bin/ls", ["ls", "/usr"], [/* 58 vars */]) = 0 arm-none-eabi avr bin games include lib lib32 lib64 libexec local python sbin share src usr x86_64-pc-linux-gnu [pid 8350] +++ exited with 0 +++ --- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=8350, si_uid=1000, si_status=0, si_utime=0, si_stime=0} --- +++ exited with 0 +++ 的表。其中一列称为People。现在这个列包含数组值,即:

pets

我想执行一个查询,返回所有有宠物狗的人。

到目前为止,我一直在使用的解决方案看起来像

["dog", "cat", "fish"]

其中People.where("\"pets\" @> '{\"" + checkedPet + "\"}'") 是一个变量,可能是“狗”或任何其他动物。

这有效但我觉得容易受到SQL注入问题的影响吗? 是这样的吗?如果是这样,什么是更好,更安全的解决方案来避免它?

1 个答案:

答案 0 :(得分:1)

根据ActiveRecord and PostgreSQL guide,您可以执行以下操作:

People.where('? = any("pets")', checkedPet)

People.where('"pets" @> ?', "{#{checkedPet}}")