不能用字符串拼接写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 自动作曲、编曲、混音于一体
相关推荐
u0110225121 小时前
如何解决Oracle 12c以上版本的ORA-65096_C##公共用户前缀限制woxihuan1234561 小时前
JavaScript中利用Range对象实现复杂的文本选择操作赏金术士1 小时前
Kotlin 从入门到进阶 之委托 模块(六)zhoutongsheng1 小时前
CSS如何使用-hover显示图片文字说明_利用--after实现图文叠加效果2301_783848651 小时前
CSS解决浮动元素导致的布局闪烁_稳定容器布局高度m0_740796361 小时前
Workerman5.0协程实战:PHP高并发新标准2301_769340671 小时前
如何在 CSS 中实现元素的绝对定位,使其不受窗口尺寸变化影响m0_702036531 小时前
防止SQL注入的运维实践_实时清理数据库缓存与历史记录05候补工程师1 小时前
[架构思维] 拒绝面条代码!我用一套“基石指令”调教 AI 撸出了 408 抽测系统