ASP.NET网站中防SQL注入攻击技术的

点赞:23471 浏览:106745 近期更新时间:2024-03-02 作者:网友分享原创网站原创

[摘 要]本文主要针对目前ASP.NET网站安全面临的SQL注入攻击来进行分析研究,并从客户端和怎么写作器端两个方面来研究如何防范SQL注入攻击.

[关 键 词]网站安全SQL注入防SQL注入

一、引言

随着时代的发展,网路应用的不断深入,互联网上网站数量以惊人的速度增加.尽管如此,网络上环境的复杂性、多变性,以及信息系统的脆弱性,决定了现有的计算机系统还不具备与自身的应用发展规模相对应的安全防护能力,大量的网络威胁采用各种隐蔽的方式不断地冲击着网络应用平台.因此,对网站相关安全技术进行研究是很有必要的.

二、防SQL注入攻击技术的实现

1.SQL注入攻击技术简介

SQL注入攻击是当前网络攻击的主要手段之一,SQL注入技术在国外最早出现在1999年,我国在2002年后开始大量出现.目前还没有一个严格的定义来解释什么是SQL注入漏洞,但其本质是攻击者能够利用应用程序没有对用户输入的数据进行严格约束和合法性检查等错误在程序中插入并执行自己构造的SQL语句.


例如,在在Web应用程序的登录验证程序中,一般有用户名和两个参数,当用户点击提交按钮时,怎么写作器端会根据用户提交的用户名和信息来与数据库中的用户信息表进行比较,如果不对用户输入的信息进行任何限制,在怎么写作器端也不对用户提交的信息进行任何检查,其SQL语句就可以写成:

stringstrqry等于"Select*FromT_AdminwhereUserid等于'"+name+"'andUserPwd等于'"+pwd+"'",

显然上面这段代码并没有对用户的输入进行任何安全性的检查,如果数据库是SQLServer,那么恶意用户可以在用户名中输入admin’or1等于1--,在框中输入任何值(如:111),这样,SQL脚本解释器中的上述语句就会变为:

Select*FromT_AdminwhereUserid等于'admin'or1等于1--andUserPwd等于'111'

由于在SQLServer数据库中“--”表示注释,因此“--”后面的语句都为注释语句,这样在两个条件“Userid等于'admin'”和“1等于1”中,只要任何一个成立,该语句就会执行成功,而1等于1在逻辑判断上是恒成立的,因此不管T_Admin表中有没有admin这个用户,该语句都会执行成功并错误地将权限授予攻击者.

2.ASP.NET下防范SQL注入攻击策略的实现

ASP.NET网站中防SQL注入攻击技术的参考属性评定
有关论文范文主题研究: 什么是类论文范文 大学生适用: 在职研究生论文、自考毕业论文
相关参考文献下载数量: 14 写作解决问题: 如何怎么撰写
毕业论文开题报告: 文献综述、论文设计 职称论文适用: 核心期刊、职称评初级
所属大学生专业类别: 如何怎么撰写 论文题目推荐度: 优秀选题

要防范SQL注入攻击,需要对用户输入的数据进行检查,检查可以在客户端进行,也可以在怎么写作器端进行.在客户端,攻击者完全有可能获得网页的源代码,修改验证合法性的脚本(或者直接删除脚本),然后将非法内容通过修改后的表单提交给怎么写作器.因此,要保证验证安全性,唯一的办法就是在怎么写作器端也执行验证.但使用客户端验证可以减少页面往返次数以提升性能,改进用户体验.因此,在实际中往往在客户端和怎么写作器端同时进行检查.

(1)客户端的防SQL注入功能的实现

在客户端,可以JaScript脚本语言来编写用于检查用户输入的函数,也可以通过ASP.NET提供的输入输入验证控件来检查用户的输入.其中,使用ASP.NET提供的输入验证控件来检查用户的输入是最简单的方法.

在ASP.NET中,RegularExpressionValidator控件是一个强大的工具.他可以检验文本是否和定义的正则表达式中的模式匹配.你只需要简单地配置ValidationExpression属性的正则表达式即可.正则表达式也是一个强大的工具,它允许指定复杂的规则,该规则指定字符和字符顺序(位置和出现次数).为防止用户输入一些危险的字符,可以利用该正则表达式“^[0-9A-Za-z_]+$”,该表达式表示的意思是用户只可以输入字母和数字.要运用该正则表达式,只需在将其赋值给RegularExpressionValidator控件的ValidationExpression属性即可.

(2)怎么写作器端的防SQL注入功能的实现

由于通过客户端进行验证并不能完全保证安全性,因此,为保证安全性,最有效的办法是在怎么写作器端进行验证.在怎么写作器端,通常的做法有两种,一种是构造一个专门的函数来将特殊字符和字符串过滤掉,另一种是对SQL语句使用命令参数方式.

过滤函数一般可以表示如下:

PublicstringConvertSql(stringinputStr)

{

inputString等于inputString.Trim(),

inputString等于inputString.Replace("'",""),

inputString等于inputString.Replace("等于",""),

inputString等于inputString.Replace(",―――",""),

inputString等于inputString.Replace("and",""),

inputString等于inputString.省略中并非最有效的方式,因为如果文本确实需要包含这些符号,这样就引入了其他麻烦,更好的解决办法是使用参数化命令来防止SQL注入攻击.参数化命令是在SQL文本中使用占位符的命令.占位符表示需要动态替换的值,它们通过Command对象的Parameters集合来传送.在管理员登陆页面,如果使用参数化命令,其SQL语句就可以表示为:

Select*FromT_AdminwhereUserid等于@nameandUserPwd等于@pwd

在该SQL语句中@name和@pwd是参数的名字,所有参数必须以@字符开头.使用参数化命令后,当恶意用户在用户名中输入admin’or1等于1--时,应用程序就会从T_Admin表中检索用户名为admin’or1等于1--的用户,显然这样就不可能得到任何记录,因为没有一个管理员的用户名是admin’or1等于1--.参数化命令的实现可表示如下.

//使用参数化命令申明SQL语句

stringmysql等于"Select*FromT_AdminwhereUserid等于@nameandUserPwd等于@pwd",

OleDbConnectionconn等于newOleDbConnection(connStr),

OleDbCommandcmd等于newOleDbCommand(mysql,conn),

//对@name参数赋值

cmd.Parameters.AddWithValue("@name",name),

//对@password参数赋值

cmd.Parameters.AddWithValue("@pwd",Password),