关于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().Value = "toasters"
myDataAdapter.SelectCommand.Parameters.Add(
myDataAdapter.Fill(myDataSet)
End Sub 'AddSqlParameters

[C#]

public void AddSqlParameters()
{
// ...
// create myDataSet and myDataAdapter
// ...
myDataAdapter.SelectCommand.Parameters.Add().Value = "toasters";
myDataAdapter.SelectCommand.Parameters.Add(;
myDataAdapter.Fill(myDataSet);
}

[C++]

public:
void AddSqlParameters()
{
// ...
// create myDataSet and myDataAdapter
// ...
myDataAdapter->SelectCommand->Parameters->Add(S)->Value = S"toasters";
myDataAdapter->SelectCommand->Parameters->Add(S);
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(,ev.EntryID),
SqlHelper.MakeInParam(,ev.BlogID),
SqlHelper.MakeInParam(,DataHelper.CheckNull(ev.ReferralUrl)),
SqlHelper.MakeInParam(,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)
{
//如果对象存在
)
;
else
article.ID = TableHelper.GetSequence(SQLHelper.ConnectionString, "Article", "ID");
//统计执行成功的数量
;
string SQL_THIS = SQL_INSERT_ARTICLE;
SqlParameter[] paras = GetParas();
paras[].Value = article.ID;
paras[].Value = article.Title;
paras[].Value = article.DateAdded;
paras[].Value = article.Text;
paras[].Value = article.SourceUrl;
paras[].Value = article.PostType;
paras[].Value = article.Author;
paras[].Value = article.Email;
paras[].Value = article.SourceName;
paras[].Value = article.BlogID;
paras[].Value = article.CategoryID;
paras[].Value = article.Summary;
paras[].Value = article.IsBySummary;
paras[].Value = article.DateUpdated;
paras[].Value = article.TitleUrl;
paras[].Value = article.FeedBackCount;
paras[].Value = article.PostConfig;
paras[].Value = article.EntryName;
paras[].Value = article.KeyWord;
SqlConnection conn = new SqlConnection(SQLHelper.ConnectionString);
successCount = SQLHelper.ExecuteNonQuery(conn, CommandType.Text, SQL_THIS, paras);
return successCount;
}

原文出自:http://www.cnblogs.com/angelfeather/articles/1225902.html

SqlParameter的用法和好处的更多相关文章

  1. CozyRSS开发记录2-酷炫的皮肤库

    CozyRSS开发记录2-酷炫的皮肤库 1.MaterialDesignToolkit 最开始微软推出Metro设计风格的时候,有人喜欢有人喷.紧接着,Ios也开始做扁平化的UI,这时候,扁平化已成为 ...

  2. Python之路----文件操作

    文件操作 1.能调用方法的一定是对象,比如数值.字符串.列表.元组.字典,甚至文件也是对象,Python中一切皆为对象. str1 = 'hello' str2 = 'world' str3 = ' ...

  3. 【转】 iOS KVO KVC

    原文: http://www.cocoachina.com/industry/20140224/7866.html Key Value Coding Key Value Coding是cocoa的一个 ...

  4. JAVA泛型那些事儿

    本篇内容源于本人一个好友sgpro提供的java学习例子,现拿出来给大家分享. 此例子非常直观的通过代码讲解了java泛型的用法和好处,是笔者一直珍藏的最好的泛型学习笔记. 一.面向过程的时代 我们先 ...

  5. iOS KVC setValuesForKeysWithDictionary的使用

    Key Value Coding Key Value Coding是cocoa的一个标准组成部分,它能让我们可以通过name(key)的方式访问property, 不必调用明确的property ac ...

  6. “理了么”软件特点NABCD个人分析

    在这里我就主要对此软件的‘A’(做法)和‘B’(好处)两方面进行分析. “A”:我们的软件为顾客和商家分别提供一种账户,分别登陆后会显示不同的界面. 1.用户界面:拥有“理发店”.“订单“.”和“我的 ...

  7. ES6箭头函数Arrow Function

    果然,隔了很长时间都没有来博客园上逛了...... 前一段时间一直在忙我们参加的一个比赛,转眼已经好久没有来逛过博客园了,果然还是很难坚持的...... 今天总算还是想起来要过来冒个泡,强行刷一波存在 ...

  8. 强类型Dataset使用事务(改进原有方法)

    以下部份转自:http://blog.csdn.net/nfbing/article/details/5803980 关于强类型Dataset的用法和好处,我就不再多说,网上关于这方面的资料很多 , ...

  9. LCD驱动应该怎么写?–基于stm32F407 [复制链接]

    够用的硬件能用的代码使用的教程 (拷贝过来的代码有点乱,请下载附件查看文档) 资料下载地址:https://pan.baidu.com/s/1bHUVe6X6tymktUHk_z91cA 网络上配套S ...

随机推荐

  1. AOP举例子

    切面类TestAspect package com.spring.aop; /** * 切面 * */ public class TestAspect { public void doAfter(Jo ...

  2. CBO学习笔记(转)

    Query Transformation 在继续研究SQL的其他操作(比如Join)对CBO的影响之前,我们来讨论一下Oracle优化器的Query Transformation特性.我们都习惯于根据 ...

  3. Linux下Socket编程的端口问题( Bind error: Address already in use )

    Linux下Socket编程的端口问题( Bind error: Address already in use ) 在进行linux网络编程时,每次修改了源代码并再次编译运行时,常遇到下面的地使用错误 ...

  4. C++ primer读书笔记 chapter3 标准库类型

    除第二章介绍的是C++的基本类型,本章将大致介绍一下C++定义的内容丰富的抽象数据库类型标准库.着重介绍一下sting.vector和bitset. 3.2标准库string类型 1.string类型 ...

  5. bzoj1221

    网络流与线性规划24题中的餐巾计划吧明显要拆点吧,把每一天拆成2个点,i,i+n起点   终点    容量    费用 s      i      inf      c    每天都可以购买新毛巾 i ...

  6. Java---对象与类的封装

    一.类和对象: package cn.hncu.Myclasslearn; /** * * @author hncu_chx * * Mylove amin */ /**类是一种数据类型,声明一个类就 ...

  7. Entity Framwork db First 中 Model验证解决办法。

    由于项目中用到 Entity Framwork db First     每次从数据库生成数据模型之后都会把模型更新. 只要有一个表更新.所有的类都会重新生成. 在网上找了各种例子都是差不多的, 可能 ...

  8. [Locked] Alien Dictionary

    Alien Dictionary There is a new alien language which uses the latin alphabet. However, the order amo ...

  9. POJ 3050 穷举

    题意:给定一个5*5的地图,每个格子上有一个数字.从一个格子出发(上下左右4个方向),走5步将数字连起来可以构造出一个6位数.问该地图可以构造出多少个不同的6位数. 分析:可以对每个格子做深度优先遍历 ...

  10. hdu 2795 线段树

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2795 #include <cstdio> #include <cmath> # ...