使用sql server参数化输入?
我想参数化存储过程的输入,以防止sql注入。问题是我的数据库没有应用程序,它只是供学校使用的&因为没有C等客户机语言,我只能用sql本身来实现。是我干的使用sql server参数化输入?,sql,sql-server,parameters,sql-injection,Sql,Sql Server,Parameters,Sql Injection,我想参数化存储过程的输入,以防止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表被删除: 行政长官在“www”上发言;升降台tt
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表被删除:
行政长官在“www”上发言;升降台tt-' 有人能帮忙吗?简而言之:你为什么要改变sp?您只需要创建一个参数化存储过程,如:
CREATE PROCEDURE uspGetAddress @City nvarchar(30)
AS
SELECT *
FROM AdventureWorks.Person.Address
WHERE City = @City
GO
看看这个,你不需要改变你的程序
编辑:我的方法是去掉EXEC sp_executesql语句和以drop开头的命名。尽量简化正文中的存储过程执行语句。如果没有任何UI,sql注入是如何发生的?我应该自己做。这是给我的学校的。这就是为什么没有申请。但是我应该自己写一个声明,作为一个用户,尝试注入一些指令,比如exec drop_tt'www';drop table tt-'exec drop_tt'www';drop table tt-'-这不是真正的注入,如果在SQL窗口中运行,您已经在SSM中发出了两个命令,用分号分隔。存储过程甚至不应该意外执行drop命令,但是SSMS将自己执行第二条语句。进行一些调试,你应该能够确认这一点;升降台tt;是两个独立的命令。如果我写:exec drop_tt@ss='www'也是一样的;从tt中选择*;谢谢你的回答。但如果我这样写。当我使用上面的语句时,它会掉到我的桌子上。我认为我应该将输入转换为没有执行能力的字符串&这就是为什么我们将其参数化。但通过这种方式,我注入的drop命令无论如何都会运行