Parameterized Query SQL Injection Prevention
Contrast string-interpolated SQL with parameterized statements, allowing safe dynamic ORDER BY through whitelisting.
Code
-- 危险示范:拼接用户输入(永远不要这样做)
-- SELECT * FROM products WHERE name = '克" OR "1"="1'
-- ORDER BY 攻击同理:排序字段直接内插
-- 安全形态:值全部走绑定参数
SELECT id, name, price_cents
FROM products
WHERE category = $1
AND price_cents BETWEEN $2 AND $3
ORDER BY price_cents
LIMIT $4;
-- 绑定:$1='electronics', $2=1000, $3=5000, $4=20
-- IN 列表的动态占位符:结构生成、值绑定
SELECT id, name
FROM products
WHERE id IN ($1, $2, $3);
-- 占位符数量由应用层数组长度生成,值逐个绑定
-- ORDER BY 无法参数化:白名单映射是唯一出路
-- 应用层伪代码:
-- allowed = { 'price': 'price_cents',
-- 'name': 'name',
-- 'created': 'created_at DESC' }
-- order_sql = allowed[user_input] or fail()
SELECT id, name, price_cents
FROM products
WHERE category = $1
ORDER BY price_cents DESC NULLS LAST; -- order_sql 来自白名单
-- 标识符必须动态时用格式化函数加引号
SELECT quote_ident('user_input_column'); -- 带引号的安全标识符Report a problem with this exampleOpens a pre-filled issue on GitHub.