Avatar ·

PDO预处理查询是否足以防范SQL注入?

大家好!我是一名初学PHP的开发者,正在尝试理解数据库操作的安全性。我读过很多文章,其中提到PDO和预处理查询(prepared statements)是防范SQL注入的银弹。但有几个点让我感到困惑。 以下是我的代码示例: ```php $pdo = new PDO('mysql:host=localhost;dbname=test', 'user', 'pass'); $stmt = $pdo->prepare("SELECT * FROM users WHERE username = :username"); $stmt->execute([':username' => $_GET['username']]); $user = $stmt->fetch(); ``` 我认为这是安全的,因为我使用了占位符(placeholders)。但后来我在一个旧项目中看到了这样的代码: ```php $pdo->query("SELECT * FROM users WHERE id = " . $_GET['id']); ``` 于是我开始思考:如果我在某个地方不小心忘记使用预处理查询怎么办?或者我使用了PDO,但错误配置了预处理查询的模拟(emulation)?攻击者能否绕过PDO的保护? 我还听说过动态查询(dynamic queries)……