安全地使用动态sql

时间:2014-08-05 13:53:25

标签: sql sql-server stored-procedures sql-injection

在测试以下代码时,我一直没有得到任何结果。但我的架构师告诉我,我需要编写它以避免所有SQL注入攻击。我看不出我错过了什么。最初尝试获取列的类型,然后在ParameterDefinition字段中使用它。

基本上我所做的是获取数据库,然后返回所有列。然后使用将创建一个条件,然后我转到数据库并使用他们指定的文件管理器对该特定表运行我的查询。现在检查数据库后它无法正常工作。我很紧张,投入的时间比我能负担得起的时间更长。

如果可以,请提供帮助!

萨曼莎

DECLARE @return_value int

EXEC    @return_value = [dbo].[usp_Dev_GetSpecificTable]
        @TableName = N'tb_CountryCode',
        @RowsDesired = 10,
        @Operator = N'=',
        @Column = N'Name',
        @TextToFind = N'ANDORRA'

SELECT  'Return Value' = @return_value

GO

针对我在

下面的存储过程运行此操作
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[usp_Dev_GetSpecificTable]
    @TableName VARCHAR(100),
    @RowsDesired INT,
    @Operator VARCHAR(100),
    @Column VARCHAR(100),
    @TextToFind VARCHAR(100)
AS 
BEGIN
    DECLARE @sql AS NVARCHAR(MAX)
    DECLARE @type AS NVARCHAR(MAX)
    DECLARE @ParameterDefinition AS NVARCHAR(100)
    SET @type = 'SELECT TOP(1) DATA_TYPE FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME =  ' + QUOTENAME(@TableName) + ' AND COLUMN_NAME = ' + @Column 
    SET @sql = 'SELECT * FROM ' + QUOTENAME(@TableName) + ' WHERE ' + @Column +' = '+'''+@TextToFind+'''
    SET @ParameterDefinition =  '@TextToFind varchar'
    EXECUTE sp_executesql @sql
END

0 个答案:

没有答案