是否可以在子查询中“删除”?

Nat*_*ong 5 postgresql postgresql-9.3

是否可以将 aDELETE作为 a 的子查询运行SELECT?例如:

SELECT * FROM posts where title = (DELETE FROM posts returning 'whoops');
Run Code Online (Sandbox Code Playgroud)

当我尝试这个时,我得到syntax error at or near "FROM",指向FROMDELETE,所以这似乎不可能,但也许我只是以某种方式做错了。

上下文:我试图了解某些 SQL 注入攻击可能造成的损害。在这种情况下,整个查询将在没有变量绑定的准备好的语句中运行。这意味着攻击者无法运行多个顶级语句,但我正在尝试评估子查询可能造成的损害。

编辑:我应该说,查询代码正在做类似的事情:

 query_parameter = blindly_read_from_user_input()

 # this is just interpolated into a string
 db_query = "SELECT * FROM posts WHERE title = '#{query_parameter}'"

 connection.prepare("query_name", db_query)
 connection.exec_prepared("query_name")
Run Code Online (Sandbox Code Playgroud)

所以:

  • 它使用的是准备好的语句,这意味着攻击者无法运行多个顶级查询
  • 它没有使用绑定参数

我正在尝试查看是否可以在此现有查询结构中基于 SQL 注入删除记录。

ype*_*eᵀᴹ 8

您可以DELETE在 CTE - 这是一种不同类型的子查询。

但是对于这种简单的情况,您可能不需要它,您只需要使用RETURNING并修复代码中的语法错误:

DELETE 
FROM posts AS p
WHERE p.title = 'whoops'
RETURNING p.* ;
Run Code Online (Sandbox Code Playgroud)