Ⅰ sql为什么要参数化,怎么参数化
一、最主要是: 数据库 机制问题,参数化 可以加快 执行效率,数据库有个缓存区,可以缓存 非参数部分的语句(或者说 下次执行不用数据库再次 解析语句),而不用参数,每次数据库 都需要解析 语句
二、次要是:防止,sql语句特殊字,注入:减少,字符转义等
三、清晰 便于理解
Ⅱ C#对MYsql批量添加参数化:如图 怎么实现参数化
///<summary>
///用于新增记录的SQL语句
///</summary>
privateconstStringINSERT_SQL=
@"
INSERTINTOsale_report(
sale_date,sale_item,sale_money
)VALUES(
?sale_date,?sale_item,?sale_money
)";
///<summary>
///插入数据.
///</summary>
///<paramname="conn"></param>
privatevoidInsertData(MySqlConnectionconn)
{
//创建一个Command.
MySqlCommandinsertCommand=conn.CreateCommand();
//定义需要执行的SQL语句.
insertCommand.CommandText=INSERT_SQL;
//定义要查询的参数.
insertCommand.Parameters.Add(newMySqlParameter("?sale_date",TEST_SALE_DATE));
insertCommand.Parameters.Add(newMySqlParameter("?sale_item",TEST_SALE_ITEM));
insertCommand.Parameters.Add(newMySqlParameter("?sale_money",100000));
//ExecuteNonQuery方法,表明本次操作,不是一个查询的操作。将没有结果集合返回.
//返回的数据,将是被影响的记录数.
intinsertRowCount=insertCommand.ExecuteNonQuery();
Console.WriteLine("尝试插入数据,结果造成了{0}条记录的插入。",insertRowCount);
}
Ⅲ 执行sql语句时参数化,有什么好处
防注入。
比如你登录的语句写成:
string sql="select uid from login where uid='"+uid+"' and pwd='"+pwd+"'";
那只需要把密码写成'or'0'='0就可以登录了
Ⅳ 给mssql 数据库里 插入 数据问题!拜托了各位 谢谢
哎,。参数化就行了。。 SqlConnection scon = new SqlConnection("你的数据库链接"); scon.Open(); //打开数据库链接 SqlParameter[] sqlparameter = { new SqlParameter("@id",txtuserid.Text.ToString().Trim()) //这里是参数化,txtuserid.Text.ToString().Trim()为用户输入的用户名即id }; SqlCommand ocom = new SqlCommand("select * from [users] where id=@id", scon); ocom.Parameters.AddRange(sqlparameter); SqlDataAdapter sqlDataAdapter = new SqlDataAdapter(); sqlDataAdapter.SelectCommand = ocom; DataSet dataSet = new DataSet(); sqlDataAdapter.Fill(dataSet); if (dataSet.Tables[0].Rows.Count > 0) { //txtanswer.Text 为TextBox控件,由用户输入答案。 if (txtanswer.Text.ToString().Trim() == dataSet.Tables[0].Rows[0]["answer "].ToString()) { SqlConnection scon = new SqlConnection("你的数据库链接"); scon.Open(); //打开数据库链接 SqlParameter[] sqlparameter = { new SqlParameter("@passwd",txtuserid.Text.ToString().Trim()), //这里是参数化,txtnewpasswd.Text.ToString().Trim()为用户输入的新密码 new SqlParameter("@id",dataSet.Tables[0].Rows[0]["id"].ToString()) }; SqlCommand ocom = new SqlCommand("update [users] set passwd=@passwd where id=@id", scon); //更新语句 ocom.Parameters.AddRange(sqlparameter); ocom.ExecuteNonQuery(); ocon.Close(); } else { //回答错误 } } else { //没有这个用户ID哦,你确定你注册了? } scon.Close(); 呵呵,。刚刚回答别人一个问题,。里面刚好有可疑回答你的。参数化后,不管你添加的内容有什么字符,都可以添加成功,参数化也可以防止注入式攻击的,建议以后,每个有让用户输入数据的都要进行参数化,这样会安全点。
Ⅳ sql怎么使用参数化
采用sp_executesql 系统存储过程,执行sql语句,就能传入参数,
这就是sql参数化sql脚本参数化
你可以根据上面的例子,将sql脚本中定义参数,然后后面赋值参数变量,
在查询分析器中执行,你就可以知道sql参数化的具体实现和概念了。
如有疑问,请及时沟通!
请采纳!
Ⅵ 参数化之后还是有sql注入,求教
首先:我们要了解SQL收到一个指令后所做的事情:
具体细节可以查看文章:Sql Server 编译、重编译与执行计划重用原理
在这里,我简单的表示为: 收到指令 -> 编译SQL生成执行计划 ->选择执行计划 ->执行执行计划。
具体可能有点不一样,但大致的步骤如上所示。
接着我们来分析为什么拼接SQL 字符串会导致SQL注入的风险呢?
首先创建一张表Users:
CREATE TABLE [dbo].[Users](
[Id] [uniqueidentifier] NOT NULL,
[UserId] [int] NOT NULL,
[UserName] [varchar](50) NULL,
[Password] [varchar](50) NOT NULL,
CONSTRAINT [PK_Users] PRIMARY KEY CLUSTERED
(
[Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
插入一些数据:
INSERT INTO [Test].[dbo].[Users]([Id],[UserId],[UserName],[Password])VALUES (NEWID(),1,'name1','pwd1');
INSERT INTO [Test].[dbo].[Users]([Id],[UserId],[UserName],[Password])VALUES (NEWID(),2,'name2','pwd2');
INSERT INTO [Test].[dbo].[Users]([Id],[UserId],[UserName],[Password])VALUES (NEWID(),3,'name3','pwd3');
INSERT INTO [Test].[dbo].[Users]([Id],[UserId],[UserName],[Password])VALUES (NEWID(),4,'name4','pwd4');
INSERT INTO [Test].[dbo].[Users]([Id],[UserId],[UserName],[Password])VALUES (NEWID(),5,'name5','pwd5');
假设我们有个用户登录的页面,代码如下:
验证用户登录的sql 如下:
select COUNT(*) from Users where Password = 'a' and UserName = 'b'
这段代码返回Password 和UserName都匹配的用户数量,如果大于1的话,那么就代表用户存在。
本文不讨论SQL 中的密码策略,也不讨论代码规范,主要是讲为什么能够防止SQL注入,请一些同学不要纠结与某些代码,或者和SQL注入无关的主题。
可以看到执行结果:
这个是SQL profile 跟踪的SQL 语句。
注入的代码如下:
select COUNT(*) from Users where Password = 'a' and UserName = 'b' or 1=1—'
这里有人将UserName设置为了 “b' or 1=1 –”.
实际执行的SQL就变成了如下:
可以很明显的看到SQL注入成功了。
很多人都知道参数化查询可以避免上面出现的注入问题,比如下面的代码:
class Program
{
private static string connectionString = "Data Source=.;Initial Catalog=Test;Integrated Security=True";
static void Main(string[] args)
{
Login("b", "a");
Login("b' or 1=1--", "a");
}
private static void Login(string userName, string password)
{
using (SqlConnection conn = new SqlConnection(connectionString))
{
conn.Open();
SqlCommand comm = new SqlCommand();
comm.Connection = conn;
//为每一条数据添加一个参数
comm.CommandText = "select COUNT(*) from Users where Password = @Password and UserName = @UserName";
comm.Parameters.AddRange(
new SqlParameter[]{
new SqlParameter("@Password", SqlDbType.VarChar) { Value = password},
new SqlParameter("@UserName", SqlDbType.VarChar) { Value = userName},
});
comm.ExecuteNonQuery();
}
}
}
实际执行的SQL 如下所示:
exec sp_executesql N'select COUNT(*) from Users where Password = @Password and UserName = @UserName',N'@Password varchar(1),@UserName varchar(1)',@Password='a',@UserName='b'
exec sp_executesql N'select COUNT(*) from Users where Password = @Password and UserName = @UserName',N'@Password varchar(1),@UserName varchar(11)',@Password='a',@UserName='b'' or 1=1—'
可以看到参数化查询主要做了这些事情:
1:参数过滤,可以看到 @UserName='b'' or 1=1—'
2:执行计划重用
因为执行计划被重用,所以可以防止SQL注入。
首先分析SQL注入的本质,
用户写了一段SQL 用来表示查找密码是a的,用户名是b的所有用户的数量。
通过注入SQL,这段SQL现在表示的含义是查找(密码是a的,并且用户名是b的,) 或者1=1 的所有用户的数量。
可以看到SQL的语意发生了改变,为什么发生了改变呢?,因为没有重用以前的执行计划,因为对注入后的SQL语句重新进行了编译,因为重新执行了语法解析。所以要保证SQL语义不变,即我想要表达SQL就是我想表达的意思,不是别的注入后的意思,就应该重用执行计划。
如果不能够重用执行计划,那么就有SQL注入的风险,因为SQL的语意有可能会变化,所表达的查询就可能变化。
在SQL Server 中查询执行计划可以使用下面的脚本:
DBCC FreeProccache
select total_elapsed_time / execution_count 平均时间,total_logical_reads/execution_count 逻辑读,
usecounts 重用次数,SUBSTRING(d.text, (statement_start_offset/2) + 1,
((CASE statement_end_offset
WHEN -1 THEN DATALENGTH(text)
ELSE statement_end_offset END
- statement_start_offset)/2) + 1) 语句执行 from sys.dm_exec_cached_plans a
cross apply sys.dm_exec_query_plan(a.plan_handle) c
,sys.dm_exec_query_stats b
cross apply sys.dm_exec_sql_text(b.sql_handle) d
--where a.plan_handle=b.plan_handle and total_logical_reads/execution_count>4000
ORDER BY total_elapsed_time / execution_count DESC;
Ⅶ C#连接access数据库,如何向一个表中参数化插入操作
先给你一个方法,你可以让到相应的地方
public bool ExecuteSql(string SqlString,params OleDbParameter[] parameters)
{
bool result = false;
OleConnection conn = new OleConnection("连接字符串")
OleDbCommand cmd = new OleDbCommand(SqlString, conn);
cmd.CommandType = CommandType.Text;
if(parameters!=null)
{
foreach(OleDbParameter p in parameters)
{
if((p.Direction== ParameterDirection.Output)&&p.Value==null) p.Value = DBNull.Value;
cmd.Parameters.Add(p);
}
}
try
{
conn.Open();
cmd.ExecuteNonQuery();
result = true;
}
catch
{
}
finally
{
conn.Close();
}
return result;
}
调用时:
string sql = "insert into tablename(name,sex,brithday,address,zip) values(@name,@sex,@brithday,@address,@zip)";
OleDbParameter[] parameters = new OleDbParameter[]{
new OleDbParameter("@name",namevalue),
new OleDbParameter("@sex",sexvalue),
new OleDbParameter("@brithday",brithdayvalue),
new OleDbParameter("@address",addressvalue),
new OleDbParameter("@zip",zipvalue)
};
bool flag = ExecuteSql(sql,parameters);
运行成功会返回真,否则为假,上面的值我没有写具体的,你自己写就行了
Ⅷ 参数化sql的SQL语句中,往oracle库中插入序列.nextval,参数该付什么类型的值
1.nextval与序列关联,表示下一个,如:
创建里一个序列seq_1:#序列一般表示第几行,起标识作用
create sequence seq_1 increment by 1 start with 1
在表中使用此序列:
INSERT INTO A VALUES (seq_1.nextval, 'LEWIS', 'CLERK',7902, SYSDATE, 1200, NULL, 20);
2.values与insert 连用,标示插入的字段值,如:
有一个表 A,A有三个字段:name,age,sex,都是archar2类型的,则往表中插入数据语句为:
insert into A values ('name','age','woman')
Ⅸ ASP.NET C# SQL参数化
代码没有,倒是可以给你三个建议:
1、使用存储过程,这样就参数化了,可以防止sql语句的非法注入
2、写一个函数,把插入语句的sql中的 ' 字符替换为空:
public static string Filtered(string str)
{
str = str.Replace("'", "");
str = str.Replace("@", "");
str = str.Replace("=", "");
str = str.Replace("!", "");
str = str.Replace(" ", "");
str = str.Replace(".", "");
str = str.Replace("[", "");
str = str.Replace("\\", "");
return str;
}
3.登录的时候将文本框内的内容加密输入数据库。。。
Ⅹ 怎么在sql数据插入大连数据
有三种批量插入数据的方法。
第一种方法是使用循环语句逐个将数据项插入到数据库中。第二种方法使用的是SqlBulkCopy,使您可以用其他源的数据有效批量加载SQLServer表。第三种使用的方法是sqlserver中的表值参数方法。
表值参数是SQLServer2008中的新参数类型。表值参数是使用用户定义的表类型来声明的。使用表值参数,可以不必创建临时表或许多参数,即可向TransactSQL语句或例程如存储过程或函数发送多行数据。