string_split()注入安全吗?



在阅读了这篇关于处理多值参数的文章后,我了解了方便的string_split()函数。
我想在一个参数化查询的where子句中使用它,像这样:

WHERE [SomeTable].[SomeColumn] IN (
SELECT TRIM(value)
FROM string_split(@commaSeparatedListOfValues, ',')
)

@commaSeparatedListOfValues哪里收到用户输入一个字符串作为参数传递。
我想知道这个函数对注射是否安全。以这种方式传递的字符串真的无法转义吗?如果用户提供了一个像

这样的字符串呢?"firstValue , ');PRINT 'Hello'-- , thirdValue".

当然它是在第一步作为参数添加的,不会造成任何伤害,但是拆分后仍然适用吗?

我知道string_split()只能返回字符串类型的表。我发现很少甚至没有提到这些问题,所以我想这是一个无关紧要的问题?

在不能执行任意代码的意义上,没有直接的注入问题。这是因为,最终,@commaSeparatedListOfValues仍然是一个字符串,并且永远不会被解析成实际的代码。

唯一的注入问题是,如果你显式地传递三个值,其中一个包含逗号。

例如,如果您有一个接受物品列表的网页,用户输入firstsec,ondthird。如果你把这些与,混在一起,那么你的SQL代码最终会将其解释为四个单独的值firstsecondthird

考虑到这一点以及其他性能和正确性的原因,使用表值参数可能会更好。

最新更新