直接拼接字符串调用mysqli_query()极危险,因用户输入会混入sql导致注入,如$_post[‘id’]为”1 or 1=1″可拖库;php 5.5+已标记不安全,须改用预处理(mysqli_prepare+bind_param或pdo::prepare)。
mysqli_query() 直接拼接字符串为什么危险
因为用户输入会直接混入 SQL,比如 $_POST['id'] 值为 1 OR 1=1,拼出的语句就变成 SELECT * FROM users WHERE id = 1 OR 1=1,整张表被拖走。这种写法在 PHP 5.5+ 已被明确标记为不安全,很多团队已禁用。
常见错误现象:mysqli_query() 返回 false 却没检查,或用 mysql_real_escape_string()(已废弃)假装防御,其实绕过方式极多。
- 永远不要用
mysqli_query($conn, "SELECT * FROM t WHERE id = " . $_GET['id']) - 即使加了
intval()或(int)强转,也要确认字段类型和业务逻辑是否真允许纯数字 - 字符串类参数(如用户名、邮箱)必须进预处理,不能靠
addslashes()或正则过滤
mysqli_prepare() + bind_param() 的基本写法
预处理本质是「先编译语句模板,再绑定数据」,数据库服务端能区分「结构」和「数据」,天然免疫注入。注意 bind_param() 的第一个参数是类型字符串,顺序和问号占位符严格对应。
示例:查询用户信息
立即学习“PHP免费学习笔记(深入)”;