站长学院:PHP进阶——实战防SQL注入安全
|
SQL注入是Web应用最危险的安全漏洞之一,攻击者通过拼接恶意SQL代码篡改数据库查询逻辑,轻则泄露用户数据,重则删除整个库。PHP作为动态页面主力语言,若处理用户输入不当,极易中招。 最常见误区是直接拼接变量进SQL语句,例如:$sql = "SELECT FROM users WHERE id = " . $_GET['id']; 当传入id=1 OR 1=1-- 时,查询将返回全部用户。这种写法无论加单引号还是过滤关键词,都难以彻底防御。 根本解法是使用预处理语句(Prepared Statements)。PDO与MySQLi均支持:以PDO为例,先用占位符构建SQL模板,再独立绑定参数。代码示例:$stmt = $pdo->prepare("SELECT FROM users WHERE email = ?"); $stmt->execute([$_POST['email']]); 此时传入的email值仅作数据解析,绝不会被当作SQL代码执行。 需注意:预处理仅对参数生效,不能用于表名、字段名或排序方向等结构部分。若确需动态表名,必须采用白名单校验——如定义$valid_tables = ['users', 'posts']; 再用in_array()严格比对,绝不允许任何通配或正则绕过。 额外加固不可忽视。开启PHP的PDO::ATTR_EMULATE_PREPARES = false,禁用模拟预处理,避免驱动层退化为字符串拼接。同时统一设置字符集(如utf8mb4),防止宽字节注入——某些编码下,%BF%27可绕过单引号转义。
AI设计的框架图,仅供参考 错误信息也不该暴露细节。生产环境须关闭display_errors,改用error_log记录;数据库报错如“Unknown column 'xxx' in 'field list'”会透露表结构,攻击者可借此枚举字段名。自定义通用错误页,只返回“操作失败”,不透露技术路径。 请抛弃mysql_real_escape_string(已废弃)和addslashes这类“补丁式”方案。它们依赖上下文且易被编码绕过,无法应对现代多层架构中的复杂输入场景。安全不是加一层防护,而是从设计之初就切断输入与执行的耦合。 每处接收用户输入的地方,都应默念:数据非代码。用预处理守牢边界,用白名单约束结构,用日志代替报错,让SQL注入在源头失效。安全无捷径,但有确定路径。 (编辑:站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |

