聊一下面试经常问的SQL注入
概念
一、什么是所谓的SQL注入呢?
以下解释来自百度百科:
SQL注入即是指web应用程序对用户输入数据的合法性没有判断或过滤不严,攻击者可以在web应用程序中事先定义好的查询语句的结尾上添加额外的SQL语句,在管理员不知情的情况下实现非法操作,以此来实现欺骗数据库服务器执行非授权的任意查询,从而进一步得到相应的数据信息。
二、这些都是官方属于,程序员最直观的就是直接上实例代码
下边我就使用原始的Jdbc操作数据库来模拟SQL注入的请求
1、SQL注入查询所有的用户信息
此时有个方法是按照用户名查询当前用户信息,理想状态下是只查询一个钥匙用户名不存在则返回空值。
String sql = "select id,telephone,address from user where user_name = "+ userName;
解释:看着好像也没啥毛病吧。。要是此时我将userName这个参数值传入 siri or 1 = 1
呢??看出问题了吧,这样这条sql的where条件就恒真了。相当于select * from user
请求后我就可以拿到表中所有数据了,是不是又有点慌了。。
2、SQL注入删除表
String sql = "select id,telephone,address from user where user_name = "+ userName;
解释:还是用上边的sql进行演示,加入我传入userName的值为siri ; DROP TABLE user ;
看出问题了吧,加一个分号就可以完整的写入其他可以执行的语句,看似是查询用户,分号后边的语句才是重点!!这个前提是需要知道你操作的表,大多数用户表还是user吧。要是再来个drop database;
被攻击了你可以直接跑路了。。是不是又又有点慌了。。
3、SQL注入执行数据库中的函数*
String sql = "select id,telephone,address from user where user_name = "+ userName;
解释:通过SQL注入也可以执行数据库内部的函数。如userName传入 siri union select 1,1, sysdate();
使用union 需要保证字段数量和返回的一致。再传入个siri union select 1,1, verison();
查询当前数据库版本号,再传入一个union select 1,1, (SELECT GROUP_CONCAT(schema_name) FROM information_schema.schemata) schemaName;
直接给你把当前用户左右库查出来了,删库还不容易吗。。是不是又又又有点慌了。。
三、 如何防止sql注入
sql注入通过演示的案例可以看到非常危险,肯定有成熟的解决方案喽
1、代码层防止sql注入攻击的最佳方案就是sql预编译(用的最多的)
String sql = "select id,telephone,address from user where user_name = ?";
(1)hibernate和原始jdbc可使用占位符这样我们传进来的参数就会被当作是一个userName,所以就不会出现sql注入了。
(2)mybatis中使用#{userName}
获取值可以有效防止sql注入,在MyBatis中,${xxx}
这样格式的参数会直接参与SQL编译,从而不能避免注入攻击。但涉及到动态表名和列名时,只能使用${xxx}
这样的参数格式。所以,这样的参数需要我们在代码中手工进行处理来防止注入。
【结论】在编写MyBatis的映射语句时,尽量采用#{xxx}
这样的格式。若不得不使用${xxx}
这样的参数,要手工地做好过滤工作,来防止SQL注入攻击。
2、规定数据长度,能在一定程度上防止sql注入
一般SQL注入语句占的字符都很长,我们可以限制可输入文本的输入长度,还可以在输入框中限制特殊字符。如 ` & $ 等等
3、限制数据库权限
查询、新增、删除数据、删除表、删除库等操作进行严格的用户权限划分,可以有效的减小sql注入带来的危害。尤其是删除表、删除库这样的操作一般登录用户不给予权限就ok。
以上三个使用比较多,还有一些其他的比较少用的操作,稍作了解即可
4、SQL中限制SQL同时执行语句条数
5、纯数字的输入框限制只能输入数字等,手机号、银行卡号等进行格式的校验
6、避免直接响应一些sql异常信息,sql发生异常后,自定义异常进行响应
聊一下面试经常问的SQL注入相关推荐
- sql参数化还是被注入了_面试官问你 SQL 注入攻击了吗?
目录 为什么要聊 SQL 注入攻击? 什么是 SQL 注入攻击? 如何进行 SQL 注入攻击? 如何防范? 常见面试题 瞎比比 为什么要聊 SQL 注入攻击? 我这人有个想法,就是不管自己跳不跳槽,每 ...
- pl sql入门比较好的书_面试官问你SQL?这几本书足够了
程序员书库(ID:CodingBook) 猿妹编译链接:https://www.lifewire.com/best-sql-books-4177471 结构化查询语言(Structured Query ...
- 面试必问之-SQL调优
对于MySQL层优化我一般遵从五个原则: 减少数据访问: 设置合理的字段类型,启用压缩,通过索引访问等减少磁盘IO 返回更少的数据: 只返回需要的字段和数据分页处理 减少磁盘io及网络io 减少交互次 ...
- 面试常问的sql语句
创建数据库 create database databaseName 创建表 create table tableName (列名 数据类型,...) 查询 select * from tableNa ...
- SQL注入漏洞(原理篇)
SQL注入是我安全入门学的第一个漏洞,这个漏洞怎么说呢,前期的学习单单记住那几个payload知道如何查库.查表.查列.查字段就可以做题目了.没办法,初学者零基础就是这样,从记忆开始再到逐渐理解结束, ...
- web漏洞开始,sql注入
第十一天,web漏洞必懂知识点 这个图里面,右边的漏洞比左边的漏洞相对重要,因为在实战过程中,左边所产生的漏洞就比较少,我们学习网络安全呢就要做到他们的这些原理和危害. 比如sql注入漏洞是网站数据库 ...
- mysql注入内置函数_PHP面试之mysql内置函数,xss漏洞,sql注入
面试被问到: 1. MySql有哪些常用聚合函数: count().sum().max().min().avg().group_concat() mysql还有常用的函数: (1)数值函数: Abs( ...
- java执行sql文件_面试官问你MyBatis SQL是如何执行的?把这篇文章甩给他
初识 MyBatis MyBatis 是第一个支持自定义 SQL.存储过程和高级映射的类持久框架.MyBatis 消除了大部分 JDBC 的样板代码.手动设置参数以及检索结果.MyBatis 能够支持 ...
- 【266期】面试官问:为什么 SQL 要尽量避免使用 IN 和 NOT IN?
点击上方"Java精选",选择"设为星标" 别问别人为什么,多问自己凭什么! 下方有惊喜,留言必回,有问必答! 每一天进步一点点,是成功的开始... IN 和 ...
最新文章
- 16.1、python初识面向对象(1)
- oracle analyze分区表,PostgreSQL Analyze分区表:主表与子表的统计信息问题
- jQuery:表格的奇偶行变色,jquery实例之表格隔一行
- TCP/IP 协议简单分析(建立连接握手过程)
- github上面如何编辑README
- 锐炬显卡可以linux吗,Intel Broadwell桌面CPU性能测试:Iris Pro 6200核显无敌了
- TensorFlow7-多元线性回归模型
- vue devtools 插件安装
- VSCode中使用vue项目ESlint验证配置
- 存储过程别忘了写最后一句话,别忘了类型转换
- 十大旗舰基金是怎样炼成的(主动权益)
- oracle替换字符串replace
- QTTabBar安装后不生效
- 案例:数据提取/数据获取/爬虫—工具篇—影刀
- keras中sample_weight的使用
- uva 1449 Dominating Patterns(AC自动机基本应用)
- 微信企业号 sdk java_基于Java spring框架的微信企业号开发中关于js-sdk的配置
- 中国越野汽车电子市场趋势报告、技术动态创新及市场预测
- 最长不含重复字符的子字符串(C++)
- XCP实战系列介绍16-XCP标定过程指令解析