postgresql – 我可以获得Ecto来记录原始SQL吗?
我正在构建一个像这样的Ecto查询:
from item in query,where: like(item.description,^"%#{text}%") 我担心这允许在文本中注入SQL.在尝试修复之前,我想看看查询是如何实际发送到数据库的. 如果我inspect the query或查看记录的内容,我会看到一些SQL,但它无效. 例如,检查查询向我显示: {"SELECT i0."id",i0."store_id",i0."title",i0."description" FROM "items" AS i0 WHERE (i0."description" LIKE $1)",["%foo%"]} 当我将此查询传递给Repo.all时,它记录下来: SELECT i0."id",i0."store_id",i0."title",i0."description" FROM "items" AS i0 WHERE (i0."description" LIKE $1) ["%foo%"] 但如果我将其复制并粘贴到psql中,PostgreSQL会给我一个错误:
似乎Ecto实际上可能正在做parameterized query,如下所示: PREPARE bydesc(text) AS SELECT i0."id",i0."description" FROM "items" AS i0 WHERE (i0."description" LIKE $1); EXECUTE bydesc('foo'); 如果是这样,我认为这会阻止SQL注入.但我只是猜测这就是Ecto的作用. 如何查看Ecto正在执行的实际SQL?
Ecto仅使用预准备语句.使用ecto查询语法时,无法引入SQL注入.查询语法在编译时验证不可能进行SQL注入.
由于几个原因,准确显示执行的查询可能很困难: > Postgrex(以及Ecto)使用postgresql二进制协议(而不是最常见但效率较低的文本协议),因此PREPARE查询实际上从未作为字符串存在. 根据我的经验,大多数此类软件使用prepare语句并记录它们而不是原始查询,因为它更有助于理解系统的行为. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |