是否存在类似反向准备语句的东西?

Exist something like inverse prepared statements?

我骑了一些关于 sql 二阶注入的东西,根据我的理解,当你从数据库中检索数据并且 "var (row cell data)" 包含将执行的 SQL 代码时,它们就会发生(?为什么会被执行?).

我的问题是:为了防止这些攻击,有没有办法告诉 PDO 我正在查询的数据只是纯数据,没有要执行的 SQL 代码(比如当你使用绑定值的准备语句...)?

二阶SQL注入不是数据库的漏洞,也不是PDO等的漏洞,其中SQL存储在数据库中的代码是PDO或数据库在你取的时候意外执行的.

二阶SQL注入漏洞与经典漏洞非常相似,但是是由于您的代码天真地处理或信任您已经存储在数据库中的数据而引起的,而不是天真地处理external/user-supplied数据。

如果我尝试使用用户名 michael ' OR 1=1 -- 登录您的网站,而您天真地设计了一个易受 SQL 注入攻击的查询,我可能只能登录,因为您的查询变为...

SELECT * FROM user
 WHERE username = 'michael' OR 1 = 1 --';

这部分你已经明白了。

所以,您正在使用准备好的语句并避免这种基本的编程缺陷。

但是,如果我能够创建这样的帐户,现在您的数据库中存储可能存在不安全数据。但这并不是不安全的,因为 PDO 或服务器将允许它稍后自发执行。

如果您正确但天真地稍后在您的代码中假设我的帐户信息"came from the database"而不是"came from the an external source"并且您懒惰地构建一个查询...

... "WHERE username = '" + $stored_username + "';" ...

...这是二阶 SQL 注入漏洞。例如,我可以通过登录我的帐户并更改我的密码来欺骗您的代码,将所有用户的密码设置为一个密码。

如果您总是使用准备好的语句并且您的代码不会天真地处理来自数据库的数据,就好像它是某种方式 "already safe," 那么二阶漏洞是可以避免的。

这不是根本不同的情况,它只是发生在您的代码中 "later"。