asp.net里SqlDataAdapter存在Sql注入漏洞
2009-02-04 17:15
369 查看
以前一直以为asp.net调用mssql数据库,只要是调用时用存储过程来操作数据库,是安全的。原来是错误的,asp.net里的SqlDataAdapter里存在sql注入的漏洞。对于asp.net开发人员来说在使用SqlDataAdapter的时候要注意了。下面先介绍下.net操作数据库的这个SqlDataAdapter。
SqlDataAdapter:
用于填充 DataSet 和更新 SQL 数据库的“一组”数据命令和“一个”数据库连接。
SqlDataAdapter不但可以操作多个SQL命令,而且还可以操作一个SQL命令
SqlCommand:
对 SQL 数据库执行的“一个”SQL 语句或存储过程。
SqlCommand只能操作一个SQL命令
问题就出来在SqlDataAdapter可以调用多个SQL命令里。这样如果你给SqlDataAdapter参数的sql语句不做处理的话。别人就可以很方便的使用Sql来注入。
下面看下具体的实例:
asp.net 里test.cs文件的程序:
protected void Page_Load(object sender, EventArgs e)
{
if (Request.QueryString.Count == 1)
{
DbServer dbserver = new DbServer();
System.Data.DataSet ds = new DataSet();
string tablename = "table1";
string strsql = string.Empty;
strsql = " exec dtc_CompeteInfo " + Request.QueryString.Get(0);
dbserver.FillDataset(strsql, ds, tablename);
//下面省略处理
----
----
}
}
DbServer 类里的FillDataset函数为:
// 根据SQL查询并用记录集填充DataSet
public void FillDataset(string sql, DataSet ds, string tablename)
{
SqlConnection conn = new SqlConnection(CONNECTIONSTR);
SqlDataAdapter da = new SqlDataAdapter(sql, conn);
da.Fill(ds, tablename);
da.Dispose();
conn.Close();
conn.Dispose();
da = null;
conn = null;
}
上面的程序,如果正常的执行http://www.xxx.com/test.aspx?id=100 。
程序最后执行:SqlDataAdapter da = new SqlDataAdapter('exec dtc_CompeteInfo 100', conn);
dtc_CompeteInfo为一个存储过程,100为给这个存储过程的传递的参数值。程序正常执行。
但是当你构造这样一个地址http://www.xxx.com/test.aspx?id=100;update t_table set t_a='admin' 传递的时候。我们分析下会出现怎么样的情况呢?由于SqlDataAdapter能执行一组SQL命令。这样程序实际上变成strsql=" exec dtc_CompeteInfo 100;update t_table set t_a='admin'。然后在SqlDataAdapter执行exec dtc_CompeteInfo 100和update t_table set t_a='admin'二个sql语句了。从而到达了注入的目的。想想如果网站连接数据库的帐号是sa的话。可以做什么呢?什么都可以做。增加新用户,取得最高权限。这台电脑就完全控制了。
SqlDataAdapter:
用于填充 DataSet 和更新 SQL 数据库的“一组”数据命令和“一个”数据库连接。
SqlDataAdapter不但可以操作多个SQL命令,而且还可以操作一个SQL命令
SqlCommand:
对 SQL 数据库执行的“一个”SQL 语句或存储过程。
SqlCommand只能操作一个SQL命令
问题就出来在SqlDataAdapter可以调用多个SQL命令里。这样如果你给SqlDataAdapter参数的sql语句不做处理的话。别人就可以很方便的使用Sql来注入。
下面看下具体的实例:
asp.net 里test.cs文件的程序:
protected void Page_Load(object sender, EventArgs e)
{
if (Request.QueryString.Count == 1)
{
DbServer dbserver = new DbServer();
System.Data.DataSet ds = new DataSet();
string tablename = "table1";
string strsql = string.Empty;
strsql = " exec dtc_CompeteInfo " + Request.QueryString.Get(0);
dbserver.FillDataset(strsql, ds, tablename);
//下面省略处理
----
----
}
}
DbServer 类里的FillDataset函数为:
// 根据SQL查询并用记录集填充DataSet
public void FillDataset(string sql, DataSet ds, string tablename)
{
SqlConnection conn = new SqlConnection(CONNECTIONSTR);
SqlDataAdapter da = new SqlDataAdapter(sql, conn);
da.Fill(ds, tablename);
da.Dispose();
conn.Close();
conn.Dispose();
da = null;
conn = null;
}
上面的程序,如果正常的执行http://www.xxx.com/test.aspx?id=100 。
程序最后执行:SqlDataAdapter da = new SqlDataAdapter('exec dtc_CompeteInfo 100', conn);
dtc_CompeteInfo为一个存储过程,100为给这个存储过程的传递的参数值。程序正常执行。
但是当你构造这样一个地址http://www.xxx.com/test.aspx?id=100;update t_table set t_a='admin' 传递的时候。我们分析下会出现怎么样的情况呢?由于SqlDataAdapter能执行一组SQL命令。这样程序实际上变成strsql=" exec dtc_CompeteInfo 100;update t_table set t_a='admin'。然后在SqlDataAdapter执行exec dtc_CompeteInfo 100和update t_table set t_a='admin'二个sql语句了。从而到达了注入的目的。想想如果网站连接数据库的帐号是sa的话。可以做什么呢?什么都可以做。增加新用户,取得最高权限。这台电脑就完全控制了。
相关文章推荐
- asp.net中SqlDataReader获取数据存在的问题解决方法
- 在asp.net中使用sql server存储过程 (包括SqlDataAdapter调用存储过程)
- ADO.NET—Asp.net 用DataSet对象更新数据(SqlDataAdapter)
- Asp.net中SqlDataAdapter和SqlCommand对比分析
- asp.net SqlDataAdapter对象使用札记
- Asp.net中SqlDataAdapter和SqlCommand对比分析
- ADO.NET—Asp.net 用DataSet对象更新数据(SqlDataAdapter)
- Asp.net中SqlDataAdapter和SqlCommand对比分析(二)
- asp.net SqlDataAdapter对象使用札记
- Asp.net中SqlDataAdapter和SqlCommand对比分析
- Asp.net 用DataSet对象更新数据(SqlDataAdapter) DataTable加主键
- asp.net SqlDataAdapter Update
- Asp.net 用DataSet对象更新数据(SqlDataAdapter)
- ASP.net中SqlDataAdapter和SqlCommand对比分析
- 在asp.net中使用sql server存储过程 (包括SqlDataAdapter调用存储过程)
- ADO.NET ASP.NET 将 SQLDatareader 转换成 List
- ADO.NET基础必备之SqlDataAdapter 类
- Asp.Net Forums 2.0 SqlDataProvider Model
- Using ROW_NUMBER() to paginate your data with SQL Server 2005 and ASP.NET
- 20130620-异常详细信息: System.Data.SqlClient.SqlException: 用户 'PC-LIXIANG\ASPNET' 登录失败。