sql注入 订阅
SQL注入即是指web应用程序对用户输入数据的合法性没有判断或过滤不严,攻击者可以在web应用程序中事先定义好的查询语句的结尾上添加额外的SQL语句,在管理员不知情的情况下实现非法操作,以此来实现欺骗数据库服务器执行非授权的任意查询,从而进一步得到相应的数据信息。 [1] 展开全文
SQL注入即是指web应用程序对用户输入数据的合法性没有判断或过滤不严,攻击者可以在web应用程序中事先定义好的查询语句的结尾上添加额外的SQL语句,在管理员不知情的情况下实现非法操作,以此来实现欺骗数据库服务器执行非授权的任意查询,从而进一步得到相应的数据信息。 [1]
信息
外文名
SqlInject
类    型
参数
类    别
平台层注入、代码层注入
中文名
sql注入
语    言
计算机语言
sql注入定义
SQL是操作数据库数据的结构化查询语言,网页的应用数据和后台数据库中的数据进行交互时会采用SQL。而SQL注入是将Web页面的原URL、表单域或数据包输入的参数,修改拼接成SQL语句,传递给Web服务器,进而传给数据库服务器以执行数据库命令。如Web应用程序的开发人员对用户所输入的数据或cookie等内容不进行过滤或验证(即存在注入点)就直接传输给数据库,就可能导致拼接的SQL被执行,获取对数据库的信息以及提权,发生SQL注入攻击。 [2] 
收起全文
精华内容
参与话题
问答
  • SQL注入攻击常见方式及测试方法

    万次阅读 多人点赞 2017-11-04 11:09:43
    本文主要针对SQL注入的含义、以及如何进行SQL注入和如何预防SQL注入让小伙伴有个了解。适用的人群主要是测试人员,了解如何进行SQL注入,可以帮助我们测试登录、发布等模块的SQL攻击漏洞,至于如何预防SQL注入,按理...

    本文主要针对SQL注入的含义、以及如何进行SQL注入和如何预防SQL注入让小伙伴有个了解。适用的人群主要是测试人员,了解如何进行SQL注入,可以帮助我们测试登录、发布等模块的SQL攻击漏洞,至于如何预防SQL注入,按理说应该是开发该了解的事情~但是作为一个棒棒的测试,搞清楚原理是不是能让我们更加透彻地理解bug的产生原因呢~好啦,话不多说,进入正题~

    如何理解SQL注入(攻击)?

    SQL注入是一种将SQL代码添加到输入参数中,传递到服务器解析并执行的一种攻击手法。

    SQL注入攻击是输入参数未经过滤,然后直接拼接到SQL语句当中解析,执行达到预想之外的一种行为,称之为SQL注入攻击。


    SQL注入是怎么产生的?

    1)WEB开发人员无法保证所有的输入都已经过滤

    2)攻击者利用发送给SQL服务器的输入参数构造可执行的SQL代码(可加入到get请求、post请求、http头信息、cookie中)

    3)数据库未做相应的安全配置


    如何进行SQL注入攻击?

    以php编程语言、mysql数据库为例,介绍一下SQL注入攻击的构造技巧、构造方法

    1.数字注入

    在浏览器地址栏输入:learn.me/sql/article.php?id=1,这是一个get型接口,发送这个请求相当于调用一个查询语句:

    $sql = "SELECT * FROM article WHERE id =",$id

    正常情况下,应该返回一个id=1的文章信息。那么,如果在浏览器地址栏输入:learn.me/sql/article.php?id=-1 OR 1 =1,这就是一个SQL注入攻击了,可能会返回所有文章的相关信息。为什么会这样呢?

    这是因为,id = -1永远是false,1=1永远是true,所有整个where语句永远是ture,所以where条件相当于没有加where条件,那么查询的结果相当于整张表的内容

    2.字符串注入

    有这样一个用户登录场景:登录界面包括用户名和密码输入框,以及提交按钮。输入用户名和密码,提交。

    这是一个post请求,登录时调用接口learn.me/sql/login.html,首先连接数据库,然后后台对post请求参数中携带的用户名、密码进行参数校验,即sql的查询过程。假设正确的用户名和密码为user和pwd123,输入正确的用户名和密码、提交,相当于调用了以下的SQL语句:

    SELECT * FROM user WHERE username = 'user' ADN password = 'pwd123'

    由于用户名和密码都是字符串,SQL注入方法即把参数携带的数据变成mysql中注释的字符串。mysql中有2种注释的方法:

    1)'#':'#'后所有的字符串都会被当成注释来处理

    用户名输入:user'#(单引号闭合user左边的单引号),密码随意输入,如:111,然后点击提交按钮。等价于SQL语句:

    SELECT * FROM user WHERE username = 'user'#'ADN password = '111'

    '#'后面都被注释掉了,相当于:

    SELECT * FROM user WHERE username = 'user' 

    2)'-- ' (--后面有个空格):'-- '后面的字符串都会被当成注释来处理

    用户名输入:user'-- (注意--后面有个空格,单引号闭合user左边的单引号),密码随意输入,如:111,然后点击提交按钮。等价于SQL语句:

    SELECT * FROM user WHERE username = 'user'-- 'AND password = '111'
    SELECT * FROM user WHERE username = 'user'-- 'AND password = '1111'

    '-- '后面都被注释掉了,相当于:

    SELECT * FROM user WHERE username = 'user'

    因此,以上两种情况可能输入一个错误的密码或者不输入密码就可登录用户名为'user'的账号,这是十分危险的事情。


    如何预防SQL注入?

    这是开发人员应该思考的问题,作为测试人员,了解如何预防SQL注入,可以在发现注入攻击bug时,对bug产生原因进行定位。

    1)严格检查输入变量的类型和格式

    对于整数参数,加判断条件:不能为空、参数类型必须为数字

    对于字符串参数,可以使用正则表达式进行过滤:如:必须为[0-9a-zA-Z]范围内的字符串

    2)过滤和转义特殊字符

    在username这个变量前进行转义,对'、"、\等特殊字符进行转义,如:php中的addslashes()函数对username参数进行转义

    3)利用mysql的预编译机制

    把sql语句的模板(变量采用占位符进行占位)发送给mysql服务器,mysql服务器对sql语句的模板进行编译,编译之后根据语句的优化分析对相应的索引进行优化,在最终绑定参数时把相应的参数传送给mysql服务器,直接进行执行,节省了sql查询时间,以及mysql服务器的资源,达到一次编译、多次执行的目的,除此之外,还可以防止SQL注入。具体是怎样防止SQL注入的呢?实际上当将绑定的参数传到mysql服务器,mysql服务器对参数进行编译,即填充到相应的占位符的过程中,做了转义操作。



    展开全文
  • sql注入原理简介

    2018-08-26 11:38:35
    一、什么是sql注入? 二、sql注入产生原因 三、sql注入原理 四、sql注入共计的简单示例
  • sql注入系列课程

    千人学习 2018-10-14 23:19:03
    本课程是sql注入系列课程,从最基础的sql注入语法讲起,里面包含常见数据库sql注入方法,及各种类型的sql注入,通过sql注入直接获取服务器权限等攻击方法及演示。
  • 什么是SQL注入

    千次阅读 2019-05-02 19:16:46
    有人的地方就有江湖,有数据库存在的地方就可能存在 SQL 注入漏洞。 什么是SQL 注入SQL 注入是一种非常常见的数据库攻击手段,SQL 注入漏洞也是网络世界中最普遍的漏洞 之一。大家也许都听过某某学长通过攻击...

    有人的地方就有江湖,有数据库存在的地方就可能存在 SQL 注入漏洞。

    什么是SQL 注入?

    SQL 注入是一种非常常见的数据库攻击手段,SQL 注入漏洞也是网络世界中最普遍的漏洞 之一。大家也许都听过某某学长通过攻击学校数据库修改自己成绩的事情,这些学长们一 般用的就是 SQL 注入方法。

    SQL 注入其实就是恶意用户通过在表单中填写包含 SQL 关键字的数据来使数据库执行非常 规代码的过程。简单来说,就是数据「越俎代庖」(yuè zǔ dài páo)做了代码才能干的 事情。这个问题的来源是,SQL 数据库的操作是通过 SQL 语句来执行的,而无论是执行代 码还是数据项都必须写在 SQL 语句之中,这就导致如果我们在数据项中加入了某些 SQL 语 句关键字(比如说 SELECT、DROP 等等),这些关键字就很可能在数据库写入或读取数据 时得到执行。

    SQL 注入实例

    接下来我们用代码,来实现 SQL 注入,来看一下,如何实现 SQL 注入攻击,以及 SQL 注入 的实质。

    接下来展示一个正常的查询操作:

    //studentDao.js
    const mySql = require('mysql');
    // 创建数据库连接对象
    const connection = mySql.createConnection({
        host: "127.0.0.1",
        port: "3306",
        user: "root",
        password: "Welcome2duyi",
        database: "school"
    });
    connection.on('error', err => console.log(err));
    // 创建 sql 语句
    let name = "'熊大'"
    let sql = "select * from student where name = "
    // 数据库连接
    connection.connect();
    // 进行查询操作
    connection.query(sql+name, function (err, result) {
        if(err) {
            throw err
        } else {
            console.log(result)
        }
    })
    // 数据库断开连接
    connection.end();

    我们通过执行 node studentDao.js 可以得到结果:

    数据库内容:

    这是正经的数据库操作,但是当我们的 name 是来自用户输入,那他的情况就会很多。

    比如下面的操作(向数据库中插入一条数据):

    //studentDao.js
    // ...
    // 创建 sql 语句
    let name = "'Robert');drop table student;"
    let sql = "insert into student (name) values("
    // 数据库连接
    connection.connect();
    // 进行查询操作
    connection.query(sql+name, function (err, result) {
        if(err) {
            throw err
        } else {
            console.log(result)
        }
    })
    // 数据库断开连接
    connection.end();

    由于 Node 中的 mysql 做了处理,所以可以避免这样的注入问题,给我们报了一个错误:

    throw err; // Rethrow non-MySQL errors
    ^
    Error: ER_PARSE_ERROR: You have an error in your SQL syntax; check the manual
    that corresponds to your MySQL server version for the
    right syntax to use near 'drop table student' at line 1

    drop student 中存在 关键字,存在危险操作。

    如果正常执行,会怎么样?

    程序没有输错任何数据内容,报了一条错误,表单 student 无法找到。

    这是为什么呢?问题就在于我们所插入的数据项中包含 SQL 关键字 drop table,这两个 关键字的意义是从数据库中清除一个表单。而关键字之前的 Robert');使得 SQL 执行器认 为上一命令已经结束,从而使得危险指令 drop table 得到执行。也就是说,这段包含 drop table 关键字的数据项使得原有的简单的插入姓名信息的 SQL 语句

    "insert into students (name) values ('Robert')"

    变为了同时包含另外一条清除表单命令的语句

    "insert into students (name) values ('Robert');DROP TABLE students;--"

    而 SQL 数据库执行上述操作后,students 表单被清除,因而表单无法找到,所有数据项 丢失。 通过下面的动漫图示,来再次说明 SQL 注入。

    如何防止 SQL 注入

    大家也许都想到了,注入问题都是因为执行了数据项中的 SQL 关键字,那么,只要检查数 据项中是否存在 SQL 关键字不就可以了么?

    的确是这样,很多数据库管理系统都是采取了 这种看似方便快捷的过滤手法,但是这并不是一种根本上的解决办法,如果有个美国人 真的就叫做『Drop Table』呢?你总不能逼人家改名字吧。对于这种情况都每种数据库会 有不同的解决办法,例如 Node mySql 可以以字符串的形式提交就可以了,like this :

    insert into student (name) values('drop table')

    合理的防护办法有很多。

    数据校验

    首先,尽量避免使用常见的数据库名和数据库结构。在上面的案例中,如果表单名字并 不是 students,则注入代码将会在执行过程中报错,也就不会发生数据丢失的情况—— SQL 注入并不像大家想象得那么简单,它需要攻击者本身对于数据库的结构有足够的了解 才能成功,因而在构建数据库时尽量使用较为复杂的结构和命名方式将会极大地减少被成 功攻击的概率。

    其次,使用正则表达式等字符串过滤手段限制数据项的格式、字符数目等也是一种很好 的防护措施。理论上,只要避免数据项中存在引号、分号等特殊字符就能很大程度上避 免 SQL 注入的发生。

    另外,就是使用各类程序文档所推荐的数据库操作方式来执行数据项的查询与写入操 作,比如在上述的案例中,如果我们稍加修改,首先使用 execute()方法来保证每次执行 仅能执行一条语句,然后将数据项以参数的方式与 SQL 执行语句分离开来,就可以完全避 免 SQL 注入的问题。或者进行数据转义也是可以避免 SQL 注入。

    权限限制

    严格限制 Web 应用的数据库的操作权限,给此用户提供仅仅能够满足其工作的最低权限, 从而最大限度的减少注入攻击对数据库的危害。**请记住永远不要使用超级用户或所有者 帐号去连接数据库!**当数据库被攻击时将损伤限制在当前表的范围是比较明智的选择。 通过权限限制可以防止攻击者获取数据库其它信息,甚至利用数据库执行 Shell 命令等 操作。

    日志处理

    当数据库操作失败的时候,尽量不要将原始错误日志返回,比如类型错误、字段不匹配 等,把代码里的 SQL 语句暴露出来,以防止攻击者利用这些错误信息进行 SQL 注入。除 此之外,在允许的情况下,使用代码或数据库系统保存查询日志也是一个好办法。显 然,日志并不能防止任何攻击,但定期审计数据库执行日志可以跟踪是否存在应用程序正 常逻辑之外的 SQL 语句执行。日志本身没用,要查阅其中包含的信息才行。毕竟,更多 的信息总比没有要好。

    最后

    当然,做好数据库的备份,同时对敏感内容进行加密永远是最重要的。某些安全性问题可 能永远不会有完美的解决方案,只有我们做好最基本的防护措施,才能在发生问题的时候 亡羊补牢,保证最小程度的损失。

    展开全文
  • SQL注入原理讲解,很不错!

    万次阅读 多人点赞 2013-01-21 21:48:12
    原文地址:http://www.cnblogs.com/rush/archive/2011/12/31/2309203.html 1.1.1 摘要 日前,国内最大的程序员社区CSDN网站的用户数据库被黑客公开发布,600万用户的登录名及... 网络安全成为了现在互联网的焦点,

    原文地址:http://www.cnblogs.com/rush/archive/2011/12/31/2309203.html

    1.1.1 摘要

    日前,国内最大的程序员社区CSDN网站的用户数据库被黑客公开发布,600万用户的登录名及密码被公开泄露,随后又有多家网站的用户密码被流传于网络,连日来引发众多网民对自己账号、密码等互联网信息被盗取的普遍担忧。

    网络安全成为了现在互联网的焦点,这也恰恰触动了每一位用户的神经,由于设计的漏洞导致了不可收拾的恶果,验证了一句话“出来混的,迟早是要还的”,所以我想通过专题博文介绍一些常用的攻击技术和防范策略。

    SQL Injection也许很多人都知道或者使用过,如果没有了解或完全没有听过也没有关系,因为接下来我们将介绍SQL Injection。

    1.1.2 正文

    SQL Injection:就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。

    具体来说,它是利用现有应用程序,将(恶意)的SQL命令注入到后台数据库引擎执行的能力,它可以通过在Web表单中输入(恶意)SQL语句得到一个存在安全漏洞的网站上的数据库,而不是按照设计者意图去执行SQL语句。

    首先让我们了解什么时候可能发生SQL Injection。

    假设我们在浏览器中输入URL www.sample.com,由于它只是对页面的简单请求无需对数据库动进行动态请求,所以它不存在SQL Injection,当我们输入www.sample.com?testid=23时,我们在URL中传递变量testid,并且提供值为23,由于它是对数据库进行动态查询的请求(其中?testid=23表示数据库查询变量),所以我们可以该URL中嵌入恶意SQL语句。

    现在我们知道SQL Injection适用场合,接下来我们将通过具体的例子来说明SQL Injection的应用,这里我们以pubs数据库作为例子。

    我们通过Web页面查询job表中的招聘信息,job表的设计如下:

    sqlinjection5

    图1 jobs表

    接着让我们实现Web程序,它根据工作Id(job_id)来查询相应的招聘信息,示意代码如下:

    /// <summary>
    /// Handles the Load event of the Page control.
    /// </summary>
    /// <param name="sender">The source of the event.</param>
    /// <param name="e">The <see cref="System.EventArgs"/> instance containing the event data.</param>
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            // Gets departmentId from http request.
            string queryString = Request.QueryString["departmentID"];
            if (!string.IsNullOrEmpty(queryString))
            {
                // Gets data from database.
                gdvData.DataSource = GetData(queryString.Trim());
    
                // Binds data to gridview.
                gdvData.DataBind();
            }
        }
    }

    现在我们已经完成了Web程序,接下来让我们查询相应招聘信息吧。

    sqlinjection6

    图2 job表查询结果

    如图所示,我们要查询数据库中工作Id值为1的工作信息,而且在页面显示了该工作的Id,Description,Min Lvl和Max Lvl等信息。

    现在要求我们实现根据工作Id查询相应工作信息的功能,想必大家很快可以给出解决方案,SQL示意代码如下:

    SELECT     job_id, job_desc, min_lvl, max_lvl
    FROM         jobs
    WHERE     (job_id = 1)

    假设现在要求我们获取Department表中的所有数据,而且必须保留WHERE语句,那我们只要确保WHERE恒真就OK了,SQL示意代码如下:

    SELECT     job_id, job_desc, min_lvl, max_lvl
    FROM         jobs
    WHERE     (job_id = 1) OR 1 = 1
    

    上面我们使得WHERE恒真,所以该查询中WHERE已经不起作用了,其查询结果等同于以下SQL语句。

    SELECT     job_id, job_desc, min_lvl, max_lvl
    FROM         jobs
    

    SQL查询代码实现如下:

    string sql1 = string.Format(
        "SELECT job_id, job_desc, min_lvl, max_lvl FROM jobs WHERE job_id='{0}'", jobId);

    现在我们要通过页面请求的方式,让数据库执行我们的SQL语句,我们要在URL中嵌入恶意表达式1=1(或2=2等等),如下URL所示:

    OR '1' = 1'

    sqlinjection7

    图3 job表查询结果

    现在我们把job表中的所有数据都查询出来了,仅仅通过一个简单的恒真表达式就可以进行了一次简单的攻击。

    虽然我们把job表的数据都查询出来了,但数据并没有太大的价值,由于我们把该表临时命名为job表,所以接着我们要找出该表真正表名。

    首先我们假设表名就是job,然后输入以下URL:

    http://localhost:3452/ExcelUsingXSLT/Default.aspx?jobid=1'or 1=(select count(*) from job)--

    等效SQL语句如下:

    SELECT       job_id, job_desc, min_lvl, max_lvl 
    FROM         jobs 
    WHERE      job_id='1'or 1=(select count(*) from job) --'

    sqlinjection8

    图4 job表查询结果

    当我们输入了以上URL后,结果服务器返回我们错误信息,这证明了我们的假设是错误的,那我们该感觉到挫败吗?不,其实这里返回了很多信息,首先它证明了该表名不是job,而且它还告诉我们后台数据库是SQL Server,不是MySQL或Oracle,这也设计一个漏洞把错误信息直接返回给了用户。

    接下假定表名是jobs,然后输入以下URL:

    http://localhost:3452/ExcelUsingXSLT/Default.aspx?jobid=1'or1=(select count(*) from jobs) --

    等效SQL语句如下:

    SELECT       job_id, job_desc, min_lvl, max_lvl 
    FROM         jobs 
    WHERE      job_id='1'or 1=(select count(*) from jobs) --'

    sqlinjection

    图5 job表查询结果

    现在证明了该表名是jobs,这可以迈向成功的一大步,由于我们知道了表名就可以对该表进行增删改操作了,而且我们还可以猜测出更多的表对它们作出修改,一旦修改成功那么这将是一场灾难。

    现在大家已经对SQL Injection的攻击有了初步的了解了,接下让我们学习如何防止SQL Injection。

    总的来说有以下几点:

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

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

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

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

    5.应用的异常信息应该给出尽可能少的提示,最好使用自定义的错误信息对原始错误信息进行包装,把异常信息存放在独立的表中。

    通过正则表达校验用户输入

    首先我们可以通过正则表达式校验用户输入数据中是包含:对单引号和双"-"进行转换等字符。

    然后继续校验输入数据中是否包含SQL语句的保留字,如:WHERE,EXEC,DROP等。

    现在让我们编写正则表达式来校验用户的输入吧,正则表达式定义如下:

    private static readonly Regex RegSystemThreats =
            new Regex(@"\s?or\s*|\s?;\s?|\s?drop\s|\s?grant\s|^'|\s?--|\s?union\s|\s?delete\s|\s?truncate\s|" +
                @"\s?sysobjects\s?|\s?xp_.*?|\s?syslogins\s?|\s?sysremote\s?|\s?sysusers\s?|\s?sysxlogins\s?|\s?sysdatabases\s?|\s?aspnet_.*?|\s?exec\s?",
                RegexOptions.Compiled | RegexOptions.IgnoreCase);

    上面我们定义了一个正则表达式对象RegSystemThreats,并且给它传递了校验用户输入的正则表达式。

    由于我们已经完成了对用户输入校验的正则表达式了,接下来就是通过该正则表达式来校验用户输入是否合法了,由于.NET已经帮我们实现了判断字符串是否匹配正则表达式的方法——IsMatch(),所以我们这里只需给传递要匹配的字符串就OK了。

    示意代码如下:

    /// <summary>
    /// A helper method to attempt to discover [known] SqlInjection attacks.  
    /// </summary>
    /// <param name="whereClause">string of the whereClause to check</param>
    /// <returns>true if found, false if not found </returns>
    public static bool DetectSqlInjection(string whereClause)
    {
        return RegSystemThreats.IsMatch(whereClause);
    }
    
    /// <summary>
    /// A helper method to attempt to discover [known] SqlInjection attacks.  
    /// </summary>
    /// <param name="whereClause">string of the whereClause to check</param>
    /// <param name="orderBy">string of the orderBy clause to check</param>
    /// <returns>true if found, false if not found </returns>
    public static bool DetectSqlInjection(string whereClause, string orderBy)
    {
        return RegSystemThreats.IsMatch(whereClause) || RegSystemThreats.IsMatch(orderBy);
    }

    现在我们完成了校验用的正则表达式,接下来让我们需要在页面中添加校验功能。

    /// <summary>
    /// Handles the Load event of the Page control.
    /// </summary>
    /// <param name="sender">The source of the event.</param>
    /// <param name="e">The <see cref="System.EventArgs"/> instance containing the event data.</param>
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            // Gets departmentId from http request.
            string queryString = Request.QueryString["jobId"];
            if (!string.IsNullOrEmpty(queryString))
            {
                if (!DetectSqlInjection(queryString) && !DetectSqlInjection(queryString, queryString))
                {
                    // Gets data from database.
                    gdvData.DataSource = GetData(queryString.Trim());
    
                    // Binds data to gridview.
                    gdvData.DataBind();
                }
                else
                {
                    throw new Exception("Please enter correct field");
                }
            }
        }
    }

    当我们再次执行以下URL时,被嵌入的恶意语句被校验出来了,从而在一定程度上防止了SQL Injection。

  • 利用SQL注入漏洞登录后台

    万次阅读 2018-09-28 16:40:28
    所谓SQL注入,就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令,比如先前的很多影视网站泄露VIP会员密码大多就是通过WEB表单递交查询字符暴出的,这类...

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

    sql注入

    什么时候最易受到sql注入攻击

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

    如何防止SQL注入

      归纳一下,主要有以下几点:

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

      双"-"进行转换等。

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

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

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

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

      6.sql注入的检测方法一般采取辅助软件或网站平台来检测,软件一般采用sql注入检测工具jsky,网站平台就有亿思网站安全平台检测工具。

      例子一、SQL注入实例详解(以上测试均假设服务器未开启magic_quote_gpc)

      1) 前期准备工作

      先来演示通过SQL注入漏洞,登入后台管理员界面

      首先,创建一张试验用的数据表:

      CREATE TABLE `users` (

      `id` int(11) NOT NULL AUTO_INCREMENT,

      `username` varchar(64) NOT NULL,

      `password` varchar(64) NOT NULL,

      `email` varchar(64) NOT NULL,

      PRIMARY KEY (`id`),

      UNIQUE KEY `username` (`username`)

      ) ENGINE=MyISAM AUTO_INCREMENT=3 DEFAULT CHARSET=latin1;

      添加一条记录用于测试:

      INSERT INTO users (username,password,email)

      VALUES('MarcoFly',md5('test'),'marcofly@test.com');

      接下来,贴上登录界面的源代码:

    <html>
    <head>
    <title>Sql注入演示</title>
    <meta http-equiv="content-type" content="text/html;charset=utf-8">
    </head>

    <body >
    <form action="validate.php" method="post">
      <fieldset >
        <legend>Sql注入演示</legend>
        <table>
          <tr>
            <td>用户名:</td>
            <td><input type="text" name="username"></td>
          </tr>
          <tr>
            <td>密&nbsp;&nbsp;码:</td>
            <td><input type="text" name="password"></td>
          </tr>
          <tr>
            <td><input type="submit" value="提交"></td>
            <td><input type="reset" value="重置"></td>
          </tr>
        </table>
      </fieldset>
    </form>
    </body>
    </html>

      附上效果图:

    \

      当用户点击提交按钮的时候,将会把表单数据提交给validate.php页面,validate.php页面用来判断用户输入的用户名和密码有没有都符合要求(这一步至关重要,也往往是SQL漏洞所在)

      代码如下:

    <html>
    <head>
    <title>登录验证</title>
    <meta http-equiv="content-type" content="text/html;charset=utf-8">
    </head>

    <body>
    <?php

           $conn=@mysql_connect("localhost",'root','') or die("数据库连接失败!");;

           mysql_select_db("injection",$conn) or die("您要选择的数据库不存在");

           $name=$_POST['username'];

           $pwd=$_POST['password'];

           $sql="select * from users where username='$name' and password='$pwd'";

           $query=mysql_query($sql);

           $arr=mysql_fetch_array($query);

           if(is_array($arr)){

                  header("Location:manager.php");

           }else{

                  echo "您的用户名或密码输入有误,<a href=\"Login.php\">请重新登录!</a>";

           }

    ?>
    </body>
    </html>

      注意到了没有,我们直接将用户提交过来的数据(用户名和密码)直接拿去执行,并没有实现进行特殊字符过滤,待会你们将明白,这是致命的。

      代码分析:如果,用户名和密码都匹配成功的话,将跳转到管理员操作界面(manager.php),不成功,则给出友好提示信息。

      登录成功的界面:

    \

      登录失败的提示:

    \

      到这里,前期工作已经做好了,接下来将展开我们的重头戏:SQL注入

      2) 构造SQL语句

      填好正确的用户名(marcofly)和密码(test)后,点击提交,将会返回给我们“欢迎管理员”的界面。

      select * from users where username='marcofly' and password=md5('test')

      很明显,用户名和密码都和我们之前给出的一样,肯定能够成功登陆。但是,如果我们输入一个错误的用户名或密码呢?很明显,肯定登入不了吧。恩,正常情况下是如此,但是对于有SQL注入漏洞的网站来说,只要构造个特殊的“字符串”,照样能够成功登录。

      比如:在用户名输入框中输入:’ or 1=1#,密码随便输入,这时候的合成后的SQL查询语句为:

      select * from users where username='' or 1=1#' and password=md5('')

      语义分析:“#”在mysql中是注释符,这样井号后面的内容将被mysql视为注释内容,这样就不会去执行了,换句话说,以下的两句sql语句等价:

      select * from users where username='' or 1=1#' and password=md5('')

      等价于

      select * from users where username='' or 1=1

    SQL注入采用的' OR 1=1 # 是什么意思呢?

    最后一个#号有什么意义呢?
    SELECT * FROM test WHERE name='' OR 1=1 #' AND age='20' 
    这后面写的 #' 是什么意思呢? 求指教
    # 可以注释掉后面的一行SQL代码

    相当于去掉了一个where条件

    MySQL 注释, 过滤掉后面的SQL语句,使其不起作用

    因为1=1永远是都是成立的,即where子句总是为真,将该sql进一步简化之后,等价于如下select语句:

    select * from users 没错,该sql语句的作用是检索users表中的所有字段

    小技巧:一个经构造后的sql语句竟有如此可怕的破坏力,相信你看到这后,开始对sql注入有了一个理性的认识了吧~

    有漏洞的脚本才有机会给你攻击,比如一个带参数的删除脚本a.asp?action=del&id=2你可以改为a.asp?action=del&id=2 or 1这样就有可能删除全部数据------sql注入就是通过类似的手段来破坏数据

    尝试:在我的毕业设计首页搜索中输入【123' or 1=(select count(1) from tb_users)--】会查询不出人和数据  并且不会报错   通过这样可以判断是否存在表tb_users

    原文地址:http://www.cnblogs.com/rush/archive/2011/12/31/2309203.html

    1.1.1 摘要

    日前,国内最大的程序员社区CSDN网站的用户数据库被黑客公开发布,600万用户的登录名及密码被公开泄露,随后又有多家网站的用户密码被流传于网络,连日来引发众多网民对自己账号、密码等互联网信息被盗取的普遍担忧。

    网络安全成为了现在互联网的焦点,这也恰恰触动了每一位用户的神经,由于设计的漏洞导致了不可收拾的恶果,验证了一句话“出来混的,迟早是要还的”,所以我想通过专题博文介绍一些常用的攻击技术和防范策略。

    SQL Injection也许很多人都知道或者使用过,如果没有了解或完全没有听过也没有关系,因为接下来我们将介绍SQL Injection。

    1.1.2 正文

    SQL Injection:就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。

    具体来说,它是利用现有应用程序,将(恶意)的SQL命令注入到后台数据库引擎执行的能力,它可以通过在Web表单中输入(恶意)SQL语句得到一个存在安全漏洞的网站上的数据库,而不是按照设计者意图去执行SQL语句。

    首先让我们了解什么时候可能发生SQL Injection。

    假设我们在浏览器中输入URL www.sample.com,由于它只是对页面的简单请求无需对数据库动进行动态请求,所以它不存在SQL Injection,当我们输入www.sample.com?testid=23时,我们在URL中传递变量testid,并且提供值为23,由于它是对数据库进行动态查询的请求(其中?testid=23表示数据库查询变量),所以我们可以该URL中嵌入恶意SQL语句。

    现在我们知道SQL Injection适用场合,接下来我们将通过具体的例子来说明SQL Injection的应用,这里我们以pubs数据库作为例子。

    我们通过Web页面查询job表中的招聘信息,job表的设计如下:

    sqlinjection5

    图1 jobs表

    接着让我们实现Web程序,它根据工作Id(job_id)来查询相应的招聘信息,示意代码如下:

    /// <summary>
    /// Handles the Load event of the Page control.
    /// </summary>
    /// <param name="sender">The source of the event.</param>
    /// <param name="e">The <see cref="System.EventArgs"/> instance containing the event data.</param>
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            // Gets departmentId from http request.
            string queryString = Request.QueryString["departmentID"];
            if (!string.IsNullOrEmpty(queryString))
            {
                // Gets data from database.
                gdvData.DataSource = GetData(queryString.Trim());
    
                // Binds data to gridview.
                gdvData.DataBind();
            }
        }
    }

    现在我们已经完成了Web程序,接下来让我们查询相应招聘信息吧。

    sqlinjection6

    图2 job表查询结果

    如图所示,我们要查询数据库中工作Id值为1的工作信息,而且在页面显示了该工作的Id,Description,Min Lvl和Max Lvl等信息。

    现在要求我们实现根据工作Id查询相应工作信息的功能,想必大家很快可以给出解决方案,SQL示意代码如下:

    SELECT     job_id, job_desc, min_lvl, max_lvl
    FROM         jobs
    WHERE     (job_id = 1)

    假设现在要求我们获取Department表中的所有数据,而且必须保留WHERE语句,那我们只要确保WHERE恒真就OK了,SQL示意代码如下:

    SELECT     job_id, job_desc, min_lvl, max_lvl
    FROM         jobs
    WHERE     (job_id = 1) OR 1 = 1
    

    上面我们使得WHERE恒真,所以该查询中WHERE已经不起作用了,其查询结果等同于以下SQL语句。

    SELECT     job_id, job_desc, min_lvl, max_lvl
    FROM         jobs
    

    SQL查询代码实现如下:

    string sql1 = string.Format(
        "SELECT job_id, job_desc, min_lvl, max_lvl FROM jobs WHERE job_id='{0}'", jobId);

    现在我们要通过页面请求的方式,让数据库执行我们的SQL语句,我们要在URL中嵌入恶意表达式1=1(或2=2等等),如下URL所示:

    http://localhost:3452/ExcelUsingXSLT/Default.aspx?jobid=1'or'1'='1

    等效SQL语句如下:

    SELECT     job_id, job_desc, min_lvl, max_lvl
    FROM         jobs
    WHERE     job_id = '1' OR '1' = 1'

    sqlinjection7

    图3 job表查询结果

    现在我们把job表中的所有数据都查询出来了,仅仅通过一个简单的恒真表达式就可以进行了一次简单的攻击。

    虽然我们把job表的数据都查询出来了,但数据并没有太大的价值,由于我们把该表临时命名为job表,所以接着我们要找出该表真正表名。

    首先我们假设表名就是job,然后输入以下URL:

    http://localhost:3452/ExcelUsingXSLT/Default.aspx?jobid=1'or 1=(select count(*) from job)--

    等效SQL语句如下:

    SELECT       job_id, job_desc, min_lvl, max_lvl 
    FROM         jobs 
    WHERE      job_id='1'or 1=(select count(*) from job) --'

    sqlinjection8

    图4 job表查询结果

    当我们输入了以上URL后,结果服务器返回我们错误信息,这证明了我们的假设是错误的,那我们该感觉到挫败吗?不,其实这里返回了很多信息,首先它 证明了该表名不是job,而且它还告诉我们后台数据库是SQL Server,不是MySQL或Oracle,这也设计一个漏洞把错误信息直接返回给了用户。

    接下假定表名是jobs,然后输入以下URL:

    http://localhost:3452/ExcelUsingXSLT/Default.aspx?jobid=1'or1=(select count(*) from jobs) --

    等效SQL语句如下:

    SELECT       job_id, job_desc, min_lvl, max_lvl 
    FROM         jobs 
    WHERE      job_id='1'or 1=(select count(*) from jobs) --'

    sqlinjection

    图5 job表查询结果

    现在证明了该表名是jobs,这可以迈向成功的一大步,由于我们知道了表名就可以对该表进行增删改操作了,而且我们还可以猜测出更多的表对它们作出修改,一旦修改成功那么这将是一场灾难。

    现在大家已经对SQL Injection的攻击有了初步的了解了,接下让我们学习如何防止SQL Injection。

    总的来说有以下几点:

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

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

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

    4.+ @"\s?sysobjects\s?|\s?xp_.*?|\s?syslogins\s?|\s?sysremote\s?|\s?sysusers\s?|\s?sysxlogins\s?|\s?sysdatabases\s?|\s?aspnet_.*?|\s?exec\s?", RegexOptions.Compiled | RegexOptions.IgnoreCase);

    上面我们定义了一个正则表达式对象RegSystemThreats,并且给它传递了校验用户输入的正则表达式。

    由于我们已经完成了对用户输入校验的正则表达式了,接下来就是通过该正则表达式来校验用户输入是否合法了,由于.NET已经帮我们实现了判断字符串是否匹配正则表达式的方法——IsMatch(),所以我们这里只需给传递要匹配的字符串就OK了。

    示意代码如下:

    /// <summary>
    /// A helper method to attempt to discover [known] SqlInjection attacks.  
    /// </summary>
    /// <param name="whereClause">string of the whereClause to check</param>
    /// <returns>true if found, false if not found </returns>
    public static bool DetectSqlInjection(string whereClause)
    {
        return RegSystemThreats.IsMatch(whereClause);
    }
    
    /// <summary>
    /// A helper method to attempt to discover [known] SqlInjection attacks.  
    /// </summary>
    /// <param name="whereClause">string of the whereClause to check</param>
    /// <param name="orderBy">string of the orderBy clause to check</param>
    /// <returns>true if found, false if not found </returns>
    public static bool DetectSqlInjection(string whereClause, string orderBy)
    {
        return RegSystemThreats.IsMatch(whereClause) || RegSystemThreats.IsMatch(orderBy);
    }

    现在我们完成了校验用的正则表达式,接下来让我们需要在页面中添加校验功能。

    /// <summary>
    /// Handles the Load event of the Page control.
    /// </summary>
    /// <param name="sender">The source of the event.</param>
    /// <param name="e">The <see cref="System.EventArgs"/> instance containing the event data.</param>
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            // Gets departmentId from http request.
            string queryString = Request.QueryString["jobId"];
            if (!string.IsNullOrEmpty(queryString))
            {
                if (!DetectSqlInjection(queryString) && !DetectSqlInjection(queryString, queryString))
                {
                    // Gets data from database.
                    gdvData.DataSource = GetData(queryString.Trim());
    
                    // Binds data to gridview.
                    gdvData.DataBind();
                }
                else
                {
                    throw new Exception("Please enter correct field");
                }
            }
        }
    }

    当我们再次执行以下URL时,被嵌入的恶意语句被校验出来了,从而在一定程度上防止了SQL Injection。

    http://localhost:3452/ExcelUsingXSLT/Default.aspx?jobid=1'or'1'='1

    sqlinjection9

    图6 添加校验查询结果

    但使用正则表达式只能防范一些常见或已知SQL Injection方式,而且每当发现有新的攻击方式时,都要对正则表达式进行修改,这可是吃力不讨好的工作。

    通过参数化存储过程进行数据查询存取

    首先我们定义一个存储过程根据jobId来查找jobs表中的数据。

    -- =============================================
    -- Author:        JKhuang
    -- Create date: 12/31/2011
    -- Description:    Get data from jobs table by specified jobId.
    -- =============================================
    ALTER PROCEDURE [dbo].[GetJobs]
        -- ensure that the id type is int
        @jobId INT
    AS
    BEGIN
    --    SET NOCOUNT ON;
        SELECT job_id, job_desc, min_lvl, max_lvl
        FROM dbo.jobs
        WHERE job_id = @jobId
        GRANT EXECUTE ON GetJobs TO pubs 
    END

    接着修改我们的Web程序使用参数化的存储过程进行数据查询。

    using (var com = new SqlCommand("GetJobs", con))
    {
        // Uses store procedure.
        com.CommandType = CommandType.StoredProcedure;
    
        // Pass jobId to store procedure.
        com.Parameters.Add("@jobId", SqlDbType.Int).Value = jobId;
        com.Connection.Open();
        gdvData.DataSource = com.ExecuteScalar();
        gdvData.DataBind(); 
    }

    现在我们通过参数化存储过程进行数据库查询,这里我们把之前添加的正则表达式校验注释掉。

    sqlinjection10

    图7 存储过程查询结果

    大家看到当我们试图在URL中嵌入恶意的SQL语句时,参数化存储过程已经帮我们校验出传递给数据库的变量不是整形,而且使用存储过程的好处是我们还可以很方便地控制用户权限,我们可以给用户分配只读或可读写权限。

    但我们想想真的有必要每个数据库操作都定义成存储过程吗?而且那么多的存储过程也不利于日常的维护。

    参数化SQL语句

    还是回到之前动态拼接SQL基础上,我们知道一旦有恶意SQL代码传递过来,而且被拼接到SQL语句中就会被数据库执行,那么我们是否可以在拼接之前进行判断呢?——命名SQL参数。

    string sql1 = string.Format("SELECT job_id, job_desc, min_lvl, max_lvl FROM jobs WHERE job_id = @jobId");
    using (var con = new SqlConnection(ConfigurationManager.ConnectionStrings["SQLCONN1"].ToString()))
    using (var com = new SqlCommand(sql1, con))
    {
        // Pass jobId to sql statement.
        com.Parameters.Add("@jobId", SqlDbType.Int).Value = jobId;
        com.Connection.Open();
        gdvData.DataSource = com.ExecuteReader();
        gdvData.DataBind(); 
    }

    sqlinjection10

    图8 参数化SQL查询结果

    这样我们就可以避免每个数据库操作(尤其一些简单数据库操作)都编写存储过程了,而且当用户具有数据库中jobs表的读权限才可以执行该SQL语句。

    添加新架构

    数据库架构是一个独立于数据库用户的非重复命名空间,您可以将架构视为对象的容器(类似于.NET中的命名空间)。

    首先我们右击架构文件夹,然后新建架构。

    clip_image002

    sqlinjection12

    图9 添加HumanResource架构

    上面我们完成了在pubs数据库中添加HumanResource架构,接着把jobs表放到HumanResource架构中。

    sqlinjection15

    sqlinjection13

    图 10 修改jobs表所属的架构

    当我们再次执行以下SQL语句时,SQL Server提示jobs无效,这是究竟什么原因呢?之前还运行的好好的。

    SELECT job_id, job_desc, min_lvl, max_lvl FROM jobs

    sqlinjection14

    图 11 查询输出

    当我们输入完整的表名“架构名.对象名”(HumanResource.jobs)时,SQL语句执行成功。

    SELECT job_id, job_desc, min_lvl, max_lvl FROM HumanResource.jobs

    sqlinjection16

    为什么之前我们执行SQL语句时不用输入完整表名dbo.jobs也可以执行呢?

    这是因为默认的架构(default schema)是dbo,当只输入表名时,Sql Server会自动加上当前登录用户的默认的架构(default schema)——dbo。

    由于我们使用自定义架构,这也降低了数据库表名被猜测出来的可能性。

    LINQ to SQL

    前面使用了存储过程和参数化查询,这两种方法都是非常常用的,而针对于.NET Framework的ORM框架也有很多,如:NHibernate,Castle和Entity Framework,这里我们使用比较简单LINQ to SQL。

    sqlinjection17

    图 12 添加jobs.dbml文件

    var dc = new pubsDataContext();
    int result;
    
    // Validates jobId is int or not.
    if (int.TryParse(jobId, out result))
    {
        gdvData.DataSource = dc.jobs.Where(p => p.job_id == result);
        gdvData.DataBind();
    }

    相比存储过程和参数化查询,LINQ to SQL我们只需添加jobs.dbml,然后使用LINQ对表进行查询就OK了。

    1.1.3 总结

    我们在本文中介绍了SQL Injection的基本原理,通过介绍什么是SQL Injection,怎样进行SQL Injection和如何防范SQL Injection。通过一些程序源码对SQL的攻击进行了细致的分析,使我们对SQL Injection机理有了一个深入的认识,作为一名Web应用开发人员,一定不要盲目相信用户的输入,而要对用户输入的数据进行严格的校验处理,否则的 话,SQL Injection将会不期而至。

    展开全文
  • SQL注入#和$区别与总结

    千次阅读 2017-08-05 20:21:20
    如:order by #user_id#,如果传入的值是111,那么解析成sql时的值为order by "111",  如果传入的值是id,则解析成的sql为order by "id". 2.$将传入的数据直接显示生成在sql中。如:order by $...
  • SQL中 # 与 $ 的不同

    2019-01-14 20:07:52
    区别: (1)#将传入的数据都当成一个字符串,会对自动传入的数据加一个双引号。如: #{id},如果传入的值是id,则解析成的sql为&amp;amp;amp;amp;...(3)#方式在很大程度上能够防止sql注入
  • 前两天,我这边遇到了一点问题,就问同事一些关于mybatis 的问题,她突然问我#,$的区别,当时很尴尬,我有映象 却怎么也想不起来,今天查了一下,赶紧记下来。然而我知道了。didier-zhang,就问你服不服 ...
  • SQL中# 与$ 的区别

    2019-08-22 19:52:20
    转自:... sql 中 ${} 和 #{}的区别: https://blog.csdn.net/qq_15901351/article/details/82290032 sql语句中使用#跟$的区别(MyBatis中):https://blog.csdn.net/Unique_YF/arti...
  • 三种数据库的 SQL 注入详解

    万次阅读 多人点赞 2019-02-25 09:20:40
    SQL注入攻击指的是通过构建特殊的输入作为参数传入Web应用程序,而这些输入大都是SQL语法里的一些组合,通过执行SQL语句进而执行攻击者所要的操作,其主要原因是程序没有细致地过滤用户输入的数据,致使非法数据侵入...
  • 常见的Web漏洞——SQL注入

    万次阅读 多人点赞 2018-06-25 17:59:26
    SQL注入简介 SQL注入原理 SQL注入分类及判断 SQL注入方法 联合查询注入 基于bool的盲注 基于时间的盲注 总结 SQL注入简介 SQL注入是网站存在最多也是最简单的漏洞,主要原因是程序员在开发用户和数据库交互...
  • 注入漏洞-sql注入

    万次阅读 2019-04-30 09:33:46
    所谓SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行指定的SQL语句。具体来说,它是利用现有应用程序,将SQL语句注入到后台数据库引擎执行的能力,它可以...
  • SQL注入和解决方法

    万次阅读 2019-01-03 13:04:40
    目录  SQL注入 1、SQL注入说明 2、SQL注入影响 3、SQL注入示例 4、SQL注入解决方法  SQL注入 1、SQL注入说明 应用为了和数据库进行沟通完成必要的管理和存储工作,...
  • SQL注入器的官方文档 三步完成 第一步、创建一个类,主要目的将方法和sql做映射 需要自定义sql,如下定义了一个sql语句: myDefineSql ="delete from "+tableInfo.getTableName();//构造一条delete from user,待...
  • SQL注入

    千次阅读 2018-09-17 14:02:50
    所谓SQL注入,就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令,比如先前的很多影视网站泄露VIP会员密码大多就是通过WEB表单递交查询字符暴出的,这类...
  • Sql注入基本原理

    千次阅读 多人点赞 2018-07-29 11:19:27
    SQL注入攻击通过构建特殊的输入作为参数传入Web应用程序,而这些输入大都是SQL语法里的一些组合,通过执行SQL语句进而执行攻击者所要的操作,它目前是黑客对数据库进行攻击的最常用手段之一。
  • Sql注入详解及防范方法

    万次阅读 多人点赞 2018-09-03 17:22:06
    sql注入实例分析 什么是SQL注入攻击?引用百度百科的解释: sql注入_百度百科: 所谓SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。...
  • sql注入---入门到进阶

    千次阅读 多人点赞 2019-10-13 21:06:33
    概述:针对SQL注入的攻击行为可描述为通过用户可控参数中注入SQL语法,破坏原有SQL结构,达到编写程序时意料之外结果的攻击行为,其本质就是对于输入检查不充分,导致SQL语句将用户提交的非法数据当作语句的一部分来...
  • SQL注入测试总结

    万次阅读 2018-07-11 11:10:04
    SQL注入测试总结本文以MySQL数据库为例,其它数据库仅供参考。1 黑盒测试1.1 手工测试Web应用的主要注入点有:① POST请求体中的参数② GET请求头URL中的参数③ Cookie1.1.1 内联注入1、字符串内联注入测试字符串...
  • 一、关于Druid Druid是一个JDBC组件,它包括三部分: DruidDriver 代理Driver,能够提供基于Filter-Chain模式的...SQLParser Druid可以做什么? 1) 可以监控数据库访问性能,Druid内置提供了一个功能强大的St
  • 如何防止SQL注入

    万次阅读 2013-10-23 17:37:06
    -----解决方案-------------------------------------------------------- 过滤URL中的一些特殊字符,动态SQL语句使用PrepareStatement..  ------解决方案--------------...注入的方式就是在查询条件里加入SQL字符串
  • sql注入详解

    千次阅读 2016-08-10 16:20:45
    什么是sql注入 Sql注入是一种将sql代码插入或添加到应用(用户)的输入参数中的攻击,之后再将这些参数传递给后台的SQL服务器加以解析并执行。由于sql语句本身多样性,以及可用于构造的sql语句编码方法很多,因此...
  • 小试牛刀:SQL 注入攻击

    万次阅读 多人点赞 2019-02-24 17:22:32
    小试牛刀:SQL注入攻击一、检测注入点二、判断是否存在 SQL 注入可能三、数据库爆破四、字段爆破五、数据库表爆破六、用户名、密码爆破七、总结 一、检测注入点 首先,在 http://120.203.13.75:6815/?id=1 目标...
  • Mybatis和Hibernate:防止SQL注入

    万次阅读 2019-01-29 10:49:58
    SQL注入是目前黑客最常用的攻击手段,它的原理是利用数据库对特殊标识符的解析强行从页面向后台传入。改变SQL语句结构,达到扩展权限、创建高等级用户、强行修改用户资料等等操作。 为什么这么说,下面就以JAVA为...
  • 使用Python防止SQL注入攻击

    千次阅读 多人点赞 2020-05-19 18:02:48
    让我们一起掌握Python防止SQL注入的技巧跟方法来抵抗恶意攻击吧!
  • sql注入解决

    千次阅读 2017-07-09 17:15:22
    sql注入解决
  • 小榕sql注入工具

    千次下载 热门讨论 2012-01-05 20:55:00
    WED.EXE 小榕(榕哥)出的sql注入工具 使用该工具可以在短短2秒钟就猜出管理员的帐号和密码! 里面附带的wis.exe 也是小榕写的一个扫描后台管理员登陆路径的工具!
  • 在前面的博客中,我们详细介绍了: ... 我们了解了sql注入原理和sql注入过程,今天我们就来了解一下sql注入的解决办法。怎么来解决和防范sql注入,由于本人主要是搞Java web开发的小程序员,所以
  • 如何防止sql注入呢?

    万次阅读 2018-05-21 20:09:46
    sql注入大大降低了网站的安全性!最终达到欺骗服务器执行恶意的SQL命令。 会查出条件不允许的数据,假如是这样的一条sql:$sql="select * from stu where stu_name = $name and stu_email = $password";...

空空如也

1 2 3 4 5 ... 20
收藏数 3,489,821
精华内容 1,395,928
关键字:

sql注入