mysql如何防止SQL注入攻击_使用预编译语句与参数化查询
参数化查询是防止SQL注入的核心需严格分离SQL结构与数据所有用户输入均不可信表名、字段名等结构性内容必须白名单校验不可用占位符。为什么 mysql_query() 拼接字符串必出问题因为用户输入直接进 SQL 字符串 OR 11 这种输入会变成 WHERE name OR 11整张表被拖走。PHP 5.5 已废弃 mysql_*() 系列函数但还有人用 mysqli_query() 手动拼接本质一样危险。所有用户可控输入$_GET、$_POST、$_COOKIE、文件内容、API 返回值都算“不可信”不能直接插进 SQLaddslashes() 或 mysql_real_escape_string() 不可靠——字符集不匹配时照样绕过预编译不是“加个函数就安全”核心是“SQL 结构和数据彻底分离”怎么用 mysqli_prepare() 正确写参数化查询关键在两步先定义带占位符的 SQL再把变量单独绑定进去。MySQL 服务端只认占位符位置不解析传入的值。占位符统一用 ?不能写成 :name 或 $1那是 PDO 的语法绑定类型必须准确i整数、s字符串、d双精度、bBLOB类型错会导致静默截断或报错执行前必须检查 mysqli_prepare() 返回值是否为 false否则后续绑定会失败但不报错/* 正确示例 */$stmt mysqli_prepare($conn, SELECT * FROM users WHERE id ? AND status ?);if ($stmt) { mysqli_stmt_bind_param($stmt, is, $user_id, $status); mysqli_stmt_execute($stmt); $result mysqli_stmt_get_result($stmt);}PDO 的 prepare() 和 execute() 哪些细节容易翻车PDO 更灵活但也更容易因配置疏忽漏掉防护。默认不抛异常错误被吞掉你以为查到了实际是空结果。 博特妙笔 公职人员公文写作平台集查、写、审、学为一体。