PHP 例子sql注入
时间: 2023-07-07 11:35:24 浏览: 171
下面是一个 PHP 中 SQL 注入攻击的例子:
假设有一个用户登录的 Web 应用程序,用户可以通过输入用户名和密码进行登录。Web 应用程序将用户输入的用户名和密码存储在一个 SQL 数据库中,用于验证用户的身份。下面是一个简单的 PHP 代码示例:
```
<?php
$username = $_POST['username'];
$password = $_POST['password'];
$conn = mysqli_connect('localhost', 'root', '', 'test');
$sql = "SELECT * FROM users WHERE username='$username' AND password='$password'";
$result = mysqli_query($conn, $sql);
if(mysqli_num_rows($result) > 0) {
echo "登录成功";
} else {
echo "登录失败";
}
mysqli_close($conn);
?>
```
在上述代码中,我们通过 `$_POST` 获取用户输入的用户名和密码,并将其拼接到 SQL 查询语句中。由于没有对用户输入的数据进行任何验证和过滤,攻击者可以通过输入恶意代码来实现 SQL 注入攻击。例如,攻击者可以输入以下内容作为用户名:
```
' OR 1=1 --
```
这段代码会被拼接到 SQL 查询语句中,从而将查询条件改变为 `WHERE username='' OR 1=1 --' AND password='xxx'`,使得查询结果总是返回真,从而实现绕过登录验证的攻击。
为了避免 SQL 注入攻击,应该对用户输入的数据进行验证和过滤,例如使用 `mysqli_real_escape_string()` 函数对字符串进行转义,或者使用预处理语句来绑定参数。例如,以下是使用预处理语句来执行 SQL 查询的示例代码:
```
<?php
$username = $_POST['username'];
$password = $_POST['password'];
$conn = mysqli_connect('localhost', 'root', '', 'test');
$stmt = $conn->prepare("SELECT * FROM users WHERE username=? AND password=?");
$stmt->bind_param("ss", $username, $password);
$stmt->execute();
$result = $stmt->get_result();
if(mysqli_num_rows($result) > 0) {
echo "登录成功";
} else {
echo "登录失败";
}
$stmt->close();
mysqli_close($conn);
?>
```
在上述代码中,我们使用 `mysqli_prepare()` 函数来创建一个预处理语句,然后使用 `bind_param()` 方法来绑定参数。这样可以避免 SQL 注入攻击,因为 SQL 查询语句和参数是分开处理的。
阅读全文