PHP/SQL安全问题:新手编写的find方法存在SQL注入风险如何解决?
问题原因与解决办法
你的find方法存在SQL注入风险的核心原因是:你直接把$id拼进了SQL字符串,且调用queryType时没传第二个参数,这会让代码走到queryType的else分支,使用不安全的query()方法执行SQL,完全绕开了预处理的防护逻辑。哪怕$id声明为int类型,PHP的类型约束在某些场景下可能被绕过,直接拼接SQL的写法本身就是注入漏洞的温床。
直接修复方法
修改find方法,改用参数化查询,让queryType走预处理分支:
public function find(int $id) { // 使用?作为占位符,把$id放到参数数组中传入 return $this->queryType("SELECT * FROM {$this->table} WHERE id = ?", [$id])->fetch(); }
这样SQL语句里的?会被预处理机制安全替换为$id的值,彻底避免注入风险。
更安全的优化建议
可以直接改造queryType方法,强制所有查询都使用预处理,从根源上杜绝误用query()的可能:
public function queryType(string $sql, array $attributes = []) { $this->Database = Database::getInstance(); // 不管有没有参数,都走预处理流程 $query = $this->Database->prepare($sql); $query->execute($attributes); return $query; }
这个版本的代码更简洁,也能确保所有SQL查询都通过预处理执行,彻底消除因忘记传参数而产生的安全隐患。
内容的提问来源于stack exchange,提问作者cha-linda
相关产品推荐
相关产品推荐

