删除可能导致 SQL 注入的字符的函数

Function that removes characters that can cause SQL injection

我需要在存储过程中使用动态 SQL。

那个动态 SQL 将创建 SQL 对象,因此我无法参数化它并使用 sp_executesql 执行它。

是否有一些SQL函数可以检查存储过程参数变量并告诉我是否有非法字符?或者删除它们或者有这些字符的列表?

类似

DECLARE @variable = 'password OR 1=1'

IF IsSqlInjectionPossible(@variable)
BEGIN
    RAISERROR('Illegal input characters',16,1)
    RETURN
END

SET @variable = removePossibleSqlInjection(@variable)

你是怎么做到的?

Is there some SQL function which will check the stored procedure parameter variable and tell me if there are some illegal characters ?

没有这个功能,就是不能

只是因为没有"characters that can cause sql injection"。注入中使用的所有字符都是完全合法的。您关于 SQL 注入的想法是错误的。它对查询来说不是什么陌生的东西,比如病毒或细菌,而是普通的 SQL。所以你所能做的就是禁止在 SQL 查询中使用的字符,这将使这个函数有效地擦除你的查询。

您认为 'password OR 1=1' 语句中的哪个字符是非法的?

让我们假设您有一个表单,用户可以在其中请求他们朋友的 public 数据。让我们进一步假设表单 post 是一个 ID,并且您将其用作查询中的数值:

select public_details
from users
where ID = 5

ID 是您从用户那里获得的值。允许用户选择他们正在搜索的 ID 一点也不安全,但为了示例的缘故,让我们暂时忽略它。现在如果用户发送一个post如下

5 or 1=1

没有非法字符,甚至没有postrophe。因此,问题是这是一个业务逻辑问题,应该在应用程序级别解决。