我在postgres SQL中有一个函数,它使用动态查询来搜索结果。我使用参数化方法来完成任务,以避免SQL注入。下面是我的函数的片段。
CREATE OR REPLACE FUNCTION master."FilterFooBar"(
"_Codes" character varying,
"_Chapter" character varying)
RETURNS TABLE("Foo" integer, "Bar" integer)
LANGUAGE 'plpgsql'
COST 100
VOLATILE PARALLEL UNSAFE
ROWS 1000
AS $BODY$
DECLARE
"_FromSql" TEXT;
BEGIN
"_FromSql" := ' FROM
master."FooBar" fb
WHERE
1 = 1';
IF "_Codes" IS NOT NULL
THEN
"_FromSql" := "_FromSql" || ' AND fb."Code" IN ('|| "_Codes" ||')';
END IF;
IF "_Chapter" IS NOT NULL
THEN
"_FromSql" := "_FromSql" || ' AND fb."Code" ILIKE '''|| "_Chapter" ||'%''';
END IF;
RETURN QUERY
EXECUTE
' SELECT fb."Foo",'|| ' fb."Bar",' || "_FromSql";
END
$BODY$;
这里的问题是这段代码
IF "_Chapter" IS NOT NULL
THEN
"_FromSql" := "_FromSql" || ' AND fb."Code" ILIKE '''|| "_Chapter" ||'%''';
END IF;
在测试过程中,我发现它容易受到SQL注入的攻击。如果我只是传递像"_Chapter" = "01' or 8519=8519--"
这样的值,它会破坏我的代码。我以为dapper参数化方法可以解决这个问题,但dapper不处理这种情况。是因为动态查询吗?
任何帮助都很感激。
2条答案
按热度按时间4nkexdtk1#
为什么不把动态SQL放入Dapper中,然后使用参数应该可以通过抛出异常来保护您免受恶意代码的攻击(以下是未经测试的代码):
在你的应用程序中这样调用:
rt4zxlrg2#
原来Dapper是转义单引号来处理SQL注入,问题是动态查询。当提供像这样的恶意参数
'01'' or 8519=8519--'
时,该语句"_FromSql" := "_FromSql" || ' AND fb."Code" ILIKE '''|| "_Chapter" ||'%''';
被转换为AND fb."Code" ILIKE '01' or 8519=8519-- %;
。要处理这个问题,还有另一种编写动态查询的方法,而不是使用连接运算符||我们可以使用$ operator来替换。
例如,上述语句将转换为
"_FromSql" := "_FromSql" || ' AND hs."Code" LIKE $2 ||''%'' ';
,您可以在执行时传递实际参数这将确保避免不必要的字符串终止