1

我在我的存储过程中使用这样的查询

SET @Statement =
'SELECT Id,Title,Content,Status,ROW_NUMBER()
        OVER (ORDER BY ' + @Sort + ') AS StudentReport

         FROM YearBook

        WHERE ' + @Criteria + ')

         AS ArticleNumber

        WHERE StudentReport> ' + CONVERT(NVARCHAR, @StartRowIndex) + ' AND

        StudentReport<= (' + CONVERT(NVARCHAR, @StartRowIndex + @MaximumRows);

只想知道是否可以对这个存储过程进行sql注入。如果是,我该如何预防?需要帮忙 !!!

4

4 回答 4

3

是的,这是可能的。很容易,甚至。尝试设置

@Criteria = "\r\nGO\r\nexec sp_addlogin 'hacker', 'broken'\r\nGO";

该批次将产生错误,但中间的部分仍然会运行,因此欢迎您的新登录。


进行查询的正确方法可能是这样的。

CREATE PROC FindSomething
  @StartRowIndex int,
  @MaximumRows int,
  @Sort int, -- 1-4 representing the columns, say in a dropdown
  @Id int,
  @Content varchar(max),
  @Title varchar(max),
  @Status int
AS
SELECT Id,Title,Content,Status
FROM
(
    SELECT Id,Title,Content,Status,
           ROW_NUMBER() OVER (ORDER BY
               CASE when @Sort = 1 then Id
                    when @Sort = 4 then Status
                    end,
               CASE when @sort = 2 then Title
                    when @sort = 3 then Content
                    end) AS StudentReport
    FROM YearBook
    WHERE (@id is null or @id = Id)
      AND (@Content is null or @Content = Content)
      AND (@Title is null or @Title = Title)
      AND (@status is null or @Status = Status)
) Numbered
WHERE StudentReport >= @StartRowIndex
  AND StudentReport <= @StartRowIndex + @MaximumRows
OPTION (RECOMPILE);
GO

在此处阅读有关动态搜索的更多信息:www.sommarskog.se/dyn-search.html

注意:我在排序中将 1/4 和 2/3 分开,因为 CASE 语句的每个分支都必须产生相同的类型,或者是兼容的。int/varchar 在 case 语句中是非常糟糕的组合。

于 2012-10-08T08:24:13.587 回答
1

假设以上是您正在构建的字符串,然后使用EXECor sp_executesqlthen Yes执行,则可以进行 SQL 注入。

如何防止它取决于您要做什么。也许你需要重新考虑你的方法。

于 2012-10-08T08:16:57.033 回答
0

是的,它会的。你仍然可以做一些事情来帮助防御它

例如,@Sort是一个列名,因此您可以正确地对其进行转义(并确保如果有人试图将某些东西注入其中,它将不起作用,因为它已被正确转义。为此,请使用QUOTENAME

QUOTENAME(@Sort)

@Criteria更困难,因为您实际上期望 SQL 代码上的片段,因此很难确定什么是有效的,什么是恶意的。您可能想重新考虑您在这里尝试做什么。如果您必须使用 Criteria,请确保设置了安全模型,以便只有绝对需要它的应用程序才能访问执行此操作的存储过程。确保在发送 SQL 之前在应用程序中进行验证,以确保它所做的任何事情都不会造成破坏。

于 2012-10-08T08:32:40.793 回答
0

看起来您正在尝试使用分页创建一个非常通用的搜索存储过程。这些很难仅在 t-sql 中正确实现,并且由于分支逻辑或您需要添加的其他支持存储过程,可能会成为维护的难题……

我将开始研究纯 sql 方法之外的其他选项。使用 orm 或 micro orm 会有很大帮助。实际上,看看 Sam Saffron 想出了什么...

http://samsaffron.com/archive/2011/09/05/Digging+ourselves+out+of+the+mess+Linq-2-SQL+created

于 2012-10-08T11:49:06.620 回答