不能用字符串拼接写SQL,因为用户输入会直接嵌入语句导致SQL注入,如' OR '1'='1可查出全表;唯一安全做法是PDO预处理+绑定参数,并关闭模拟预处理。为什么不能用字符串拼接写 SQL因为用户输入的内容会直接混进 SQL 语句里,PDO 不会帮你识别哪部分是数据、哪部分是代码。比如用户传入 ' OR '1'='1,拼出来就变成 SELECT * FROM users WHERE name = '' OR '1'='1',整张表全被查出来了。这种漏洞不是"可能出问题",而是只要拼接 + 用户输入,就一定存在风险。哪怕你做了 trim() 或 htmlspecialchars(),也没用------那些函数防的是 HTML 注入,不是 SQL 注入。常见错误现象:- 页面报错 SQLSTATE[42000]: Syntax error or access violation- 查询结果异常多或为空,但日志里 SQL 看着"语法没错"- 后台日志出现 UNION SELECT、information_schema 等可疑关键词用 PDO::prepare() + bindParam() 是唯一靠谱做法预处理语句把 SQL 结构和数据彻底分开:先让数据库编译好模板(比如 SELECT * FROM users WHERE id = ?),再把值安全地填进去。数据库知道这个问号只是个占位符,不会当 SQL 代码执行。实操建议:- 必须用 prepare() 和 execute() 配合,不能只调 query()- 占位符只能是 ? 或命名参数如 :name,不能拼进表名、字段名、排序方向(这些得靠白名单校验)- 绑定类型尽量明确,比如整数用 PDO::PARAM_INT,避免字符串被当成数字解析出错- 示例:stmt = pdo->prepare("SELECT * FROM users WHERE status = ? AND level > ?");stmt-\>bindParam(1, status, PDO::PARAM_STR);stmt-\>bindParam(2, minLevel, PDO::PARAM_INT);stmt-\>execute();setFetchMode() 和 fetch() 的坑别踩很多人以为只要用了 prepare() 就万事大吉,结果在取数据时又绕回字符串拼接逻辑里。比如手动拼 "user_" . id 当缓存 key,或者用 fetch() 结果直接拼 HTML 输出,没过滤 XSS ------ 这些跟 SQL 注入无关,但属于同一类信任误判。 唱鸭 音乐创作全流程的AI自动作曲工具,集 AI 辅助作词、AI 自动作曲、编曲、混音于一体
相关推荐
老纪的技术唠嗑局2 小时前
深度解析 LLM Wiki / Obsidian-Wiki / GBrain:Agent 时代知识的“自组织”与“自进化”AIFQuant3 小时前
2026 全球股票/外汇/贵金属行情 API 深度对比:延迟、覆盖、价格与稳定性Ray Liang3 小时前
吐血整理JSON-RPC2.0的原理与应用㳺三才人子4 小时前
簡單的 語音助手计算机毕业编程指导师4 小时前
【计算机毕设推荐】Python+Hadoop+Spark共享单车数据可视化分析系统 毕业设计 选题推荐 毕设选题 数据分析 机器学习 数据挖掘2301_795099744 小时前
golang如何在Gin中自定义验证器_golang Gin自定义验证器实现方法计算机毕业编程指导师4 小时前
【计算机毕设】基于Hadoop的共享单车订单数据分析系统+Python+Django全栈开发 毕业设计 选题推荐 毕设选题 数据分析 机器学习 数据挖掘2301_766283444 小时前
如何在MongoDB GridFS中进行按文件大小(length)范围的查询他是龙5514 小时前
71:Python安全 & 反序列化 & PYC反编译 & 格式化字符串安全