参数化查询是根本要点
- 写法:用 ? 占位符代替直接拼值
- 语句模板先编译,数据后绑定,二者物理分离
- 就算传入 ' OR '1'='1 也只会被当作普通字符串
- 各语言都有对应接口:Python 用参数元组、Java 用 PreparedStatement
- 参数化能同时防注入、防类型错误、提升缓存命中
- 能参数化的地方一律参数化,不要手拼任何值
参数化查询是根本示例
-- 用预处理语句,占位符与数据分离,注入无效
PREPARE stmt FROM
'SELECT * FROM users WHERE username = ? AND password = ?';
SET @u = 'alice', @p = 'secret';
EXECUTE stmt USING @u, @p;
-- 就算传入 ' OR '1'='1,也只会被当作普通字符串
SET @u = ''' OR ''1''=''1';
EXECUTE stmt USING @u, @p;
避坑提醒:参数化查询是防注入的根本手段,转义只是兜底;新项目直接全面上预处理,别等被扫出来再补。