存在一些类似于反向准备语句的东西


Exist something like inverse prepared statements?

我了解了一些关于sql二阶注入的知识,据我所知,当你从DB中检索数据时,它们会发生,并且"var(行单元格数据)"包含将执行的sql代码(?为什么要执行它?)。

我的问题是:为了防止这些攻击,有没有一种方法可以告诉PDO,我查询的数据只是纯数据,没有SQL代码可执行(比如使用准备好的语句绑定值…)?

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

二阶SQL注入漏洞与经典漏洞非常相似,但是由于您的代码天真地处理或信任已存储在数据库中的数据,而不是天真地处理外部/用户提供的数据。

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

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

你已经理解了这一部分。

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

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

如果您稍后在代码中正确但天真地假设我的帐户信息"来自数据库"而不是"来自外部来源",并且您懒惰地构建查询,这是不安全的。。。

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

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

如果你总是使用准备好的语句,而你的代码没有天真地处理来自数据库的数据,就好像它在某种程度上"已经安全了",那么二阶漏洞是可以避免的。

这并不是一个根本不同的情况,它只是在代码中"稍后"发生。