标题:请教:Parameters.Add()是什么哦?
只看楼主
fyz520
Rank: 1
等 级:新手上路
帖 子:120
专家分:1
注 册:2010-1-27
结帖率:95.12%
已结贴  问题点数:5 回复次数:5 
请教:Parameters.Add()是什么哦?
mycmd.Parameters.Add("@name", SqlDbType.VarChar, 20).Value = this.txtname.Text.Trim();

这句话的意思是什么哦?请高手详细解释一下,谢谢了
搜索更多相关主题的帖子: Add Parameters 
2010-07-09 17:57
fyz520
Rank: 1
等 级:新手上路
帖 子:120
专家分:1
注 册:2010-1-27
得分:0 
补充一下代码:
SqlConnection myconn = getconnection();
            myconn.Open();
            Label1.Text = "连接成功";
            string sqlstr = "select * from news where name=@name";
            SqlCommand mycmd = new SqlCommand(sqlstr, myconn);
            mycmd.Parameters.Add("@name", SqlDbType.VarChar, 20).Value = this.txtname.Text.Trim();
            SqlDataAdapter myda = new SqlDataAdapter(mycmd);
            DataSet myds = new DataSet();
            myda.Fill(myds);
2010-07-09 18:48
烟雨袅袅
Rank: 6Rank: 6
来 自:星空雨际
等 级:侠之大者
威 望:1
帖 子:430
专家分:494
注 册:2007-11-26
得分:0 
添加 个@name参数给mycmd,@name参数值为this.txtname.Text.Trim();
这就用法参见 sql 参数化查询
2010-07-09 19:25
烟雨袅袅
Rank: 6Rank: 6
来 自:星空雨际
等 级:侠之大者
威 望:1
帖 子:430
专家分:494
注 册:2007-11-26
得分:5 

http://hi.baidu.com/leilongbing/blog/item/ff1a33229e37764cac34dea6.html
1. 什么是SQL注入
所谓SQL注入,就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。通过递交参数构造巧妙的SQL语句,从而成功获取想要的数据。


2. SQL注入的种类
从具体而言,SQL注入可分为五大类,分别是:数字型注入、字符型注入、搜索型注入(like)、in型的注入、句语连接型注入。从应用来说,要特别注意IP、搜索、批量删除、从数据库转到数据库等地方的SQL注入。


3. 如何防止SQL注入
3.1 SQL注入产生的原因
看下面检查登陆的SQL语句:

SQL代码
SqlCommand cmd = new SqlCommand("SELECT * FROM PE_USERS WHERE UserName = '"
+ UserName + "' AND UserPassword = '" + PassWord + "'", conn);

由于没有对UserName和PassWord进行任何验证,如果UserName=” admin’ OR 1=1--“
所执行的SQL语句就成了:

SQL代码
SELECT * FROM PE_USERS WHERE UserName=’admin’ OR 1=1—‘ AND UserPassword=’’

这就造成了SQL注入,条件永远为真,也就不用密码也能登陆成功。
3.2主要防御方式
防御手段一:参数化查询
保护级别:★★★★★
描述:
使用参数化查询的好处:可以防止sql注入式攻击,提高程序执行效率。
例如:

SQL代码
const string strSql = "SELECT * FROM [PE_Users] WHERE UserName = @UserName";
Parameters parms = new Parameters("@UserName", DbType.String, userName);

中有一个参数@UserName, 使用Prarmeter对象,通过它把参数添加到Command对象上,
这样就获得参数化查询。
14
14 安全开发手册
如上述语句, 会向SQL Server 发送下面的SQL语句:

SQL代码
Exec sp_executesql N ‘select * from [pe_users] where username=@username ‘,N
‘@username nvarchar(20) ‘,@username=N ‘name’

SQL Server 把@username 替换成字符串”name”,然后再执行查询.
假设有下面的输入:

SQL代码
‘ union select @@version,null,null—

生成的SQL语句如下所示:

SQL代码
Exec sp_executesql N ‘select * from [pe_users] where username=@username ‘,N
‘@username nvarchar(20) ‘,@username=N ‘’’ union select @@version,null,null--’

可以看到转义了输入。


.net代码
public SqlParameter Add(string parameterName, SqlDbType sqlDbType, int size);

DbTye或SqlDbType可以是多种数据类型。
可根据你的数据类型来选择。
在某些地方,也可似指定参数的长度:int size。这样也能有效防止数据库溢出和SQL注
入的可能性。
优点:有效地防止了SQL注入的产生。
缺点:有些地方不能应用,如 in 。
应用举例:
动易SiteFactory系统中,对于比较固定的地方,我们采用比较安全的存储过程来
实现。系统中所有SQL语句,能用参数化查询的所有部份都使用了参数化查询。所有操
作数据库的地方,都能在命名空间 PowerEasy.SqlServerDal下找到。
防御手段二:过滤与转换
保护级别:★★★★
15
15 安全开发手册
描述:
对于数据型要强制转换成数字Clng,对于字符型,要通过函数过滤。如:

.net代码
private string SafeSqlLiteral(string inputSQL)
{
return inputSQL.Replace("'", "''");
}

对于搜索的地方LIKE 子句,要注意,如果要使用 LIKE 子句,还必须对通配符字
符进行转义:

.net代码
s = s.Replace("[", "[[]");
s = s.Replace("%", "[%]");
s = s.Replace("_", "[_]");

对于in类型,要转换成规格的数字串或字符串。
要尽量少用语句连接形式写SQL语句,要用到的地方要确保连接语句的安全性,或
在白名单内,或限制很短的长度,以防止SQL语句构造的危险。
优点:有效地防止了SQL注入,实现简单。
缺点:容易遗漏,对于某些地方还是不能过滤,如 order by + 变量
应用举例:
动易SiteFactory系统中,对于不能使用参数化查询的部份,我们使用过滤函数处
理,过滤函数在命名空间PowerEasy.中的DataSecurity类下,如:
FilterBadChar函数。这函数主要用于业务逻辑层的过滤,对于数据库,我们还使用了
强制转换函数,在命名空间 PowerEasy.SqlServerDal 下的 DBHelper 类 ,如:
ToValidId 函数等,主要用于数据库无出错的处理操作。
防御手段三:白名单
保护级别:★★★★
描述:
对于一些已知的参数范围,可用白名单的形式处理,能有交防止SQL注入和查询出
错,如:order by +列名,列名以参数形式传入时,可制定一个白名单,先判断一下参
数是否在白名单内,再进行查询,否则出错处理。
优点:安全可靠
缺点:应用范围小
16
16 安全开发手册
3.3 辅助防御方式
防御手段一:严格过滤
保护级别:★★★☆
描述:
对于不能参数化查询或者无法限制变量类型和范围的情况,使用过滤的手段来处理。
对于数据库中读取的数量要进入查询语句,在不确定数据是否安全的情况下,要对其进入
过滤。这种SQL注入比较隐蔽,所以要特别注意。
优点:能用于不能参数化而又难过滤的地方,如 order by +变量
缺点: 过滤过于严格。
应用举例:
动易SiteFactory系统中,对于不能使用参数化查询的部份,我们使用过滤函数处理,
过滤函数在命名空间PowerEasy.中的DataSecurity类下,如:
FilterBadChar函数。
防御手段二:限定URL传递参数的数据类型和范围
保护级别:★★★
描述:
限定URL的传递参数类型、数量、范围等来防止通过构造URL进行恶意攻击。参见MSDN
杂志
优点:在一定的程序上有效地防止通过URL方式的注入。
缺点:容易遗忘正常需要的参数。
应用举例:
动易SiteFactory系统中,需要在Config\QueryStrings.config配置文件中增加相应的
配置项来控制URL的参数传入,有效控制每个页面的参数数量和参数类型。
防御手段三:全局过滤SQL关键字过滤
保护级别:★★★
描述:
在某些地方进行全局过滤SQL关键字过滤,如对标签的解释。(可能存在过滤不完全和
限制程序开发的问题)
优点:能用于不能参数化而又难过滤的地方,如 table的连接。
17
17 安全开发手册
缺点: 过滤过于严格。
应用举例:
动易SiteFactory系统中,对于不能使用参数化查询的部份,我们使用过滤函数处理,
过滤函数在命名空间PowerEasy.中的DataSecurity类下,如:
FilterSqlKeyword函数,主要应用在标签参数的传入的地方。
 
2010-07-09 19:26
yms123
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:209
帖 子:12488
专家分:19042
注 册:2004-7-17
得分:0 
mycmd.Parameters.Add("@name", SqlDbType.VarChar, 20).Value = this.txtname.Text.Trim();
这是一个存储过程参数,可能是SQL2000的数据库
2010-07-10 17:42
gq198718
Rank: 4
等 级:业余侠客
威 望:1
帖 子:86
专家分:200
注 册:2010-6-6
得分:0 
Parameters.Add()是给数据库字段name 赋值进去吧 这个可以有效的防止SQL语句注入
2010-07-12 09:53



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-312510-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.199980 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved