假设使用PHP和MySQL,我准备以下SQL语句:
$statement = $connection->prepare("SELECT departmentName FROM departments WHERE department_type='academic' AND buildingName=?")
- 其中 buildingName 是由URL查询字符串传递的参数(经验证并被绑定), department_type 是已知参数。
这种预准备语句仍然容易受到SQL注入或任何其他SQL攻击吗?具体来说,是将一个确定的参数(在本例中为 department_type )直接放入预处理语句的命令字符串中可能存在漏洞吗?
答案 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?