浅入浅出SQL注入

已经开始了学习牛腩新闻发布系统,在讲后台代码的时候讲了一些重构SQLHelper的知识,存储过程和触发器等,这些以前都是接触过的。而SQL注入是以前没有注意过的,所以停下来总结学习一下SQL注入。

首先什么是SQL注入呢?

实战篇~~~~~~~~~~

SQL注入概念

所谓SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令,比如先前的很多影视网站泄露VIP会员密码大多就是通过WEB表单递交查询字符暴出的,这类表单特别容易受到SQL注入式攻击。

通俗的说就是,当在浏览器网页中输入一些可能是查询字符串的一部分时,这样就使得恶意破坏人可以指导一个网站的连接数据库的名称和里面的表,这就是由于拼接字符串引起的。在新闻发布系统中的小例子:

新闻类别类插入函数的代码

 public bool Insert(string caName)        {
            bool flag = false;
            string sql = "insert into category(name) values('" + caName + "')";};
            int res = sqlhelper.ExecuteNonQuery(sql, CommandType.Text);
            if (res > 0) //代码段,连续两次按table键显示代码段
            {
                flag = true;
            }
            return flag;
        }

如果是这样的话:在网页输入框中输入类似

——            娱乐新闻‘)delete category where id=3-- 的语句就会发生SQL注入。

这样的话,就会在插入娱乐新闻的时候同时删除id为3的那条类别。这就是SQL注入,造成了数据库的不安全,是因为正好拼接了字符串,insert
intocategory(name) values(‘娱乐新闻‘)delete
category whereid=3-

解决方法是使用参数,将sql语句该成为:

 /// <summary>        /// 增加类别
        /// </summary>
        /// <param name="caName">新闻类别名称</param>
        /// <returns></returns>
        public bool Insert(string caName)
        {
            bool flag = false;
            string sql = "insert into category(name) values(@caName)";
            SqlParameter[] paras = new SqlParameter[] {
                                                   new SqlParameter ("@caName",caName )};
            int res = sqlhelper.ExecuteNonQuery(sql, paras, CommandType.Text); //防止SQL注入
            if (res > 0) //代码段,连续两次按table键显示代码段
            {
                flag = true;
            }
            return flag;
        }

 参数化查询为什么可以防止SQL注入?

1、参数过滤,数据库中实际执行的sql语句

2、执行计划重用

因为参数化查询可以重用执行计划,并且如果重用执行计划的话,SQL所要表达的语义就不会变化,所以就可以防止SQL注入,如果不能重用执行计划,就有可能出现SQL注入,存储过程也是一样的道理,,因为可以重用执行计划。

扩展篇~~~~~~~~~~

SQL注入原因

SQL注入的产生原因通常表现在以下几方面:

1、不当的类型处理

2、不安全的数据库配置

3、不合理的查询集处理

4、不当的错误处理

5、转义字符处理不合适

6、多个提交处理不当

SQL注入攻击指的是通过构建特殊的输入作为参数传入Web程序,而这些输入大都是SQL语法里的一些组合,通过执行SQL语句进而执行攻击者所要的操作,其主要原因是程序没有细致地过滤用户输入的数据,致使非法数据侵入系统。

SQL注入的影响

当应用程序使用输入内容来构造动态sql语句以访问数据库时,会发生sql注入攻击。如果代码使用存储过程,而这些作为包含未筛选的用户输入的字符串来传递,也会发生sql注入。sql注入可能导致攻击者使用应用程序登陆在数据库中执行命令。相关的SQL注入可以通过测试工具pangolin进行。如果应用程序使用特权过高的帐户连接到数据库,这种问题会变得很严重。在某些表单中,用户输入的内容直接用来构造动态sql命令,或者作为存储过程的输入参数,这些表单特别容易受到sql注入的攻击。而许多网站程序在编写时,没有对用户输入的合法性进行判断或者程序中本身的变量处理不当,使应用程序存在安全隐患。这样,用户就可以提交一段数据库查询的代码,根据程序返回的结果,获得一些敏感的信息或者控制整个服务器,于是sql注入就发生了。

防护SQL注入

既然存在SQL注入的影响,那么怎样防止SQl注入呢?

1.永远不要信任用户的输入。对用户的输入进行校验,可以通过正则表达式,或限制长度;对单引号和

双"-"进行转换等。

2.永远不要使用动态拼装sql,可以使用参数化的sql或者直接使用存储过程进行数据查询存取。

3.永远不要使用管理员权限的数据库连接,为每个应用使用单独的权限有限的数据库连接。

4.不要把机密信息直接存放,加密或者hash掉密码和敏感的信息。

5.应用的异常信息应该给出尽可能少的提示,最好使用自定义的错误信息对原始错误信息进行包装

总结篇~~~~~~~~~~

SQL注入,一听上去是多么专业的名词啊!可以如果要是有人故意因为这点漏洞就侵入数据库就不好了。同时也有各种各样的人在探寻SQL注入的方法,他们的手法相当灵活,让我们防不胜防。而我们的防护能不能根据具体情况进行分析,构造巧妙的SQL语句,从而成功防护了想要进行SQL注入的数据库才是高手与“菜鸟”的区别。

浅入浅出SQL注入,布布扣,bubuko.com

时间: 2024-10-17 02:32:47

浅入浅出SQL注入的相关文章

包学会之浅入浅出Vue.js:升学篇

上一篇<包学会之浅入浅出Vue.js:开学篇>中,我们初步了解单页面组件这个概念,现在通过一个项目,来进一步解析组件的应用吧,Go~ 需求背景 组件库是做UI和前端日常需求中经常用到的,把一个按钮,导航,列表之类的元素封装起来,方便日常使用,调用方法只需直接写上<qui-button></qui-button>或者<qui-nav></qui-nav>这样的代码就可以,是不是很方便呢,接下来我们将要完成以下页面: 这是我们组件库的首页,包含三个子

『浅入浅出』MySQL 和 InnoDB

作为一名开发人员,在日常的工作中会难以避免地接触到数据库,无论是基于文件的 sqlite 还是工程上使用非常广泛的 MySQL.PostgreSQL,但是一直以来也没有对数据库有一个非常清晰并且成体系的认知,所以最近两个月的时间看了几本数据库相关的书籍并且阅读了 MySQL 的官方文档,希望对各位了解数据库的.不了解数据库的有所帮助. 本文中对于数据库的介绍以及研究都是在 MySQL 上进行的,如果涉及到了其他数据库的内容或者实现会在文中单独指出. 数据库的定义 很多开发者在最开始时其实都对数据

『浅入深出』MySQL 中事务的实现

在关系型数据库中,事务的重要性不言而喻,只要对数据库稍有了解的人都知道事务具有 ACID 四个基本属性,而我们不知道的可能就是数据库是如何实现这四个属性的:在这篇文章中,我们将对事务的实现进行分析,尝试理解数据库是如何实现事务的,当然我们也会在文章中简单对 MySQL 中对 ACID 的实现进行简单的介绍. 事务其实就是并发控制的基本单位:相信我们都知道,事务是一个序列操作,其中的操作要么都执行,要么都不执行,它是一个不可分割的工作单位:数据库事务的 ACID 四大特性是事务的基础,了解了 AC

重新学习MySQL数据库2:『浅入浅出』MySQL 和 InnoDB

重新学习Mysql数据库2:『浅入浅出』MySQL 和 InnoDB 作为一名开发人员,在日常的工作中会难以避免地接触到数据库,无论是基于文件的 sqlite 还是工程上使用非常广泛的 MySQL.PostgreSQL,但是一直以来也没有对数据库有一个非常清晰并且成体系的认知,所以最近两个月的时间看了几本数据库相关的书籍并且阅读了 MySQL 的官方文档,希望对各位了解数据库的.不了解数据库的有所帮助. 本文中对于数据库的介绍以及研究都是在 MySQL 上进行的,如果涉及到了其他数据库的内容或者

浅入浅出 Go 语言接口的原理

浅入浅出 Go 语言接口的原理 接口是 Go 语言的重要组成部分,它在 Go 语言中通过一组方法指定了一个对象的行为,接口 interface 的引入能够让我们在 Go 语言更好地组织并写出易于测试的代码.然而很多使用 Go 语言的工程师其实对接口的了解都非常有限,对于它的底层实现也一无所知,这其实成为了我们使用和理解 interface 的最大阻碍. 在这一节中,我们就会介绍 Go 语言中这个重要类型 interface 的一些常见问题以及它底层的实现,包括接口的基本原理.类型断言和转换的过程

浅入深出ElasticSearch构建高性能搜索架构

浅入深出ElasticSearch构建高性能搜索架构  课程学习地址:http://www.xuetuwuyou.com/course/161 课程出自学途无忧网:http://www.xuetuwuyou.com 一.课程用到的软件 ElasticSearch5.0.0 Spring Tool Suite 3.8.2.RELEASE Maven3.0.5 Spring4 Netty4 Hadoop2.7.1 Kibana5.0 JDK1.8.0_111 二.课程目标 1.快速学习Elastic

包学会之浅入浅出Vue.js:结业篇

在第一篇<包学会之浅入浅出Vue.js:开学篇>和上一篇<包学会之浅入浅出Vue.js:升学篇>的学习中,我们首先了解了Vue环境的搭建以及两个重要思想--路由和组件的学习,通过组件库中的按钮组件和导航组件,相信大家也开始了解相应的知识点,接下来我们会详细分析下如何完成由多个组件组成一个复用组件的开发流程. 下面先看看我们的需求 列表组件quiList.vue 本节我们主要要完成这样一个列表功能,每一行的列表是一个组件,列表内可能出现按钮组件或者箭头组件,点击按钮组件可以自定义事件

浅入浅出---JQuery到底是什么?

学习完了JQuery之后,我便感觉云里雾里的,JQuery到底是什么,朦朦胧胧感觉到JQuery应该是javascript函数的封装,就应该像WinForm窗体应用程序中可以调用的系统函数,据之前所学的javascript,知道JavaScript是一种镶嵌在HTML文档中的一种脚本语言, <body> <formid="form1" name="form1" method="post" > <label for=&

浅入浅出EmguCv(一)OpenCv与EmguCv

最近接触计算机视觉方面的东西,于是准备下手学习opencv,从官网下载windows的安装版,配置环境,一系列步骤走完后,准备按照惯例弄个HelloWord.也就是按照网上的教程,打开了那个图像处理领域非常有名的lena图片(据说是个裸女\(^o^)/~). 正当我摩拳擦掌准备开始opencv学习之旅的时候,习惯了GUI的我突然觉得用C++做开发弄界面很麻烦,不如用C#来的方便,于是又发现了一个封装了opencv的.net库,可以被VC++,VC#,VB.net调用,即EmguCV.网上对于Em