2014-03-19 75 views
0

假设,使用PHP和MySQL,我准备下面的SQL语句:SQL注入和预处理语句

$statement = $connection->prepare("SELECT departmentName FROM departments WHERE department_type='academic' AND buildingName=?") 

- 在buildingName是通过URL的查询字符串传递的(这是验证一个参数,成为绑定)并且department_type是已知参数。

这种风格的准备语句仍然容易受到SQL注入或任何其他SQL攻击?具体来说,是否放置了一个权威参数,在这种情况下department_type,直接放入准备好的语句的命令字符串中一个可能的漏洞?

回答

3

不,它不会受到攻击。使用预准备语句是防范SQLi的建议方法。

如果您确定department_type参数不受任何用户输入的影响,那么将其直接放入查询中是安全的。

虽然受到用户输入影响的变量有点复杂。这种效果也可以是间接的。例如,如果从数据库中检索到department_type,该数据库保存在受用户影响的另一个页面上,则它受到用户输入的间接影响,应被视为“不可信”。

1

消除输入(有时甚至输出)是一种很好的做法,因为它可能会破坏应用程序的其他部分。如果您使用准备好的语句,则您的数据库不会受到影响,但如果您正在提供网页,则可能会受到攻击的影响。

以可能的攻击类型为例,您可以检查XSS attacks。它目前被列为owasp网站中使用次数最多的第三种攻击类型。