带有准备语句的SQL注入

时间:2014-03-19 07:09:02

标签: php mysql security sql-injection

假设使用PHP和MySQL,我准备以下SQL语句:

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

- 其中 buildingName 是由URL查询字符串传递的参数(经验证并被绑定), department_type 是已知参数。

这种预准备语句仍然容易受到SQL注入或任何其他SQL攻击吗?具体来说,是将一个确定的参数(在本例中为 department_type )直接放入预处理语句的命令字符串中可能存在漏洞吗?

3 个答案:

答案 0 :(得分:3)

不,它不会脆弱。使用预准备语句是建议的防范SQLi的方法。

如果您确定department_type参数不受任何用户输入的影响,则可以将其直接放入查询中。

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

答案 1 :(得分:1)

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

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

答案 2 :(得分:-1)

直接在查询中使用department_type是安全的,因为department_type =' academic'是不变的,不能改变。

希望这些链接对您有所帮助。

How does PHP PDO's prepared statements prevent sql injection?