当前位置:首页 » 编程语言 » sql参数化插入
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

sql参数化插入

发布时间: 2022-08-21 10:37:41

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语句或例程如存储过程或函数发送多行数据。