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();
- }
精彩图集
精彩文章
热门标签
str1
初始化失败
预览图片
DML
bak
菜单导航
Protobuf
读
php 完全
Internal
按钮的值
输出到EXCEL
DatabaseObje
安全狗
系统认证
appcmd
监控磁盘
sorted
tar
ftp下载文件
user模型
域名查询
斜杠
Unavailable
dword
数组比较
graph
锁定
pickle
截取域名
UTF-
CPU数目
ceil
星期函数
体系结构
utf8_gen
CWnd
css
添
Linux文件目录
读取和
shtml
dict
工具类
(2)
Liunx
bom
随机查询
构造
转列
ostringstrea
重复行
不一致
转义字符
事件调度器
服
表结构修改
加载中
Replica
to_date
赞助商链接
@CopyRight 2002-2008, 1SOHU.COM, Inc. All Rights Reserved QQ:1010969229

