MySQL 及 SQL 注入学习笔记
1. MySQL 学习笔记
1.1 MySQL 基础语法
MySQL 是一种关系型数据库管理系统,其基础语法包括以下内容:
- 创建数据库和表
- 插入、更新、删除数据
- 查询数据
以下是一个创建表的示例:
Copy CodeCREATE TABLE `users` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(255) NOT NULL,
`email` varchar(255) NOT NULL,
`password` varchar(255) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
1.2 MySQL 高级语法
MySQL 高级语法包括以下内容:
- 聚合函数
- 分组查询
- 连接查询
以下是一个连接查询的示例:
Copy CodeSELECT users.name, orders.product_name
FROM users
INNER JOIN orders ON users.id = orders.user_id
WHERE users.id = 1;
2. SQL 注入学习笔记
2.1 什么是 SQL 注入
SQL 注入是一种常见的web应用程序安全漏洞。攻击者可以向应用程序提交恶意 SQL 查询,以获取敏感数据或修改数据库中的数据。
2.2 SQL 注入实例
以下是一个简单的登录表单的示例,其存在 SQL 注入漏洞:
htmlCopy Code<form action="login.php" method="post">
<label for="username">Username:</label>
<input type="text" name="username" id="username">
<br>
<label for="password">Password:</label>
<input type="password" name="password" id="password">
<br>
<input type="submit" value="Login">
</form>
登录代码如下:
phpCopy Code<?php
$username = $_POST['username'];
$password = $_POST['password'];
$sql = "SELECT * FROM users WHERE username = '$username' AND password = '$password'";
$result = mysqli_query($conn, $sql);
if (mysqli_num_rows($result) > 0) {
echo "Logged in successfully!";
} else {
echo "Invalid username or password!";
}
mysqli_close($conn);
?>
攻击者可以通过在用户名输入框中输入以下内容来利用 SQL 注入漏洞:
Copy Code' OR 1=1--
此代码将查询所有用户,并返回第一个结果,因为 1=1
始终为 true。
为了避免 SQL 注入攻击,可以使用参数化查询或转义用户输入。例如,使用参数化查询的代码如下所示:
phpCopy Code<?php
$username = $_POST['username'];
$password = $_POST['password'];
$stmt = $conn->prepare("SELECT * FROM users WHERE username = ? AND password = ?");
$stmt->bind_param("ss", $username, $password);
$stmt->execute();
$result = $stmt->get_result();
if ($result->num_rows > 0) {
echo "Logged in successfully!";
} else {
echo "Invalid username or password!";
}
$stmt->close();
$conn->close();
?>