PHP进阶:H5站长SQL注入防护实战
|
SQL注入是Web安全中最古老也最危险的漏洞之一,H5站长若使用PHP直接拼接用户输入构造SQL语句,极易导致数据库被非法读取、篡改甚至删除。例如:$sql = "SELECT FROM users WHERE username = '" . $_GET['u'] . "'"; 当用户传入 u=admin'-- 时,原始语句将变为 SELECT FROM users WHERE username = 'admin'-- ',注释掉后续校验逻辑,绕过登录。 最根本的防护手段是彻底杜绝字符串拼接式SQL。PHP官方早已推荐使用PDO或MySQLi的预处理机制(Prepared Statements)。它将SQL语句结构与数据分离:先编译语句模板,再绑定参数值。数据库引擎会将绑定值始终视为纯数据,无论其中是否含单引号、分号或注释符,都不会改变SQL语法结构。代码示例:$stmt = $pdo->prepare("SELECT FROM articles WHERE id = ?"); $stmt->execute([$_GET['id']]); ——此处问号占位符由PDO底层转义并类型化处理,完全免疫注入。
AI设计稿,仅供参考 需注意,预处理并非万能。若动态表名、字段名、排序方向(如 ORDER BY)等无法作为参数绑定的内容必须由用户输入决定,此时应严格白名单校验。例如允许的排序字段仅限 ['title', 'created_at', 'views'],则用 in_array($_GET['sort'], ['title','created_at','views']) 进行判断,匹配失败立即拒绝请求。任何尝试传入 "id; DROP TABLE users" 的行为都会在参数解析阶段被拦截。过滤函数如 addslashes() 或 magic_quotes_gpc(已废弃)看似“加了引号就安全”,实则存在编码绕过风险(如UTF-8宽字节注入),且易引发重复转义、逻辑混乱。mysql_real_escape_string() 虽在特定连接编码下有效,但仅适用于旧mysql扩展,且无法防范数值型参数注入(如 id=1 OR 1=1)。这些方案均已被现代安全实践淘汰,不应出现在新项目中。 权限最小化是纵深防御的关键一环。应用数据库账号不应拥有 DROP、CREATE、UNION SELECT 等高危权限,日常查询仅授予 SELECT、INSERT、UPDATE 于指定表。同时禁用数据库错误信息外泄——php.ini 中设置 display_errors=Off,并用 error_log 记录而非 echo 出错SQL,避免攻击者通过报错获取库表结构。 ⭐️⭐️⭐️⭐️养成习惯:所有外部输入(GET/POST/COOKIE/HEADER)默认视为不可信;每次SQL操作前确认是否用了预处理;上线前用简单payload(如 ' OR '1'='1、1//UNION//SELECT)快速验证关键接口。防护不是一次配置,而是编码时的条件反射——写完SQL,先问自己:这个变量,敢不敢放进 prepare() 的占位符里? (编辑:51站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |

