站长学院:PHP防注入安全进阶实战
|
PHP应用常因直接拼接用户输入而引发SQL注入、XSS等高危漏洞。防御不能只靠过滤函数或黑名单,需从数据流向入手,建立分层防护体系。 参数化查询是SQL注入的终极防线。无论MySQLi还是PDO,都必须使用预处理语句绑定变量。例如:$stmt = $pdo->prepare("SELECT FROM users WHERE id = ?"); $stmt->execute([$id]); 而非"WHERE id = $id"——后者哪怕加了intval(),一旦上下文变化(如字符串字段、ORDER BY子句)仍可能失守。 对输出到HTML的内容,必须按上下文进行编码:插入文本节点用htmlspecialchars($str, ENT_HTML5, 'UTF-8');放入JavaScript字符串需先JSON编码再引号转义;写入CSS或URL属性则需专用函数如urlencode()或CSS.escape()。切忌全局addslashes(),它无法应对所有场景且易被绕过。 文件操作是另一个高危区。禁止将$_GET['file']直接拼入include或file_get_contents。应采用白名单映射:$map = ['report' => 'report.php', 'help' => 'help.md']; $file = $_GET['type'] ?? ''; if (!isset($map[$file])) die('Invalid request'); include $map[$file]; 同时确保白名单值不含路径分隔符。 数据库连接务必禁用多语句执行(PDO::MYSQL_ATTR_MULTI_STATEMENTS设为false),并关闭错误信息暴露:生产环境设置display_errors=Off,log_errors=On,并通过自定义异常处理器统一返回友好提示,避免泄露表结构或绝对路径。 会话安全不容忽视。启用session.cookie_httponly=1、session.cookie_secure=1(仅HTTPS传输)、session.use_strict_mode=1防止会话固定。登录成功后调用session_regenerate_id(true)强制更新ID,并销毁旧会话。 使用Composer管理依赖时,定期运行composer audit检查已知漏洞,及时升级核心包如monolog、swiftmailer。不信任任何第三方SDK的输入处理逻辑,对其回调参数同样执行严格校验。
AI设计稿,仅供参考 所有外部输入(API响应、curl结果、文件上传内容)都视为不可信。解析JSON用json_decode($str, true, 512, JSON_THROW_ON_ERROR)捕获异常;处理XML时禁用外部实体加载(libxml_disable_entity_loader(true));上传文件需验证MIME类型(通过finfo_file而非$_FILES['type'])、重命名并存于Web根目录外。 安全不是功能开关,而是开发习惯。每次接收用户数据时,问自己三个问题:它将进入哪一层(SQL/HTML/JS/文件系统)?该层最严苛的语法规则是什么?我是否用对应机制做了最小化转义?答案清晰,风险自消。 (编辑:51站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |

