在阅读了这篇关于处理多值参数的文章后,我了解了方便的string_split()
函数。
我想在一个参数化查询的where子句中使用它,像这样:
WHERE [SomeTable].[SomeColumn] IN (
SELECT TRIM(value)
FROM string_split(@commaSeparatedListOfValues, ',')
)
@commaSeparatedListOfValues
哪里收到用户输入一个字符串作为参数传递。
我想知道这个函数对注射是否安全。以这种方式传递的字符串真的无法转义吗?如果用户提供了一个像
这样的字符串呢?"firstValue , ');PRINT 'Hello'-- , thirdValue"
.
当然它是在第一步作为参数添加的,不会造成任何伤害,但是拆分后仍然适用吗?
我知道string_split()
只能返回字符串类型的表。我发现很少甚至没有提到这些问题,所以我想这是一个无关紧要的问题?
在不能执行任意代码的意义上,没有直接的注入问题。这是因为,最终,@commaSeparatedListOfValues
仍然是一个字符串,并且永远不会被解析成实际的代码。
唯一的注入问题是,如果你显式地传递三个值,其中一个包含逗号。
例如,如果您有一个接受物品列表的网页,用户输入first
sec,ond
third
。如果你把这些与,
混在一起,那么你的SQL代码最终会将其解释为四个单独的值first
sec
ond
third
。
考虑到这一点以及其他性能和正确性的原因,使用表值参数可能会更好。