防止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 相关文章推荐
MySQL 重写查询语句的三种策略
May 10 MySQL
详解mysql三值逻辑与NULL
May 19 MySQL
MySQL 使用事件(Events)完成计划任务
May 24 MySQL
MySQL中distinct和count(*)的使用方法比较
May 26 MySQL
Mysql效率优化定位较低sql的两种方式
May 26 MySQL
mysql连接查询中and与where的区别浅析
Jul 01 MySQL
MySQL 主从复制数据不一致的解决方法
Mar 18 MySQL
pt-archiver 主键自增
Apr 26 MySQL
MySQL外键约束(Foreign Key)案例详解
Jun 28 MySQL
SQLServer常见数学函数梳理总结
Aug 05 MySQL
MySQL下载安装配置详细教程 附下载资源
Sep 23 MySQL
关于MySQL中explain工具的使用
May 08 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+memcache实现消息队列案例分享
2014/05/21 PHP
PHP错误Cannot use object of type stdClass as array in错误的解决办法
2014/06/12 PHP
PHP获取音频文件的相关信息
2015/06/22 PHP
Javascript 日期处理之时区问题
2009/10/08 Javascript
jquery弹出层类代码分享
2013/12/27 Javascript
js读取被点击次数的简单实例(从数据库中读取)
2014/03/07 Javascript
关于JS数组追加数组采用push.apply的问题
2014/06/09 Javascript
JS中的Replace方法使用经验分享
2015/05/20 Javascript
javascript给span标签赋值的方法
2015/11/26 Javascript
Easyui的组合框的取值与赋值
2016/10/28 Javascript
js实现图片360度旋转
2017/01/22 Javascript
数组Array的一些方法(总结)
2017/02/17 Javascript
基于代数方程库Algebra.js解二元一次方程功能示例
2017/06/09 Javascript
详解Angular之constructor和ngOnInit差异及适用场景
2017/06/22 Javascript
微信小程序实现图片上传、删除和预览功能的方法
2017/12/18 Javascript
详解angular部署到iis出现404解决方案
2018/08/14 Javascript
Angular Excel 导入与导出的实现代码
2019/04/17 Javascript
微信小程序使用npm包的方法步骤
2019/08/13 Javascript
原生js实现无缝轮播图效果
2021/01/28 Javascript
[02:03]DOTA2亚洲邀请赛 HGT战队出场宣传片
2015/02/07 DOTA
在python中的socket模块使用代理实例
2014/05/29 Python
用Python计算三角函数之acos()方法的使用
2015/05/15 Python
Python中exit、return、sys.exit()等使用实例和区别
2015/05/28 Python
Python中for循环控制语句用法实例
2015/06/02 Python
Python3实现将本地JSON大数据文件写入MySQL数据库的方法
2018/06/13 Python
flask框架json数据的拿取和返回操作示例
2019/11/28 Python
用什么库写 Python 命令行程序(示例代码详解)
2020/02/20 Python
python解释器pycharm安装及环境变量配置教程图文详解
2020/02/26 Python
css3 2D图片转动样式可以扩充到Js当中
2014/04/29 HTML / CSS
美国顶级奢侈茶:Mighty Leaf Tea(美泰茶)
2016/11/26 全球购物
四年的大学生生活自我评价
2013/12/09 职场文书
汽车促销活动方案
2014/03/31 职场文书
诉讼代理人授权委托书
2014/04/08 职场文书
2014年重阳节活动策划方案书
2014/09/16 职场文书
自荐信模板大全
2015/03/27 职场文书
Netty客户端接入流程NioSocketChannel创建解析
2022/03/25 Java/Android