如何防止PHP中的SQL注入?(完整指南)
大家好!我是一名初学PHP开发者,遇到了一个严重的安全问题。我正在编写一个简单的网站登录表单,我的代码大致如下:
```php
$username = $_POST['username'];
$password = $_POST['password'];
$query = "SELECT * FROM users WHERE username='$username' AND password='$password'";
$result = mysqli_query($conn, $query);
```
我知道这非常不安全,但不知道如何正确修复。朋友说我的系统可能通过SQL注入被攻破。我尝试在登录字段中输入类似 `admin' OR '1'='1` 的内容,结果真的没有密码就登录成功了!
我读过关于 `mysqli_real_escape_string()` 的内容,但听说这并非万能药。还有人提到PDO和prepared statements,但我不明白如何正确使用它们。我的项目运行在PHP 8.1和MySQL上。
请详细解释:
1. SQL注入具体是如何工作的?
2. 有哪些现代的防护方法?
3. 哪种方法被认为是最佳实践?