ASP与ASP.NET中的SQL注入及防范
什么是SQL注入? SQL资料隐码攻击 (SQL injection)又称为 隐码攻击 、 SQL注入 等,是发生于应用程式之数据库层的安全漏洞。简而言之,是在输入的资料字串之中夹带SQL指令,在设计不良
什么是SQL注入?
SQL资料隐码攻击(SQL injection)又称为隐码攻击、SQL注入等,是发生于应用程式之数据库层的安全漏洞。简而言之,是在输入的资料字串之中夹带SQL指令,在设计不良的程式当中忽略了检查,那么这些夹带进去的指令就会被数据库服务器误认为是正常的SQL指令而执行,因此招致到破坏。
SQL 注入攻击是比较常见的方式:
例如这么一张表格:
- CREATE TABLE [users] (
- [userid] [varchar] (16) COLLATE Chinese_PRC_CI_AS NOT NULL ,
- [password] [varchar] (8) COLLATE Chinese_PRC_CI_AS NOT NULL ,
- ) ON [PRIMARY]
- GO
假如代码是这样的:
- <%
- userid = TRIM(Request("uid"))
- Set Conn = Server.CreateObject("ADODB.Connection")
- Conn.Open "PROVIDER=SQLOLEDB;UID=test;PWD=test;DATABASE=test"
- Set RS = Server.CreateObject("ADODB.Recordset")
- RS.Open "SELECT * FROM users WHERE userid='"&userid"'", Conn
- while not RS.EOF
- Response.Write RS("userid")","&RS("password")"<br>"
- RS.Movenext
- wend
- RS.Close
- Conn.Close
- Set RS = nothing
- Set Conn = nothing
- %>
那么通过
- http://127.0.0.1:81/test.asp?uid=guest' or '1'='1
这种方式调用将显示users表里所有用户。
ASP和ASP.NET的安全防范
(1) 过滤所有非法字符
例如:字符串过滤"'","--",";" 等字符,数字型变量使用CLng, CInt 进行一次强制转换。
(2)用Command对象
例如:
- <%
- userid = TRIM(Request("uid"))
- Set Conn = Server.CreateObject("ADODB.Connection")
- Conn.Open "PROVIDER=SQLOLEDB;UID=test;PWD=test;DATABASE=test"
- Set Cmd = Server.CreateObject("ADODB.Command")
- Cmd.ActiveConnection = Conn
- Cmd.CommandType = adCmdText
- Cmd.CommandText = "SELECT * FROM users WHERE userid = ?"
- Cmd.Parameters.Refresh
- Cmd("Param1") = userid
- Set RS = Cmd.Execute
- while not RS.EOF
- Response.Write RS("userid")","&RS("password")"<br>"
- RS.Movenext
- wend
- RS.Close
- Conn.Close
- Set RS = nothing
- Set Cmd = nothing
- Set Conn = nothing
- %>
ASP版本
但对于类似包含子查询的复杂语句,如:
- Cmd.CommandText = "SELECT * FROM users WHERE userid=? OR userid IN (SELECT userid FROM customer WHERE username=?)"
- Cmd.Parameters.Refresh
- Cmd("Param1") = userid
- Cmd("Param2") = username
这种方式执行时会显示如下错误信息:
无法从带子选择的查询 SQL 语句中获得参数信息。在准备命令前,请设置参数信息。
需要采用如下方式:
- Cmd.CommandText = "SELECT * FROM users WHERE userid=? OR userid IN (SELECT userid FROM customer WHERE username=?)"
- Cmd.Parameters.Append(Cmd.CreateParameter("userid", adVarChar, adParamInput, 16, userid))
- Cmd.Parameters.Append(Cmd.CreateParameter("username", adVarChar, adParamInput, 16, username))
(3) 采用存储过程
例如,建立存储过程GetUsers:
- CREATE PROCEDURE GetUsers
- (
- @userid varchar(16),
- @username varchar(16)
- )
- AS
- SET NOCOUNT ON
- /**//* 选择返回的记录集 */
- SELECT * FROM users WHERE userid=@userid
- OR userid IN (SELECT userid FROM userdetails WHERE username=@username)
- GO
调用代码如下:
- <%
- userid = TRIM(Request("uid"))
- username = TRIM(Request("username"))
- Set Conn = Server.CreateObject("ADODB.Connection")
- Conn.Open "PROVIDER=SQLOLEDB;UID=test;PWD=test;DATABASE=test"
- Set Cmd = Server.CreateObject("ADODB.Command")
- Cmd.ActiveConnection = Conn
- Cmd.CommandType = adCmdStoredProc
- Cmd.CommandText = "GetUsers"
- Cmd.Parameters.Append(Cmd.CreateParameter("userid", adVarChar, adParamInput, 16, userid))
- Cmd.Parameters.Append(Cmd.CreateParameter("username", adVarChar, adParamInput, 16, username))
- Set RS = Cmd.Execute
- while not RS.EOF
- Response.Write RS("userid")","&RS("password")"<br>"
- RS.Movenext
- wend
- RS.Close
- Conn.Close
- Set RS = nothing
- Set Cmd = nothing
- Set Conn = nothing
- %>
ASP.NET版本
- SqlConnection Conn = new SqlConnection("SERVER=127.0.0.1;UID=sa;PWD=123456;DATABASE=mydb");
- SqlCommand Cmd = new SqlCommand();
- try
- {
- Conn.Open();
- Cmd.Connection = Conn;
- Cmd.CommandType = CommandType.Text;
- Cmd.CommandText = "SELECT * FROM users WHERE userid = @userid";
- Cmd.Parameters.Add("@userid", SqlDbType.VarChar, 16).Value = "vckbase";
- SqlDataReader myReader;
- myReader = Cmd.ExecuteReader();
- if(myReader.Read())
- {
- Console.Write(myReader["username"].ToString());
- }
- else
- Console.Write("读取失败");
- myReader.Close();
- }
- catch(SqlException SqlEx)
- {
- }
- finally
- {
- Conn.Close();
- }
精彩图集
精彩文章
热门标签
中文截取
授权
kmp算法
网站程序池
完全退出
Unsupported
线程的运行
SWF动画截图
Objects
全角半角
重复提交
file_get_con
sqlplus
工
MSScriptCont
this函数
enter事件
des加密
DateAdd
in
帐户
Activex组件
point
屏幕密度
其实
Magick
linuxmint
类的大小
出现
js验证IP
$.browser
IE6/IE7/
单缓冲
gzdeflate函
连续日期
xml2array
uncheck
合并成一行
拖动div
php通过socket
20天
mp3下载
超时处理
WinForm
恶意
时钟
reset
镜像
基本数据类
O(N)算法
window.locat
smarty模板
php PHP计算指
明天时间
模拟键
动态生成
判断编
电量
CDATA的作用说明
php 简单的p
赞助商链接
@CopyRight 2002-2008, 1SOHU.COM, Inc. All Rights Reserved QQ:1010969229

