如何应对SQL注入威胁_使用存储过程封装查询降低风险

张开发
2026/4/4 18:22:55 15 分钟阅读
如何应对SQL注入威胁_使用存储过程封装查询降低风险
存储过程不能自动防止SQL注入关键在于是否安全编写若内部拼接用户输入如MySQL用CONCAT仍会中招必须使用参数化方式如PREPAREEXECUTE配合USING或静态SQL。存储过程真能防SQL注入先看它怎么失效不能自动防关键在怎么写。存储过程只是把 SQL 逻辑移到数据库端执行如果内部拼接了用户输入照样中招。常见错误是用 CONCAT 或 拼接参数进查询字符串比如在 MySQL 里写 SET sql CONCAT(SELECT * FROM users WHERE name , in_name, ); —— 这和应用层字符串拼接没区别in_name 传入 OR 11 -- 就直接穿透。必须用参数化方式执行动态 SQLMySQL 用 PREPARE EXECUTE 配合 USINGSQL Server 用 sp_executesql 并显式声明参数静态 SQL不拼接天然安全直接写 WHERE username username数据库会把参数当值处理不会解析为语法别信“存储过程权限收紧万无一失”如果账号有 EXECUTE 权限且过程本身不设防攻击面还在MySQL 存储过程中安全传参的写法MySQL 对参数化支持较弱尤其动态查询场景。核心原则不用字符串拼接改用占位符 USING。CREATE PROCEDURE search_user(IN p_name VARCHAR(50))BEGIN SET sql SELECT id, email FROM users WHERE name ?; PREPARE stmt FROM sql; EXECUTE stmt USING p_name; DEALLOCATE PREPARE stmt;END? 是唯一合法占位符不能写成 ? 或拼进字符串里USING 后只能跟变量名不能是表达式或函数调用如 USING UPPER(p_name) 会报错每次 EXECUTE 前必须 PREPARE但别在循环里反复 PREPARE/DEALLOCATE性能差可考虑复用语句句柄或改用静态 SQLSQL Server 存储过程里最常踩的坑sp_executesql 是安全底线但很多人只用对了一半。典型错误把参数名硬编码进 SQL 字符串或者漏写参数类型。 MacsMind 电商AI超级智能客服

更多文章