4防止SQL注入5结束语
1、前言
不管用什么语言编写的Web应用,它们都用一个共同点,具有交互性并且多数是数据库驱动 。在网络中,数据库驱动的Web应用随处可见,由此而存在的SQL注入是影响企业运营且最具破坏性的漏洞之一,这里我想问,我们真的了解SQL注入吗?看完本篇文章希望能让你更加深刻的认识SQL注入 。
2、什么是SQL?
SQL 是一门 ANSI 的标准计算机语言,用来访问和操作数据库系统 。SQL 语句用于取回和更新数据库中的数据 。SQL 可与数据库程序协同工作,比如 MS 、DB2、、MS SQL 、、 以及其他数据库系统 。
3、什么是SQL注入?
SQL注入就是一种通过操作输入来修改后台SQL语句达到代码执行进行攻击目的的技术 。构造动态字符串是一种编程技术,它允许开发人员在运行过程中动态构造SQL语句 。开发人员可以使用动态SQL来创建通用、灵活的应用 。动态SQL语句是在执行过程中构造的,它根据不同的条件产生不同的SQL语句 。当开发人员在运行过程中需要根据不同的查询标准来决定提取什么字段(如语句),或者根据不同的条件来选择不同的查询表时,动态构造SQL语句会非常有用 。
3.1、SQL注入攻击实例
文章插图
这是一张相当有技术含量的号牌遮挡,其对交警系统SQL 的hack?例 。当摄像头拍到你车牌号并把其转成文本后,插入数据库时的SQL注入 。看到了吧,千万别惹程序员 。
文章插图
3.2、SQL注入代码展示
【SQL注入攻击入门篇】
public bool IsExist(string caName){bool flag = false;string sql = "select * from category where [name]='" + caName + "'"; //在这里产生SQL注入问题DataTable dt = sqlhelper.ExecuteQuery(sql);if (dt.Rows.Count > 0){flag = true;}return flag;}
3.3、SQL注入方法解说
1. 输入正常数据:
文章插图
合并的SQL为:
* fromwhere [name]= ‘哈哈新闻’
2. 输入注入数据:
文章插图
所选择的数据“哈哈新闻”记录不存在了 O(∩_∩)O~
合并的SQL为:
* fromwhere [name] = ‘哈哈新闻’where id=129
4、防止SQL注入
public bool IsExist(string caName){bool flag = false;string sql = "select * from category where [name]=@caName";SqlParameter[] paras = new SqlParameter[]{new SqlParameter ("@caName",caName) }; //参数化查询DataTable dt = sqlhelper.ExecuteQuery(sql);if (dt.Rows.Count > 0){flag = true;}return flag;}
参数化查询( Query)
a) 检查客户端脚本,类型检查,长度验证,使用枚举,明确的关键字过滤这些操作也是需要的 。他们能尽早检查出数据的有效性 。
b) 参数化查询原理:在使用参数化查询的情况下,数据库服务器不会将参数的内容视为SQL指令的一部份来处理,而是在数据库完成 SQL 指令的编译后,才套用参数运行,因此就算参数中含有具有损的指令,也不会被数据库所运行 。
c) 所以在实际开发中,入口处的安全检查是必要的,参数化查询应作为最后一道安全防线 。
优点:
防止SQL注入(使单引号、分号、注释符、xp_扩展函数、拼接SQL语句、EXEC、、、等SQL指令无效化),参数化查询能强制执行类型和长度检查 。
在MSSQL中生成并重用查询计划,从而提高查询效率(执行一条SQL语句,其生成查询计划将消耗大于50%的时间)
缺点:
不是所有数据库都支持参数化查询 。目前、SQL 、MySQL、、等常用数据库支持参数化查询 。
(参数化查询仅仅是SQL注入问题的解决方法之一,在这里小编就只简单介绍这一种,等待你的发现哦~~)
5、结束语
- redis笔记v-1.0
- 最强sql注入,程序员惹不起
- 一 PostgreSQL 基础-- 新手教程
- 简化SQL式计算之逆分组
- 当面试官问到:《MySQL数据库的锁机制》该如何拿分?
- Mysql主从架构搭建保姆级教程
- Python+Flask+Mysql基于python环境下智能物业管理系统296
- python+Django+Mysql图书馆系统16798
- LAMP架构介绍MySQL安装
- 1. LAMP架构介绍MySQL安装