MySQL基础教程
01、MySQLMariaDB 基础教程
02、MySQL 简介
03、MySQL MariaDB 安装
04、MySQL 管理
05、MySQL 日常管理
06、MySQL PHP 语法
07、MySQL 创建连接
08、MySQL 获取数据库列表
09、MySQL 创建数据库
10、MySQL 删除数据库
11、MySQL 选择数据库
12、MySQL 数据类型
13、MySQL 列出数据表
14、MySQL 创建数据表
15、MySQL 删除表
16、MySQL 插入数据
17、MySQL 获取插入数据的 ID
18、MySQL SELECT FROM 查询数据
19、MySQL WHERE 子句有条件的查询数据
20、MySQL UPDATE 更新数据
21、MySQL DELETE FROM 语句删除数据
22、MySQL 返回删改查受影响的行数
23、MySQL LIKE 子句模糊查询数据
24、MySQL UNION 操作符查询多张表
25、MySQL ORDER BY 排序
26、MySQL GROUP BY 分组查询数据
27、MySQL JOIN 进行多表查询
28、MySQL NULL 值处理
29、MySQL REGEXP 子句正则表达式查询
30、MySQL 数据库事务
31、MySQL ALTER 命令
32、MySQL 索引
33、CREATE TEMPORARY TABLE 创建临时表
34、MySQL DROP TABLE 删除临时表
35、MySQL INSERT INTO SELECT 复制表
36、MySQL 获取服务器元数据
37、MySQL 自增序列 AUTO_INCREMENT
38、MySQL 处理重复数据
39、MySQL 安全及防止 SQL 注入攻击
40、MySQL 导出数据
41、MySQL 导入数据
本文档使用 MrDoc 发布
-
+
首页
39、MySQL 安全及防止 SQL 注入攻击
如果通过网页获取用户输入的数据并将其插入 `MySQL` 数据库,那么就有可能发生 `SQL` 注入攻击的安全问题 作为研发,有一条铁律需要记住,那就是 **永远不要相信用户的数据,哪怕他一再承诺是安全的** ### **SQL 注入式攻击** ------------ `SQL` 注入,就是通过把 `SQL` 命令插入到 `Web` 表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的 `SQL` 命令 比如有一个表单,用户可以输入 `name` ```php <?php $name = $_GET['name']; $dbh->query("SELECT * FROM users WHERE name='{$name}'"); ``` 那么当用户输入的 `name` 为 `Python'; DELETE FROM user;'` 时会变成什么? ```php SELECT * FROM users WHERE name='Python'; DELETE FROM user;''; ``` 这条语句运行一下,会发现什么? 我们的 `user` 表被清空啦,很可怕,对不对 所以我们需要对用户的输入进行过滤处理 例如下面的 PHP 语句,要求用户输入的名称 `name` 必须是字母、数字及下划线的组合,且用户名长度为 8 到 20 个字符之间 ```php <?php if (preg_match("/^\w{8,20}$/", $_GET['name'], $matches)) $dbh->query("SELECT * FROM tbl_language WHERE name=$matches[0]"); else echo "username 输入异常"; ``` ### **防止 SQL 注入要诀** ------------ 防止 `SQL` 注入,我们需要注意以下几个要点 1、 永远不要信任用户的输入;对用户的输入进行校验,可以通过正则表达式,或限制长度;对单引号和双 "-" 进行转换等 2、 永远不要使用动态拼装SQL,可以使用SQL预处理语句; 3、 永远不要使用管理员权限的数据库连接,为每个应用使用单独的权限有限的数据库连接; 4、 不要把机密信息直接存放,加密或者hash掉密码和敏感的信息; 5、 应用的异常信息应该给出尽可能少的提示,最好使用自定义的错误信息对原始错误信息进行包装; 6、 SQL注入的检测方法一般采取辅助软件或网站平台来检测; ### **防止 SQL 注入** ------------ `Perl` 和 `PHP` 中可以对用户输入的数据进行转义从而来防止 `SQL` 注入 PHP中可以使用 `PHP_PDO` 的 `PDO:prepare()` 方法来预处理 SQL 语句,然后使用 `PDOStatement::bindParam()` 方法绑定参数,或者在 `PDOStatement::execute()` 传入参数来预防 SQL 注入 ```php <?php $stmt = $dbh->prepare("SELECT * FROM tbl_language WHERE name=?"); $stmt->execute(array$_GET['name'])); ``` ### **LIKE 子句语句中的 SQL 注入** ------------ 使用 `LIKE` 子句查询时,如果用户输入的值有 `_` 或 `%`,则会出现下面这种情况 用户本来只是想查询 `abcd%`,查询结果中却有 `abcd_`、`abcde`、`abcdf` 等等 PHP脚本中,我们首先要使用 `addcslashes($name,"%_")` 对输入的字符进行转义,然后使用 `PHP_PDO` 的 `PDO:prepare()` 方法来预处理 SQL 语句,然后使用 `PDOStatement::bindParam()` 方法绑定参数,或者在 `PDOStatement::execute()` 传入参数来预防 SQL 注入 ```php $name = 'thon%'; $name = addcslashes($name,"%_"); $stmt = $dbh->prepare("SELECT * FROM tbl_language WHERE name LIKE ? "); $stmt->execute(array( '%'.$name)); ```
李智
2025年3月17日 13:31
转发文档
收藏文档
上一篇
下一篇
手机扫码
复制链接
手机扫一扫转发分享
复制链接
Markdown文件
分享
链接
类型
密码
更新密码