【发布时间】:2021-08-26 17:16:21
【问题描述】:
我正在尝试为我的删除方法编写一个存储过程。它适用于我创建的字符串查询,但我正在努力使其更安全。这是我在更改之前所拥有的。
存储过程之前 控制器
[HttpDelete]
public JsonResult Delete(int ID)
{
string query = @"DELETE FROM dbo.WeatherForecast WHERE ID =" + ID;
DataTable table = new DataTable();
string sqlDataSource = _configuration.GetConnectionString("WeatherAppCon");
SqlDataReader myReader;
using (SqlConnection myCon = new SqlConnection(sqlDataSource))
{
myCon.Open();
using (System.Data.SqlClient.SqlCommand myCommand = new SqlCommand(query, myCon))
{
myReader = myCommand.ExecuteReader();
table.Load(myReader);
myReader.Close();
myCon.Close();
}
}
return new JsonResult("Row Deleted Successfully");
}
存储过程之后 控制器
[HttpDelete]
public JsonResult Delete(int ID)
{
string query = "dbo.p_WeatherForecastDelete";
DataTable table = new DataTable();
string sqlDataSource = _configuration.GetConnectionString("WeatherAppCon");
SqlDataReader myReader;
using (SqlConnection myCon = new SqlConnection(sqlDataSource))
{
myCon.Open();
using (System.Data.SqlClient.SqlCommand myCommand = new SqlCommand(query, myCon))
{
myReader = myCommand.ExecuteReader();
table.Load(myReader);
myReader.Close();
myCon.Close();
}
}
return new JsonResult("Row Deleted Successfully");
}
SQL 存储过程(不起作用)
USE [WeatherTemplate]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[p_WeatherForecastDelete]
AS
BEGIN
DELETE FROM dbo.WeatherForecast WHERE ID = + ID;
END
【问题讨论】:
-
为什么使用存储过程只是为了删除一条记录?您希望通过这样做获得什么优势?
-
这仅用于学习目的。
-
你在学什么?您应该注意,您的第一个代码示例容易受到 SQL 注入攻击,因为您没有正确参数化查询。调用 SQL 时要避免字符串连接。你应该了解Little Bobby Tables。对于您的存储过程,您尚未声明要传入 ID 的变量。了解parameters in T-SQL procs。
-
是的,这就是我想要使用存储过程的原因。我只是不确定如何正确地做到这一点。我展示了第一个例子来展示我事先在做什么。
-
您想使用存储过程来确保安全?那是没有意义的。您可以使用正确参数化的查询同样安全。查看我发送给您的 Little Bobby Tables 的链接。单击左侧的 C#,然后单击 ADO.NET 页面。你会在那里看到很多关于如何正确参数化它的信息。对此的存储过程完全是浪费。
标签: asp.net stored-procedures http-delete