我对sql二阶段注入进行了一些操作,从我理解它们从数据库中检索数据时发生的事情和“var(行单元格数据)”包含将执行的SQL代码(?为什么要执行它?)。
我的问题是:为了防止这些攻击,有没有办法告诉PDO我查询的数据只有PURE DATA而且没有SQL代码可以执行(比如当你使用预准备语句绑定值时)。 ..)?
答案 0 :(得分:3)
二阶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注入漏洞。例如,我可能会欺骗您的代码来设置所有用户'通过登录我的帐户并更改密码,密码为单个密码。
如果您总是使用预准备语句,并且您的代码不会天真地处理来自数据库的数据,就好像它是某种方式已经安全,并且#34;那么可以避免二阶漏洞。
这不是一个根本不同的案例,它恰好发生在"之后"在你的代码中。