不能用字符串拼接写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 自动作曲、编曲、混音于一体
相关推荐
未秃头的程序猿1 小时前
分库分表一年后,我复盘了当时最该想清楚的三件事零域码客1 小时前
一文掌握 jQuery + Flask 全栈核心知识点(前端交互 + 后端接口 + 前后端联调)BYSJMG1 小时前
计算机毕设选题做什么好?基于大数据的用户美食数据分析与可视化,PySpark预处理+ECharts大屏,含Isolation Forest异常检测算法奈斯先生Vector1 小时前
AIGC 视频生成换个拍法:用 Kling Video 把一张人物图变成可剪辑的短故事卷无止境1 小时前
当"精简主义"住进AI编程助手:Ponytail深度解读2601_962298271 小时前
交易开拓者通常使用什么编程语言?这种语言如何帮助自动化交易?心易行者1 小时前
用html在线运行做数据可视化大屏,5个实战场景从入门到上线用户298698530141 小时前
Python 实现 Word 文档转 PDF 的自动化方案Pocker_Spades_A2 小时前
Python快速入门专业版(五十九):re实战——用正则爬取豆瓣电影Top250(全流程解析)