`
peizhiinfo
  • 浏览: 1429348 次
文章分类
社区版块
存档分类
最新评论

SqlParameter的用法

 
阅读更多

关于Sql注入的基本概念,相信不需多说,大家都清楚,经典的注入语句是' or 1=1--
单引号而截断字符串,“or 1=1”的永真式的出现使得表的一些信息被暴露出来,如果sql语句是select * from 的话,可能你整个表的信息都会被读取到,更严重的是,如果恶意使用都使用drop命令,那么可能你的整个数据库得全线崩溃。

当然,现在重点不是讲sql注入的害处,而是说说如何最大限度的避免注入问题。

sql注入的存在在最大危害,是sql的执行语句没有和控制语句分开,我们想要select一些东西,但用户可能拼出' or 1=1甚至再加上delete/update/drop,后来是属于控制语句了,所以要避免sql的注入,就必须把查询语句与控制语句分开。

SqlParameter给我们提供了一个很好的类,有了它,我们可以不现拼接字符串,也可以不再担心单引号带来的惨剧,因为,这一切会有人来为我们完成的。

简单的给个示例

传统的查询语句的sql可能为
string sql="select * from users where user_id='"+Request.QueryString["uid"]+"'";
很显然,我们在这里拼接了字符串,这就给sql注入留下了可乘之机。

现在,我们要改写这样的语句,使用SqlParameter来做

SqlCommand SqlCmd = new SqlCommand(sql, SqlConn);
SqlParameter _userid = new SqlParameter("uid", SqlDbType.Int);
_userid.Value = Request.QueryString["u_id"];
SqlCmd.Parameters.Add(_userid);

这样,我们可以保证外接参数能被正确的转换,单引号这些危险的字符也会转义了,不会再对库造成威胁。

当然,这仅是一个示例而已,在真实的情况下,可能你还要对 Request.QueryString["u_id"]进行必要的检测与分析,这样才安全

所以,使用参数化的sql语句,是一种很好的做法

Dim sql As StringBuilder = New StringBuilder()
sql.Append("")
sql.Append("SELECT * FROM test")
sql.Append(" WHERE a= @p1 ")

Dim command As SqlCommand = dac.CreateCommand(sql.ToString()) 'dac为自己写的类
Dim param As SqlParameter = New SqlParameter()
param .ParameterName = "@p1"
param .SqlDbType = SqlDbType.NVarChar
param .Value = b 'b为该函数的参数(ByVal b as String)
command .Parameters.Add(param)
Dim reader As SqlDataReader = command.ExecuteReader()

SqlParameter 构造函数

SqlParameter 构造函数 (String, SqlDbType, Int32, ParameterDirection, Byte, Byte, String, DataRowVersion, Boolean, Object, String, String, String)
初始化 SqlParameter 类的一个新实例,该类使用参数名、参数的类型、参数的长度、方向、精度、小数位数、源列名称、DataRowVersion 值之一、用于源列映射的布尔值、SqlParameter 的值、此 XML 实例的架构集合所在的数据库的名称、此 XML 实例的架构集合所在的关系架构以及此参数的架构集合的名称。
命名空间: System.Data.SqlClient
程序集: System.Data(在 system.data.dll 中)

C#
public SqlParameter (
string parameterName,
SqlDbType dbType,
int size,
ParameterDirection direction,
byte precision,
byte scale,
string sourceColumn,
DataRowVersion sourceVersion,
bool sourceColumnNullMapping,
Object value,
string xmlSchemaCollectionDatabase,
string xmlSchemaCollectionOwningSchema,
string xmlSchemaCollectionName
)


参数
parameterName
要映射的参数的名称。

dbType
SqlDbType 值之一。

size
参数的长度。

direction
ParameterDirection 值之一。

precision
要将 Value 解析为的小数点左右两侧的总位数。

scale
要将 Value 解析为的总小数位数。

sourceColumn
源列的名称。

sourceVersion
DataRowVersion 值之一。

sourceColumnNullMapping
如果源列可为空,则为 true;如果不可为空,则为 false。

value
一个 Object,它是 SqlParameter 的值。

xmlSchemaCollectionDatabase
此 XML 实例的架构集合所在的数据库的名称。

xmlSchemaCollectionOwningSchema
包含此 XML 实例的架构集合的关系架构。

xmlSchemaCollectionName
此参数的架构集合的名称。

备注
如果未在 size 和 precision 参数中显式设置 Size 和 Precision,则从 dbType 参数的值推断出它们。

SqlParameter 类
表示 SqlCommand 的参数,也可以是它到 DataSet 列的映射。无法继承此类。

有关此类型所有成员的列表,请参阅 SqlParameter 成员。

System.Object
System.MarshalByRefObject
System.Data.SqlClient.SqlParameter

[Visual Basic]
NotInheritable Public Class SqlParameter
Inherits MarshalByRefObject
Implements IDbDataParameter, IDataParameter, ICloneable
[C#]
public sealed class SqlParameter : MarshalByRefObject,
IDbDataParameter, IDataParameter, ICloneable
[C++]
public __gc __sealed class SqlParameter : public
MarshalByRefObject, IDbDataParameter, IDataParameter, ICloneable
[JScript]
public class SqlParameter extends MarshalByRefObject implements
IDbDataParameter, IDataParameter, ICloneable
线程安全
此类型的所有公共静态(Visual Basic 中为 Shared)成员是线程安全的。但不保证任何实例成员是线程安全的。

备注
参数名称不区分大小写。

示例
[Visual Basic, C#, C++] 下面的示例通过 SqlDataAdapter 中的 SqlParameterCollection 集合创建 SqlParameter 的多个实例。这些参数用于从数据源中选择数据并将数据放在 DataSet 中。此示例假定已经用适当的架构、命令和连接创建了 DataSet 和 SqlDataAdapter。

[Visual Basic]
Public Sub AddSqlParameters()
' ...
' create myDataSet and myDataAdapter
' ...
myDataAdapter.SelectCommand.Parameters.Add("@CategoryName", SqlDbType.VarChar, 80).Value = "toasters"
myDataAdapter.SelectCommand.Parameters.Add("@SerialNum", SqlDbType.Int).Value = 239

myDataAdapter.Fill(myDataSet)
End Sub 'AddSqlParameters

[C#]
public void AddSqlParameters()
{
// ...
// create myDataSet and myDataAdapter
// ...

myDataAdapter.SelectCommand.Parameters.Add("@CategoryName", SqlDbType.VarChar, 80).Value = "toasters";
myDataAdapter.SelectCommand.Parameters.Add("@SerialNum", SqlDbType.Int).Value = 239;
myDataAdapter.Fill(myDataSet);

}

[C++]
public:
void AddSqlParameters()
{
// ...
// create myDataSet and myDataAdapter
// ...

myDataAdapter->SelectCommand->Parameters->Add(S"@CategoryName", SqlDbType::VarChar, 80)->Value = S"toasters";
myDataAdapter->SelectCommand->Parameters->Add(S"@SerialNum", SqlDbType::Int)->Value = __box(239);
myDataAdapter->Fill(myDataSet);

}

[JScript] 没有可用于 JScript 的示例。若要查看 Visual Basic、C# 或 C++ 示例,请单击页左上角的“语言筛选器”按钮 。

要求
命名空间: System.Data.SqlClient

平台: Windows 98, Windows NT 4.0, Windows ME, Windows 2000, Windows XP Home Edition, Windows XP Professional, Windows Server 2003 系列, .NET Framework 精简版

程序集: System.Data (在 System.Data.dll 中)

使用SqlParameter

SqlParameter[] p =
{
SqlHelper.MakeInParam("@EntryID",SqlDbType.Int,4,ev.EntryID),
SqlHelper.MakeInParam("@BlogID",SqlDbType.Int,4,ev.BlogID),
SqlHelper.MakeInParam("@URL",SqlDbType.NVarChar,255,DataHelper.CheckNull(ev.ReferralUrl)),
SqlHelper.MakeInParam("@IsWeb",SqlDbType.Bit,1,ev.PageViewType)
};
SqlHelper.ExecuteNonQuery(conn,CommandType.StoredProcedure,"blog_TrackEntry",p);

答疑:SqlParameter赋值之后怎么添加值
用SqlCommand我知道用add
但我想问的是 SqlParameter
例如
SqlParameter parm = new SqlParameter(PARM_ORDER_ID, SqlDbType.Int);
parm.Value = orderId;
之后能不能再改parm添加一个值
因为我写了个方法是传递SqlParameter类型的参数
但有时要做些判断

SqlParameter parm = new SqlParameter(PARM_ORDER_ID, SqlDbType.Int);
parm.Value = orderId;
if(...)
{
//添加一个参数
}
ExecuteReader(parm,.....);
请问应该怎么做呢
最佳答案 int IArticle.Insert(ArticleInfo article)
{
//如果对象存在
if (article.ID != -1)
return -1;
else
article.ID = TableHelper.GetSequence(SQLHelper.ConnectionString, "Article", "ID");
//统计执行成功的数量
int successCount = 0;
string SQL_THIS = SQL_INSERT_ARTICLE;
SqlParameter[] paras = GetParas();
paras[0].Value = article.ID;
paras[1].Value = article.Title;
paras[2].Value = article.DateAdded;
paras[3].Value = article.Text;
paras[4].Value = article.SourceUrl;
paras[5].Value = article.PostType;
paras[6].Value = article.Author;
paras[7].Value = article.Email;
paras[8].Value = article.SourceName;
paras[9].Value = article.BlogID;
paras[10].Value = article.CategoryID;
paras[11].Value = article.Summary;
paras[12].Value = article.IsBySummary;
paras[13].Value = article.DateUpdated;
paras[14].Value = article.TitleUrl;
paras[15].Value = article.FeedBackCount;
paras[16].Value = article.PostConfig;
paras[17].Value = article.EntryName;
paras[18].Value = article.KeyWord;
SqlConnection conn = new SqlConnection(SQLHelper.ConnectionString);
successCount = SQLHelper.ExecuteNonQuery(conn, CommandType.Text, SQL_THIS, paras);
return successCount;
}
分享到:
评论

相关推荐

    C#SqlParameter参数写法

    C#SqlParameter参数写法C#SqlParameter参数写法C#SqlParameter参数写法C#SqlParameter参数写法C#SqlParameter参数写法C#SqlParameter参数写法

    ADO.NET中命令参数(SqlParameter)使用示例

    ADO.NET中关于命令参数(SqlParameter)使用的一个完整示例,包中包括数据库,可直接运行使用。

    C#中SqlParameter类使用方法小结.doc

    C#中SqlParameter类使用方法小结.doc

    C# 中用 Sqlparameter 的两种用法

    主要介绍了C# 中用 Sqlparameter 的几种用法,文中给大家列举了两种用法,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下

    SqlParameter的简单应用实现[C#]

    防止SQL注入最常用的方法就是用变量SqlParameter,但是初学者可能会以为很难,其实很简单的,此例子是一个简单应用实现[C#],初学者可以看看

    详解C#中SqlParameter的作用与用法

    本篇文章主要介绍了C#中SqlParameter的作用与用法,因为通过SQL语句的方式,有时候存在脚本注入的危险,所以在大多数情况下不建议用拼接SQL语句字符串方式,希望通过SqlParameter实现来实现对数据的操作。

    SQL中in参数化的用法

    SQL中in参数化的用法,用三种方法,详见http://www.cnblogs.com/lzrabbit/archive/2012/04/22/2465313.html#wherein

    C# 中SqlParameter类的使用方法小结.docx

    。。。

    数据库SqlParameter 的插入操作,防止sql注入的实现代码

    今天学习了一下SqlParameter的用法,原来这么写是为了防止sql注入,破坏数据库的。并自己动手连接了数据库。

    .net数据访问类 SQL Helper 类

    此方法将返回一个 SqlParameter 对象数组,这些对象已使用缓存(与传递给该方法的连接字符串和命令文本相对应)中的参数的名称、值、方向和数据类型等进行了初始化。 注意: 用作参数集的键的连接字符串通过简单的...

    sql server 数据库操作类

    使用方法: 例如: StringBuilder strSql = new StringBuilder(); strSql.Append("Select Memo from AddMessage"); strSql.Append(" Where SendTime = @SendTime"); SqlParameter[] parameters = { new Sql...

    SQLHelper.cs

    此方法将返回一个 SqlParameter 对象数组,这些对象已使用缓存(与传递给该方法的连接字符串和命令文本相对应)中的参数的名称、值、方向和数据类型等进行了初始化。 注意: 用作参数集的键的连接字符串通过简单的...

    C#和asp.net中链接数据库中参数的几种传递方法实例代码

     //SqlParameter sp = new SqlParameter(“@Name”, str_Name);  //SqlParameter sp2 = new SqlParameter(“@Pwd”, str_Pwd);  //cmd.Parameters.Add(sp);  //cmd.Parameters.Add(sp2);  #endregion //简单的...

    全面接触SQL语法

    在说明SQL的命令以及使用语法之前,以下将SQL做了的分类,在致上SQL语法所使用到的类型,可以说都已包含在这些类别当中。 <br> 第一类、属性词(Predicates) <br> 在SQL命令中用来指明所要选择的记录的...

    C#图书馆管理信息系统

    new System.Data.SqlClient.SqlParameter("@Original_员工编号", System.Data.SqlDbType.VarChar, 10, System.Data.ParameterDirection.Input, false, ((byte)(0)), ((byte)(0)), "员工编号", System.Data....

    C# 源码 教务管理系统

    this.sqlInsertCommand1.Parameters.Add(new System.Data.SqlClient.SqlParameter("@人数", System.Data.SqlDbType.Decimal, 5, System.Data.ParameterDirection.Input, false, ((System.Byte)(3)), ((System....

Global site tag (gtag.js) - Google Analytics