SQL注入是什么概念?为什么要防止SQL注入
sql注入,是hacker利用程序漏洞,在交互的时候,如,url地址栏,搜索的文本框,填入sql关键字,如果程序没有做替换关键字等措施,直接拼接sql语句。那么,执行的就是,客户恶意提交的sql语句,后果不堪设想。
1.可以查看没有权限查看的数据
如:根据关键字搜索用户,在文本框末尾输入 or 1=1,要执行的语句select * from birthdayWish where id=-1 and birth_userId=-1 or 1=1, 获取了所有的数据。sql语句where xxx and xxx是取交集,但是or 是取并集,也就是说,虽然你前面有n个条件,但是只要符合or后面的条件,都会搜索出来。1=1就是所有数据了.(如果or 后面又有个and,要同时符合and 后面的条件 相当于先获得or(1=1 and xxx)括号内交集的条件.)
2.如果服务器没有设置隐藏详细错误信息,可以分析SQL服务器系统信息,web服务器配置信息
报: 在将 nvarchar 值 'dbo' 转换成数据类型 int 时失败。sa用户显示'dbo',其他显示今天sql登录名,如:'myloginname'
把user换成db_name(),
在将 nvarchar 值 'test-erp' 转换成数据类型 int 时失败。
人家马上知道,你数据库用的SQLServer,而且是sa系统管理员的身份。数据库名是'test-erp' 。
文本框输入 and (select count(*) from msysobjects)>0 不报错,就知道是Access数据库,输入and (select count(*) from sysobjects)>0
不报错,就知道是Sqlserver数据库。
行 26: else if (Request.QueryString["id"] != null)行 27: sql += " and Corp_ID=" + Convert.ToInt32(Request.QueryString["id"]) + "";行 28: SqlCommand cmd = new SqlCommand(sql, cn);
e:\Test\amandag\SqlZhuru.aspx.cs 行: 27
版本信息: Microsoft .NET Framework 版本:4.0.30319; ASP.NET 版本:4.0.30319.1
别人注入后,马上能看出你服务器配置信息文件:.net 4.0的环境,连服务器路径都出来了,为黑客其他漏洞攻击提供了信息。他知道的越多,越容易攻破。
如何检查是否可以SQL注入:
如果localhosts/showdetail.asp?key=xxx能查到结果,xxx后面加上 and 1=1有结果,改为and 1=2没结果,那么这么网站没写防止SQL注入的程序
常用解决方案:
1.使用存储过程+参数化查询,SqlPameter.(参数话,net机制把输入的所有内容都当作参数条件,你输入 zhangsan or 1=1),查找的是名字叫zhangsan or 1=1的,当然找不到
2.使用HtmlEncode方法,转译
3.写一个Replace方法,在提交前,过滤关键字.
实践中,1+3合用的比较多。