MySQL 注入详解及其解决方法
MySQL 注入
- 今天刚刚看到MySQL注入
- 首先,先来了解一下,SQL注入到底是什么
- 解决办法
今天刚刚看到MySQL注入
首先,先来了解一下,SQL注入到底是什么
在网上可以收到很多关于SQL注入的例子,我这里想说一下最
基本的。
1:最基本的查询
xml语句
select * from user where id = #{id};
查询接口:select 请求方式:GET 请求参数:id
@RequestMapping(value = "/select/{id}",method = RequestMethod.GET)
这就是一个最普通的,根据id查询user表中的id与输入的id对应的一行数据,同样这是一个简单的接口定义,但是存在SQL注入风险。
如果在浏览器输入
http://localhost:8080/select/1
发送这个请求相当于调用一个查询语句
正常情况下,应该返回一个id=1的文章信息。
但是存在问题:
当在浏览器输入时
http://localhost:8080/select/1=1
这就是一个SQL注入攻击了,可能会返回所有文章的相关信息。为什么会这样呢?
1=1永远是true,所有整个where语句永远是ture,所以where条件相当于没有加where条件,那么查询的结果相当于整张表的内容。
解决办法
那么有哪些方法可以解决这些问题呢?
1、严格检查输入变量的类型和格式
对于整数参数,加判断条件:不能为空、参数类型必须为数字
对于以上的xml语句:我们可以这么改写:
<select >
select * from user where <if test="id != null and id != ''">id = #{id}</if>//对id进行非空校验,如果为空会报错
</select>
同样的可以对接口编写进行修改
@RequestMapping(value = "/select/{id}",
method = RequestMethod.GET)public HttpServletResponseselect(@PathVariable Integer id){//select 方法函数//参数里对 id,进行拦截,只允许int类型通过
}
对于字符串参数,可以使用正则表达式进行过滤:如:必须为[0-9a-zA-Z]范围内的字符串
2)过滤和转义特殊字符
在username这个变量前进行转义,对 '、"、\ 等特殊字符进行转义,如:
userName = StringEscapeUtils.escapeSql(userName);
3)利用mysql的预编译机制
把sql语句的模板(变量采用占位符进行占位)发送给mysql服务器,mysql服务器对sql语句的模板进行编译,编译之后根据语句的优化分析对相应的索引进行优化,在最终绑定参数时把相应的参数传送给mysql服务器,直接进行执行,节省了sql查询时间,以及mysql服务器的资源,达到一次编译、多次执行的目的,除此之外,还可以防止SQL注入。具体是怎样防止SQL注入的呢?实际上当将绑定的参数传到mysql服务器,mysql服务器对参数进行编译,即填充到相应的占位符的过程中,做了转义操作。
这个就像我上面写的
select * from user where id = #{id};
//使用#{},#可以对id进行预编译
//而不能使用${},这是直接将${}里的值,赋值给id
小白的才疏学浅的总结就到这里了,感谢各位的阅读
MySQL 注入详解及其解决方法相关推荐
- PHP开发中常见的安全问题详解和解决方法
PHP开发中常见的安全问题详解和解决方法 参考文章: (1)PHP开发中常见的安全问题详解和解决方法 (2)https://www.cnblogs.com/walblog/articles/83313 ...
- Python安装MySQL库详解(解决Microsoft Visual C++ 9.0 is required )
前面我们介绍的Python网络爬虫通常将抓取的数据存储至TXT或CSV文件,而当数据量增加之时,就需要将其存储至本地数据库了.Python访问数据库需要对应的接口程序,我们可以把接口程序理解为Pyth ...
- 使用selenium时遇到的报错selenium.common.exceptions.WebDriverException: Message: Service xxxxstaus:1详解及解决方法详解
在开始之前,分享一下使用selenium常遇到的几个问题和报错: 1.首先就是版本问题的报错:selenium.common.exceptions.NoSuchWindowException: Mes ...
- MySQL幻读详解及解决方法
1. 什么是幻读? 建立一张表如下: 按照下面步骤执行两个事务. 事务1: 事务2: 由此,可以把幻读理解为:select 某记录是否存在,不存在,准备插入此记录,但执行 insert 时发现此记录已 ...
- python引用numpy出错_引用numpy出错详解及解决方法
numpy出错 解决方案 Problem: how to import numpy in subdirectory? Import error of numpy within subfolder. 错 ...
- csrf漏洞防御方案_CSRF 漏洞原理详解及防御方法
跨站请求伪造:攻击者可以劫持其他用户进行的一些请求,利用用户身份进行恶意操作. 例如:请求http://x.com/del.php?id=1是一个删除ID为1的账号,但是只有管理员才可以操作,如果攻击 ...
- mysql sleep详解_sql注入详解(二)
sql注入详解 4.检测方法 首先是判断能不能进行sql注入 是哪种sql注入 (1)数字型 ?id=1 and 1=1 返回成功?id=1 and 1=2 返回失败 这说明是数字型注入,或者叫整型注 ...
- 网络安全学习--008--SQL注入之Access数据库注入详解
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 Access注入漏洞详解 一:注入漏洞分析 站库分类: 1.网站分类: 静态网页: 不依赖数据库 灵活性差,制作.更新.维护麻烦 交互 ...
- pandas读写MySQL数据库详解及实战
pandas读写MySQL数据库详解及实战 SQLAlchemy是Python中最有名的ORM工具. 关于ORM: 全称Object Relational Mapping(对象关系映射). 特点是操纵 ...
最新文章
- Erlang列表操作里面的变量绑定规则
- php7 安装zendopcache,安装PHP加速插件ZendOpcache
- 人活系列Streetlights (秩)
- Cisco Adsl 详细配置
- mysql加锁6_MySQL优化(6):Mysql锁机制
- Linux权限管理的认知
- 分享一个凭实力赚钱例子,值得借鉴学习
- tf.nn.embedding_lookup,tf.variable系列变量
- 「收藏」其实是欺骗自己
- 用C语言统计给定文本文件中汉字的个数
- 我奋斗了18年不是为了和你一起喝咖啡。
- ubuntu php开发工具
- PAT-A1008(C/C++代码解析)
- paperswithcode 论文阅读与代码复现
- jy-12-SPRINGMYBATIS02——云笔记09-刘苍松
- python sys stdout_Python-如何将sys.stdout复制到日志文件?
- 别被“僵尸”吃掉大脑!学会用Kubernetes (K8s)思考
- 022 PHP获取从周一到周日的时间戳
- 局域网网上邻居无法访问问题的解决
- 经典语录:也许一个人在真正无可奈何的时候除了微笑也只好微笑了