gpt4 book ai didi

c# - 什么是将参数传递给 SQL,为什么我需要它?

转载 作者:可可西里 更新时间:2023-11-01 08:02:31 24 4
gpt4 key购买 nike

这里是初学者:

在此answer对于我如何将数据插入 SQL Server 的问题,他提到了传递参数而不是像我现在这样的字符串连接。

这真的是安全所必需的吗?如果是这样,传递参数到底是什么?当我用谷歌搜索时,我得到了很多关于存储过程的信息。那是我想要的吗,我还不知道存储过程……。

如果您能指出正确的方向,我将不胜感激。

谢谢。

编辑:

好的,这就是我得到的。它似乎正确地更新了数据库,最终我会将硬编码的整数更改为来自标签的输入。请确认我这样做的方式是否不易受到任何 sql 注入(inject)或黑客攻击。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.Security;

using System.Data;
using System.Data.Sql;
using System.Data.SqlClient;



public partial class Stats : System.Web.UI.Page
{

public SqlDataReader DataReader;
public SqlCommand Command;
string queryString = ("INSERT INTO UserData (UserProfileID, ConfidenceLevel, LoveLevel, HappinessLevel) VALUES (@UID, @CL, @LL, @HL);");
//string queryString = ("INSERT INTO UserData (UserProfileID, ConfidenceLevel, LoveLevel, HappinessLevel) VALUES ('a051fc1b-4f51-485b-a07d-0f378528974e', 2, 2, 2);");

protected void Page_Load(object sender, EventArgs e)
{
LabelUserID.Text = Membership.GetUser().ProviderUserKey.ToString();

}

protected void Button1_Click(object sender, EventArgs e)
{

//connect to database
MySqlConnection database = new MySqlConnection();
database.CreateConn();

//create command object
Command = new SqlCommand(queryString, database.Connection);

//add parameters. used to prevent sql injection
Command.Parameters.Add("@UID", SqlDbType.UniqueIdentifier);
Command.Parameters["@UID"].Value = Membership.GetUser().ProviderUserKey;

Command.Parameters.Add("@CL", SqlDbType.Int);
Command.Parameters["@CL"].Value = 9;

Command.Parameters.Add("@LL", SqlDbType.Int);
Command.Parameters["@LL"].Value = 9;

Command.Parameters.Add("@HL", SqlDbType.Int);
Command.Parameters["@HL"].Value = 9;

Command.ExecuteNonQuery();


}

}

最佳答案

将参数传递给 SQL 使您不必构建动态 SQL 字符串。

构建动态 SQL 语句存在巨大的安全风险,因为人们可以将他们自己的 SQL 代码注入(inject)您的应用程序,可能会对您的数据执行不需要的命令。

有一些可能的 SQL 注入(inject)攻击的好示例:

SQL Injection Attacks by Example

有两种方法可以将参数传递给 SQL 语句。一种是像您提到的那样使用存储过程。另一种是使用参数化查询(这实际上是我更喜欢的)。

参数化查询在 .NET 中实际上非常简单:

using(SqlConnection conn = new SqlConnection(connString))
{
SqlCommand command =
new SqlCommand("SELECT * FROM Users WHERE Username = @Username", conn);

command.Parameters.Add(new SqlParameter("@Username", "Justin Niessner"));

SqlDataAdapter adapter = new SqlDataAdapter(command);
DataTable dt = new DataTable();

adapter.Fill(dt);
}

在那个例子中,参数是@Username,我们使用SqlCommand对象的Parameters集合来传入值。

关于c# - 什么是将参数传递给 SQL,为什么我需要它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3216233/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com