PHP进阶:H5站长SQL注入防护实战
|
SQL注入是Web安全中最古老也最危险的漏洞之一,H5站长若使用PHP直接拼接用户输入构建SQL语句,极易被攻击者操控数据库。例如,登录时用$sql = "SELECT FROM users WHERE username='$user' AND password='$pass'",当$user传入'admin'-- 时,后半条语句被注释,绕过密码验证。此类漏洞轻则泄露数据,重则删库跑路。 根本防护原则是:永远不信任用户输入,绝不将未经处理的变量直接嵌入SQL。PHP原生mysql扩展早已废弃,必须使用PDO或MySQLi,并启用预处理语句(Prepared Statements)。预处理将SQL结构与数据分离,数据库引擎先编译语句模板,再安全绑定参数,彻底阻断注入路径。例如PDO写法:$stmt = $pdo->prepare("SELECT FROM articles WHERE id = ?"); $stmt->execute([$id]); 对于动态表名、字段名等无法参数化的场景(如ORDER BY后的列名),必须白名单校验。可预先定义允许排序的字段数组['title', 'created_at', 'status'],接收参数后仅允许从中选取:$order_field = in_array($_GET['sort'], $allowed_fields) ? $_GET['sort'] : 'created_at'; 再拼入SQL。绝对不可用intval()或addslashes()处理此类字符串型标识符。 错误信息需严格屏蔽。开启display_errors会暴露数据库结构、表名甚至服务器路径,为攻击者提供关键情报。应在生产环境关闭错误显示,改用error_log记录到文件,并返回统一友好提示:“请求异常,请稍后重试”。同时,数据库连接应使用最小权限账号,禁止授予DROP、CREATE等高危权限,大幅降低被入侵后的危害范围。 开发者常误以为magic_quotes_gpc或mysqli_real_escape_string能万无一失,但前者已移除,后者仅适用于单引号包围的字符串,对数字型参数、字段名、LIMIT子句等完全无效,且易因编码绕过(如GBK双字节漏洞)。唯一可靠方案仍是预处理+白名单+权限隔离三重防线。
AI绘图结果,仅供参考 最后建议接入基础WAF规则(如ModSecurity的OWASP CRS),作为纵深防御补充;但绝不可依赖WAF替代代码层防护。每一次用户输入进入SQL前,都应自问:它是否经过预处理?是否通过白名单校验?是否运行在受限权限下?养成这种习惯,SQL注入便不再可怕——它本就不该存在于现代PHP应用中。(编辑:站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |

