3

我想参数化我的存储过程的输入以防止 sql 注入。问题是我的数据库没有应用程序(它只是用于学校)并且由于没有像 C# 等这样的客户端语言,我必须用 sql 本身来做。我做了这个

ALTER procedure [dbo].[drop_tt]
@ss varchar(40)
as
EXEC sp_executesql N'SELECT *
FROM    tt
whERE   ss = @Ss', N'@ss varchar(40)', @ss

但是当我执行这个语句时,tt表被删除了:( exec drop_tt 'www';drop table tt--'

有人可以帮忙吗?

4

1 回答 1

1

简而言之:你为什么要改变 sp?您只需要创建一个参数化的存储过程,例如:

CREATE PROCEDURE uspGetAddress @City nvarchar(30)
AS
SELECT * 
FROM AdventureWorks.Person.Address
WHERE City = @City
GO

看看这个非常简单的教程,你不需要改变你的程序。

编辑:我的方法是去掉以 .EXEC sp_executesql开头的语句和命名drop。只需尝试在正文中简化您的存储过程执行语句。

于 2012-12-14T12:35:53.933 回答