黑马程序员技术交流社区

标题: 什么是sql注入?如何避免sql注入? [打印本页]

作者: 殘遛の丶狳味    时间: 2013-8-6 20:52
标题: 什么是sql注入?如何避免sql注入?
什么是sql注入?如何避免sql注入?
作者: sxdxgzr@126.com    时间: 2013-8-6 20:58
1概念:SQL注入攻击指的是通过构建特殊的输入作为参数传入Web应用程序,过执而这些输入大都是SQL语法里的一些组合,通行SQL语句进而执行攻击者所要的操作,其主要原因是程序没有细致地过滤用户输入的数据,致使非法数据侵入系统。
根据相关技术原理,SQL注入可以分为平台层注入和代码层注入。前者由不安全的数据库配置或数据库平台的漏洞所致;后者主要是由于程序员对输入未进行细致地过滤,从而执行了非法的数据查询。基于此,SQL注入的产生原因通常表现在以下几方面:①不当的类型处理;②不安全的数据库配置;③不合理的查询集处理;④不当的错误处理;⑤转义字符处理不合适;⑥多个提交处理不当。

2解决方法

a.永远不要信任用户的输入。对用户的输入进行校验,可以通过正则表达式,或限制长度;对单引号和
双"-"进行转换等。
b.永远不要使用动态拼装sql,可以使用参数化的sql或者直接使用存储过程进行数据查询存取。
c.永远不要使用管理员权限的数据库连接,为每个应用使用单独的权限有限的数据库连接。
d.不要把机密信息直接存放,加密或者hash掉密码和敏感的信息。
e.应用的异常信息应该给出尽可能少的提示,最好使用自定义的错误信息对原始错误信息进行包装
f.sql注入的检测方法一般采取辅助软件或网站平台来检测,软件一般采用sql注入检测工具jsky,网站平台就有亿思网站安全平台检测工具。MDCSOFT SCAN等。采用MDCSOFT-IPS可以有效的防御SQL注入,XSS攻击等。
作者: 聂广强    时间: 2013-8-6 22:48
利用sql语言漏洞获得合法身份登陆系统。如身份验证的程序设计成:
SqlCommand com=new SqlCommand("Select * from users where username='"+t_name.text+"' and pwd='"+t_pwd.text+"'");
object obj=com.ExcuteScale();
if(obj!=null)
{
//通过验证
}
这段代码容易被sql注入。如用户在t_name中随便输入,在t_pwd中输入1' or 1='1 就可以进入系统了。


如何避免就是在拼接sql字符串的时候用参数来表示  或者使用存储过程来避免sql的注入 到那个时候想通过恒成立的管理也就无法注入了
作者: 高文咪    时间: 2013-8-7 14:05
1、所谓SQL注入,就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令;
比如:string sql='select *  from test where id='+txtId.text;
如果对方随意输入一个值,后面加上or 1=1这样,这样就被对方恶意攻击了;
2、避免SQL注入的方法:
你可以把sql语句改写成这样的:string sql='select *  from test where id=@id';
sqlparameter param={
new sqlparameter("@id",txtid.text)
}

用parameter去连接对象值;
作者: 落叶秋风    时间: 2013-8-7 21:02
比如在登录时判断姓名name;sql="select * from 表 where name='“+name+”'";若name是获取用户填写的姓名,若用户填写成"" or '1=1'--时那sqlwhere就是一恒等式,那样肯定会有返回值
作者: 高腾    时间: 2013-8-11 00:40
SQL注入式攻击就是指在用户输入的时候 给SQL拼接的字符串输入了一个恒等条件 比如说where stuName=txtName.Text and stuPwd=txtPwd.txt or 1=1,这样就会造成不论是谁都能登录
避免SQL注入式攻击的两种方法:
第一种是ASP比较原始的方法 就是将查询字符串中的单引号换成双引号 拼接到数据库中的SQL语句会将两个单引号当做一个双引号 从而不当做字符串
第二种就是参数化查询 SqlParameter para = new SqlParameter("@别名",SqlDBType.数据库类型名,长度){value=别名的值};




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2