使用PostgreSQL 9.1.13我已经编写了以下查询来计算一些数据:
WITH windowed AS (
SELECT a.person_id, a.category_id,
CAST(dense_rank() OVER w AS float) / COUNT(*) OVER (ORDER BY category_id) * 100.0 AS percentile
FROM (
SELECT DISTINCT ON (person_id, category_id) *
FROM performances s
-- Want to insert a FROM clause here
INNER JOIN person p ON s.person_id = p.ident
ORDER BY person_id, category_id, created DESC
) a
WINDOW w AS (PARTITION BY category_id ORDER BY score)
)
SELECT category_id,percentile FROM windowed
WHERE person_id = 1;
我现在想把它变成一个存储过程,但我的问题是,在那里,我展示了注释,我需要放置一个动态WHERE子句。例如,我想添加类似的内容:
WHERE p.weight > 110 OR p.weight IS NULL
调用应用程序让人们选择过滤器,因此我希望能够将适当的过滤器传递给查询。可能有0个或多个过滤器,具体取决于调用者,但我可以将其全部作为正确格式化的where
子句作为字符串参数传递。例如。
调用应用程序只是将值发送到Web服务,然后构建字符串并调用存储过程,因此SQL注入攻击确实不是问题。
答案 0 :(得分:0)
调用应用程序只是将值发送到Web服务,然后 构建字符串并调用存储过程,因此SQL注入 攻击确实是一个问题。
太多厨师破坏了肉汤。
让你的webserive构建SQL语句或让Postgres做到这一点。不要在同一个查询中使用它们。这为SQL注入攻击留下了两个可能的弱点,使调试和维护变得更加困难。
这是完整代码示例,用于 plpgsql函数,它可以动态构建和执行SQL语句,同时使SQL注入无法进行(仅限两天前):
细节在很大程度上取决于具体要求。