SQL注入与防范

SQL注入简介:

所谓SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。具体来说,它是利用现有应用程序,将(恶意)的SQL命令注入到后台数据库引擎执行的能力,它可以通过在Web表单中输入(恶意)SQL语句得到一个存在安全漏洞的网站上的数据库,而不是按照设计者意图去执行SQL语句。

SQL注入方法:

一、拼接字符串(通过输入框输入SQL语句使其改变原意)

Select * from T_User where UserID =’txtUserID.Text’andPassword=’ txtPassword.Text ’

  其原理是通过查找T_User 表中的用户名(UserID) 和密码(Password) 的结果来进行授权访问, 在txtUserID.Text为mysql,txtPassword.Text为mary,那么SQL查询语句就为:

Select * from users where username =’ mysql ’ and  password  =’ mary ’

  如果分别给txtUserID.Text 和txtPassword.Text赋值’ or ‘1’ = ‘1’ --和abc。那么,SQL 脚本解释器中的上述语句就会变为:

Select * from T_User  where UserID =’’or  ‘1’ = ‘1’  -- and Password =’abc’

  该语句中进行了两个条件判断,只要一个条件成立,就会执行成功。而‘1‘=‘1‘在逻辑判断上是恒成立的,后面的"--" 表示注释,即后面所有的语句为注释语句这样我们就成功登录。即SQL注入成功.

原来SQL语句:insert  into  category(name)  values(‘”+caName+”’)

输入框中输入:caName=娱乐新闻’)select category --‘)

SQL语句变成:insert  into  category(name)  values(‘娱乐新闻’)Select  category  --‘)

SQL语句改变后,将执行插入和查询两个操作(如果修改的不是查询而是删除将会更加可怕),即SQL注入成功。

二、查看错误页信息(SQL Server有一些系统变量,如果我们没有限制错误信息的输出,那么注入着可以直接从出错信息获取)

Web中的网址:http://www.xxx.com/Login.aspx?id=49 and user>0首先,前面的语句是正常的,重点在and user>0,我们知道,user是SQL Server的一个内置变量,它的值是当前连接的用户名 ,类型为nvarchar。拿一个nvarchar的值跟int的数0比较,系统会先试图将nvarchar的值转成int型,当然,转的过程中肯定会出错,SQL
Server的出错提示是:将nvarchar值 ”abc” 转换数据类型 为 int 的列时发生语法错误,abc正是变量user的值,这样,注入着就拿到了数据库的用户名,即SQL注入成功。

SQL注入防范:


 一、简单防范:

1.输入框中限制特殊字符以及长度

2.Web中设置错误提示页即:

在Web.Config文件中设置

<!--出现错误的时候自动导向("~/error.html"是弹出页面的路径)-->

<customErrors mode="On" defaultRedirect ="~/error.html" ></customErrors>

3.URL重写:

URL重写就是首先获得一个进入的URL请求然后把它重新写成网站可以处理的另一个URL的过程。举个例子来说,如果通过浏览器进来的URL是“UserProfile.aspx?ID=1”那么它可以被重写成“UserProfile/1.aspx”

二、SQL语句中的防范

1.参数化查询:参数化查询(Parameterized Query 或 Parameterized Statement)是指在设计与数据库链接并访问数据时,在需要填入数值或数据的地方,使用参数 (Parameter) 来给值。

例如:

不使用参数化查询:

string sql = "select * from comment where newsId = "txtnewsId" order by createTime desc";

因为上面SQL语句中的"txtnewsId"是不确定的,每次调用的时候需要将SQL语句重新编译,这就能用上面的拼接字符串实现SQL注入。

使用参数化查询:

string sql = "select * from comment where newsId = @newsId order by createTime desc";

SqlParameter[] paras = new SqlParameter[]{new SqlParameter ("@newsId",newsId)};

因为上面SQL语句是固定的,调用的时候只需要将@newsId的值传上去就可以,所以即便用户输入任何信息也会当成一个值传递进去,防止SQL注入。

2.通过写存储过程:

其实在存储过程里面也需要用到参数化查询并且存储过程本身没有SQL注入这两点同时满足才能防止SQL注入。

3.限制数据库的访问权限:

设立不同用户的特殊权限,例如:用户名为1的用户只允许查询操作,然而用户1的信息被盗取登陆之后就不能对表进行别的操作,这样就一定程度上保证了数据的安全性。

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-08-15 16:05:09

SQL注入与防范的相关文章

目前日向博客对xss跨站脚本注入和sql注入的防范

昨天本博客受到了xss跨站脚本注入攻击,3分钟攻陷--其实攻击者进攻的手法很简单,没啥技术含量.只能感叹自己之前竟然完全没防范. 这是数据库里留下的一些记录.最后那人弄了一个无线循环弹出框的脚本,估计这个脚本之后他再想输入也没法了. 类似这种: <html> <body onload='while(true){alert(1)}'> </body> </html> 我立刻认识到这事件严重性,它说明我的博客有严重安全问题.因为xss跨站脚本攻击可能导致用户Co

PHP 关于SQL注入的防范措施。

最近在使用框架的时候还是有点不安,不知道框架的设计者有没有考虑到SQL-Injection的问题,我在顶层需不需要做一些必要的过滤等等,由 此我特意的去StackOverflow看了下,真是获益良多,然后我去看了下框架的DB库的内部方法,然后就比较安心了.分享下国内外PHP程序员在处 理SQL-Injection的一些方案. 国外普遍都推荐,只要你是使用查询都应该做到两点:1.prepared statements(准备好的声明) 2.parameterized queries (参数化的查询请

API安全(二)-SQL注入与防范

1.什么是注入攻击 使用了用户输入的但是我们没有校验过的数据,来拼装一个可以行的指令,交给系统去执行,结果导致执行了我们不希望发生的命令.注入攻击用很多种,最常见的是SQL注入. 2.SQL注入攻击 Java程序员知道,使用Statement进行查询时会造成SQL注入攻击,从而使用PreparedStatement来进行SQL预编译,从而有效的防止SQL注入攻击.但是日常开发中,我们一般多使用框架来进行数据库操作,如JdbcTemplate.Spring-Data-Jpa.Mybatis等,但是

sql注入以及防范

登陆验证注入: //万能用户名失效 //万能密码 xx' or 1='1 //万能用户名 xxx' union select * from users/* $sql="select * from users where username='$username' and password='$password'"; //万能密码 33 union select * from users //万能用户名 89 union select * from users;/* $sql="

java sql 注入 与防范

1.注入 2 .预防 package com.jdbc; import java.sql.*; import java.util.Scanner; public class loginDemo { public static void main(String[] args)throws ClassNotFoundException, SQLException { //1.注册驱动 Class.forName("com.mysql.jdbc.Driver"); //2.连接 String

MySQL防范SQL注入风险

0.导读 在MySQL里,如何识别并且避免发生SQL注入风险 1.关于SQL注入 互联网很危险,信息及数据安全很重要,SQL注入是最常见的入侵手段之一,其技术门槛低.成本低.收益大,颇受各层次的黑客们所青睐. 一般来说,SQL注入的手法是利用各种机会将恶意SQL代码添加到程序参数中,并最终被服务器端执行,造成不良后果. 例如,我们访问接口 http://imysql.com/user.php?userid=123 来根据userid获取用户信息,假设程序中是这么处理的: $sql = “SELE

记录一下学习PDO技术防范SQL注入的方法

最近学习了使用PDO技术防范SQL注入的方法,在博客里当做一次笔记.若果有新的感悟在来添上一笔,毕竟也是刚开始学习.一. 什么是PDO PDO全名PHP Data Object PHP 数据对象 (PDO) 扩展为PHP访问数据库定义了一个轻量级的一致接口. PDO 提供了一个数据访问抽象层,这意味着,不管使用哪种数据库,都可以用相同的函数(方法)来查询和获取数据. 二.如何去使用PDO防范SQL注入?/防范sql注入这里使用quate()方法过滤特殊字符和通过预处理的一些方式以及bindPar

SQL注入其实很简单,别一不留神就被利用了

SQL注入这个词相信大家应该都不陌生,而且每年都会有这样子的事情发生,下面我先带大家回忆11年两期起比较经典的案例事件: 1.SONY索尼事件2011年4月,著名的×××组织Anonymous***SONY一个网站,一星期后才被发现7千万的用户个人信息,其中包括姓名.地址.E-mail.出生日期.用户名.密码以及购买记录的数据信息,随后的一些其他服务器也被相继攻破 2.CSDN数据泄露门2011年底,国内各大网站被爆出"密码泄露门",最先公布的是著名技术网站CSDN600万账户和密码泄

Sql 注入详解:宽字节注入+二次注入

sql注入漏洞 原理:由于开发者在编写操作数据库代码时,直接将外部可控参数拼接到sql 语句中,没有经过任何过滤就直接放入到数据库引擎中执行了. 攻击方式: (1) 权限较大时,直接写入webshell 或者直接执行系统命令 (2) 权限较小时,通过注入获得管理员密码信息,或者修改数据库内容进行钓鱼等 常出现的地方: 登录页面.获取HTTP头(user-agent.client-ip等).订单处理等,HTTP头里面client-ip 和 x-forward-for 常出现漏洞,在涉及购物车的地方