防止web项目中的SQL注入


Posted in MySQL onDecember 06, 2021

一、SQL注入简介

SQL注入是比较常见的网络攻击方式之一,它不是利用操作系统的BUG来实现攻击,而是针对程序员编写时的疏忽,通过SQL语句,实现无账号登录,甚至篡改数据库。

二、SQL注入攻击的总体思路

  • 1.寻找到SQL注入的位置
  • 2.判断服务器类型和后台数据库类型
  • 3.针对不同的服务器和数据库特点进行SQL注入攻击

三、SQL注入攻击实例

比如在一个登录界面,要求输入用户名和密码:

可以这样输入实现免帐号登录:

用户名: ‘or 1 = 1 –

密 码:

点登陆,如若没有做特殊处理,那么这个非法用户就很得意的登陆进去了.(当然现在的有些语言的数据库API已经处理了这些问题)

这是为什么呢? 下面我们分析一下:

从理论上说,后台认证程序中会有如下的SQL语句:

String sql = "select * from user_table where username=
' "+userName+" ' and password=' "+password+" '";

当输入了上面的用户名和密码,上面的SQL语句变成:
SELECT * FROM user_table WHERE username=
''or 1 = 1 -- and password=''

"""
分析SQL语句:
条件后面username=”or 1=1 用户名等于 ” 或1=1 那么这个条件一定会成功;

然后后面加两个-,这意味着注释,它将后面的语句注释,让他们不起作用,这样语句永远都能正确执行,用户轻易骗过系统,获取合法身份。
这还是比较温柔的,如果是执行
SELECT * FROM user_table WHERE
username='' ;DROP DATABASE (DB Name) --' and password=''
其后果可想而知…
"""

四、如何防御SQL注入

注意:但凡有SQL注入漏洞的程序,都是因为程序要接受来自客户端用户输入的变量或URL传递的参数,并且这个变量或参数是组成SQL语句的一部分,

对于用户输入的内容或传递的参数,我们应该要时刻保持警惕,这是安全领域里的「外部数据不可信任」的原则,纵观Web安全领域的各种攻击方式,

大多数都是因为开发者违反了这个原则而导致的,所以自然能想到的,就是从变量的检测、过滤、验证下手,确保变量是开发者所预想的。

1、检查变量数据类型和格式

如果你的SQL语句是类似where id={$id}这种形式,数据库里所有的id都是数字,那么就应该在SQL被执行前,检查确保变量id是int类型;如果是接受邮箱,那就应该检查并严格确保变量一定是邮箱的格式,其他的类型比如日期、时间等也是一个道理。总结起来:只要是有固定格式的变量,在SQL语句执行前,应该严格按照固定格式去检查,确保变量是我们预想的格式,这样很大程度上可以避免SQL注入攻击。

比如,我们前面接受username参数例子中,我们的产品设计应该是在用户注册的一开始,就有一个用户名的规则,比如5-20个字符,只能由大小写字母、数字以及一些安全的符号组成,不包含特殊字符。此时我们应该有一个check_username的函数来进行统一的检查。不过,仍然有很多例外情况并不能应用到这一准则,比如文章发布系统,评论系统等必须要允许用户提交任意字符串的场景,这就需要采用过滤等其他方案了。

2、过滤特殊符号

对于无法确定固定格式的变量,一定要进行特殊符号过滤或转义处理。

3、绑定变量,使用预编译语句

MySQL的mysqli驱动提供了预编译语句的支持,不同的程序语言,都分别有使用预编译语句的方法

实际上,绑定变量使用预编译语句是预防SQL注入的最佳方式,使用预编译的SQL语句语义不会发生改变,在SQL语句中,变量用问号?表示,黑客即使本事再大,也无法改变SQL语句的结构

小结:

  • 1.使用预编译绑定变量的SQL语句
  • 2.严格加密处理用户的机密信息
  • 3.不要随意开启生产环境中Webserver的错误显示
  • 4.使用正则表达式过滤传入的参数
  • 5.字符串过滤
  • 6.检查是否包函非法字符

总的来说,防范一般的SQL注入只要在代码规范上下点功夫就能预防

以上所述是小编给大家介绍的防止web项目中的SQL注入,希望对大家有所帮助。在此也非常感谢大家对三水点靠木网站的支持!

MySQL 相关文章推荐
如何使用Maxwell实时同步mysql数据
Apr 08 MySQL
MySQL中使用or、in与union all在查询命令下的效率对比
May 26 MySQL
MYSQL 无法识别中文的永久解决方法
Jun 03 MySQL
MySQL快速插入一亿测试数据
Jun 23 MySQL
MySQL Shell import_table数据导入的实现
Aug 07 MySQL
Mysql案例刨析事务隔离级别
Sep 25 MySQL
Linux7.6二进制安装Mysql8.0.27详细操作步骤
Nov 27 MySQL
MySQL分区表管理命令汇总
Mar 21 MySQL
排查MySQL生产环境索引没有效果
Apr 11 MySQL
CentOS 7安装mysql5.7使用XtraBackUp备份工具命令详解
Apr 12 MySQL
MySQL数据库之内置函数和自定义函数 function
Jun 16 MySQL
MySql统计函数COUNT的具体使用详解
Aug 14 MySQL
mysql创建存储过程及函数详解
Dec 04 #MySQL
mysql5.6主从搭建以及不同步问题详解
MySQL图形化管理工具Navicat安装步骤
全面盘点MySQL中的那些重要日志文件
关于mysql中时间日期类型和字符串类型的选择
Nov 27 #MySQL
VS2019连接MySQL数据库的过程及常见问题总结
Linux7.6二进制安装Mysql8.0.27详细操作步骤
You might like
php实现可用于mysql,mssql,pg数据库操作类
2014/12/13 PHP
Yii2增删改查之查询 where参数详细介绍
2016/08/08 PHP
Nginx+php配置文件及原理解析
2020/12/09 PHP
JQuery 返回布尔值Is()条件判断方法代码
2012/05/14 Javascript
javascript高级程序设计第二版第十二章事件要点总结(常用的跨浏览器检测方法)
2012/08/22 Javascript
js调用webservice中的方法实现思路及代码
2013/02/25 Javascript
深入理解JS中的变量及作用域、undefined与null
2014/03/04 Javascript
js图片延迟技术一般的思路与示例
2014/03/20 Javascript
jQuery Mobile弹出窗、弹出层知识汇总
2016/01/05 Javascript
小白谈谈对JS原型链的理解
2016/05/03 Javascript
Bootstrap源码解读媒体对象、列表组和面板(10)
2016/12/26 Javascript
js实现无缝滚动图
2017/02/22 Javascript
mint-ui 时间插件使用及获取选择值的方法
2018/02/09 Javascript
详解webpack打包后如何调试的方法步骤
2018/11/07 Javascript
node 解析图片二维码的内容代码实例
2019/09/11 Javascript
原生js实现密码强度验证功能
2020/03/18 Javascript
vue fetch中的.then()的正确使用方法
2020/04/17 Javascript
封装Vue Element的table表格组件的示例详解
2020/08/19 Javascript
记一次vue跨域的解决
2020/10/21 Javascript
[01:02:54]完美世界DOTA2联赛PWL S2 FTD vs GXR 第一场 11.22
2020/11/26 DOTA
Python 变量类型及命名规则介绍
2013/06/08 Python
python 列表转为字典的两个小方法(小结)
2019/06/28 Python
python enumerate内置函数用法总结
2020/01/07 Python
python+selenium定时爬取丁香园的新型冠状病毒数据并制作出类似的地图(部署到云服务器)
2020/02/09 Python
Python发送手机动态验证码代码实例
2020/02/28 Python
Keras中的两种模型:Sequential和Model用法
2020/06/27 Python
Scrapy中如何向Spider传入参数的方法实现
2020/09/28 Python
Python3中小括号()、中括号[]、花括号{}的区别详解
2020/11/15 Python
CSS3实现菜单悬停效果
2020/11/17 HTML / CSS
导出HTML5 Canvas图片并上传服务器功能
2019/08/16 HTML / CSS
美国环保婴儿用品公司:The Honest Company
2017/11/23 全球购物
战略合作协议书范本
2014/04/18 职场文书
2014-2015学年工作总结
2014/11/27 职场文书
五星级酒店前台接待岗位职责
2015/04/02 职场文书
2019各种保证书范文
2019/06/24 职场文书
Linux中Nginx的防盗链和优化的实现代码
2021/06/20 Servers