【发布时间】:2018-01-14 12:23:52
【问题描述】:
这就是我创建search_term 的方式:
IF char_length(search_term) > 0 THEN
order_by := 'ts_rank_cd(textsearchable_index_col, to_tsquery(''' || search_term || ':*''))+GREATEST(0,(-1*EXTRACT(epoch FROM age(last_edited)/86400))+60)/60 DESC';
search_term := 'to_tsquery(''' || search_term || ':*'') @@ textsearchable_index_col';
ELSE
search_term := 'true';
END IF;
我在使用 PLPGSQL 函数时遇到了一些问题:
RETURN QUERY EXECUTE '
SELECT
*
FROM
articles
WHERE
$1 AND
' || publication_date_query || ' AND
primary_category LIKE ''' || category_filter || ''' AND
' || tags_query || ' AND
' || districts_query || ' AND
' || capability_query || ' AND
' || push_notification_query || ' AND
' || distance_query || ' AND
' || revision_by || ' AND
' || publication_priority_query || ' AND
' || status_query || ' AND
is_template = ' || only_templates || ' AND
status <> ''DELETED''
ORDER BY ' || order_by || ' LIMIT 500'
USING search_term;
END; $$;
返回错误:
AND 的参数必须是布尔类型,而不是在字符 64 处键入文本
相对于:
RETURN QUERY EXECUTE '
SELECT
*
FROM
articles
WHERE
' || search_term || ' AND
' || publication_date_query || ' AND
primary_category LIKE ''' || category_filter || ''' AND
' || tags_query || ' AND
' || districts_query || ' AND
' || capability_query || ' AND
' || push_notification_query || ' AND
' || distance_query || ' AND
' || revision_by || ' AND
' || publication_priority_query || ' AND
' || status_query || ' AND
is_template = ' || only_templates || ' AND
status <> ''DELETED''
ORDER BY ' || order_by || ' LIMIT 500';
END; $$;
...这行得通。我错过了什么吗?
我的目标是清理我的用户输入。
【问题讨论】:
-
所以问题出在
$1 -
什么是
search_term?如果它是column_a = 'some_string'之类的东西,那么它不适用于准备好的语句,因为它们不能用于动态 SQL。 -
search_term是用户输入,也就是任意字符串值。 -
还有其他方法可以清理我的用户输入吗?
-
search_term不能只是任意字符串值。它必须是一个 expression 在执行时评估为布尔值 - 否则您的第二个代码片段也会出错。请显示SSCCE 和一些示例输入。不要用大量不相关的噪音但缺少重要部分来倾倒整个代码片段。对于初学者来说,你的这两种尝试都对清理用户输入没有好处。巨大的 SQL 注入漏洞...
标签: sql database postgresql plpgsql dynamic-sql