PHP进阶:H5站长必学SQL注入防御实战
|
SQL注入是Web安全中最常见也最危险的漏洞之一,尤其对使用PHP搭建H5页面或轻量后台的站长而言,一个未过滤的$_GET或$_POST参数就可能让整个数据库被拖库、删表甚至服务器被远程控制。防御的关键不在于“堵住所有漏洞”,而在于建立系统化的安全习惯。 最根本的防线是使用预处理语句(Prepared Statements)。无论是MySQLi还是PDO,都应弃用拼接SQL字符串的老方法。例如:$stmt = $pdo->prepare("SELECT FROM users WHERE username = ? AND status = ?"); $stmt->execute([$name, $status]); 这样,用户输入的单引号、分号、UNION等恶意字符会被自动转义为普通字符串,完全隔离执行逻辑与数据内容。 若因历史原因必须动态拼接SQL,请严格限制变量类型与取值范围。比如ID参数只允许纯数字,可用is_numeric()校验后强转为(int);状态字段仅限'active'、'draft'等有限枚举值,应通过白名单数组in_array()判断,而非简单str_replace或addslashes()——后者已被证实可被绕过。 所有外部输入都需视为不可信数据。不仅包括$_GET、$_POST、$_COOKIE,还包含$_SERVER['HTTP_REFERER']、$_FILES['name']甚至Redis/Memcached返回的数据。统一在入口处做基础过滤(如trim()、htmlspecialchars()用于输出场景),但绝不依赖过滤函数替代预处理——过滤解决XSS,不是SQL注入的解药。
AI生成内容图,仅供参考 数据库账号权限最小化同样重要。不要让Web应用使用root或dba账户。为H5后台单独创建只读账号(SELECT权限)用于展示页,另设带INSERT/UPDATE权限的专用账号且仅限特定表。即使注入得逞,攻击者也无法执行DROP TABLE或LOAD_FILE()等高危操作。启用错误屏蔽,避免敏感信息泄露。在生产环境将display_errors设为Off,log_errors设为On,并配置自定义错误处理器记录异常SQL。暴露MySQL错误信息(如“You have an error in your SQL syntax”)会直接暴露表结构和字段名,极大降低攻击门槛。 定期审计代码中所有数据库交互点。用grep -r "mysql_query\\|mysqli_query\\|PDO::query"快速定位旧式拼接语句,逐个重构为预处理。同时检查是否误用quote()、real_escape_string()等已淘汰方式——它们无法防御宽字节注入及多字节编码绕过。 最后请记住:没有银弹,只有纵深防御。预处理是基石,权限隔离是护栏,输入校验是哨兵,日志监控是探针。把安全当成开发流程的默认环节,而非上线前的补救动作。每天花五分钟检查一个SQL调用,一年下来就能避开90%的注入风险。 (编辑:91站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |

