MySQL 及 SQL 注入学习笔记

1. MySQL 学习笔记

1.1 MySQL 基础语法

MySQL 是一种关系型数据库管理系统,其基础语法包括以下内容:

  • 创建数据库和表
  • 插入、更新、删除数据
  • 查询数据

以下是一个创建表的示例:

Copy Code
CREATE 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 Code
SELECT 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(); ?>

参考文献