不能用字符串拼接写SQL,因为用户输入会直接嵌入语句导致SQL注入,如' OR '1'='1可查出全表;唯一安全做法是PDO预处理+绑定参数,并关闭模拟预处理。为什么不能用字符串拼接写 SQL因为用户输入的内容会直接混进 SQL 语句里,PDO 不会帮你识别哪部分是数据、哪部分是代码。比如用户传入 ' OR '1'='1,拼出来就变成 SELECT * FROM users WHERE name = '' OR '1'='1',整张表全被查出来了。这种漏洞不是"可能出问题",而是只要拼接 + 用户输入,就一定存在风险。哪怕你做了 trim() 或 htmlspecialchars(),也没用------那些函数防的是 HTML 注入,不是 SQL 注入。常见错误现象:- 页面报错 SQLSTATE42000: 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 自动作曲、编曲、混音于一体
相关推荐
张洛闻Eren10 小时前
MySQL 维护稳定系统【MySQL第二课】布莱克60511 小时前
理解索引:从概念到实践XLYcmy11 小时前
京东 算法实习一面 下+手撕虎头金猫12 小时前
如何在群晖NAS上通过Docker部署CloudSaver?群晖部署CloudSaver教程|聚合资源搜索并实现远程访问从零开始学习人工智能12 小时前
WSL2部署CUDA12+cuDNN9踩坑实录:ONNX Runtime GPU推理环境搭建全流程m0_3807438712 小时前
从零调用 Claude 教程min(a,b)13 小时前
学习第17天:Agent Memory 与 MCP 协议名字还没想好☜13 小时前
Java 线上内存泄漏排查实战:jmap 导堆、MAT 找 GC Roots 与四类常见泄漏CodeBlog-star14 小时前
LLM安全实战:提示词注入与越狱攻击防御指南小柯南敲键盘14 小时前
电商图片翻译工具推荐,批量处理主图视频字幕,免费试用