Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用sql server参数化输入?_Sql_Sql Server_Parameters_Sql Injection - Fatal编程技术网

使用sql server参数化输入?

使用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

我想参数化存储过程的输入,以防止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-'

有人能帮忙吗?

简而言之:你为什么要改变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命令无论如何都会运行