用途
本技能面向 WordPress 开发中的安全与数据校验,目标是防止 XSS(跨站脚本)、CSRF(跨站请求伪造)和 SQL 注入等常见 Web 漏洞,采用纵深防御的三层安全模型。
其核心原则为:输入时清理,逻辑时校验,输出时转义。文中指出每年有大量 WordPress 站点因插件与主题的安全漏洞被攻破,攻击多集中于上述三类弱点。
版本:1.1.0;目标环境:WordPress 6.7+ 与 PHP 8.3+;技能级别:中级至高级。
三层安全模型
- 第一层:清理(Sanitization)——在收到用户输入后立即移除危险字符并规范化数据格式,例如 sanitize_text_field($_POST['username'])。
- 第二层:校验(Validation)——在清理之后、处理之前,检查数据是否满足业务要求,例如 if (!is_email($email)) { /* error */ }。
- 第三层:转义(Escaping)——每次向浏览器输出数据时进行上下文相关的编码,例如 echo esc_html($user_input)。
三者的关键区别:清理会移除或转换非法数据(改变值);校验判断数据是否可接受(返回真/假);转义使数据在展示时安全(按上下文编码)。
一、Nonce:CSRF 防护
Nonce 是一次性使用的加密令牌,用于确认请求来自本站而非恶意外部来源。文中演示了攻击者通过 img 标签发起删除用户请求的 CSRF 场景,并说明合法请求需携带 nonce,而攻击者无法生成与用户会话绑定的有效 nonce。
文章给出三类实现模式:
-
表单 Nonce(最常见):在表单中通过 wp_nonce_field() 生成隐藏字段,提交时用 wp_verify_nonce() 校验,并叠加 current_user_can() 权限检查后再处理数据。相关函数包括 wp_nonce_field($action, $name) 与 wp_verify_nonce($nonce, $action)。
-
URL Nonce:用于删除、回收站链接与后台操作,通过 wp_nonce_url() 生成带 nonce 的 URL,在处理器中校验后执行操作并重定向。
-
AJAX Nonce:前端 AJAX 请求时,通过 wp_enqueue_script 与 wp_localize_script 将 ajaxurl 与 wp_create_nonce() 生成的 nonce 传入 JavaScript,服务端用 check_ajax_referer() 校验,再用 wp_send_json_success() 或 wp_send_json_error() 返回结果;示例同时展示了输入清理与权限检查。
最佳实践(应做):使用唯一的 action 名称(如 delete_post_$post_id 而非笼统的 delete);处理任何数据前先校验 nonce;将 nonce 校验与权限校验结合;针对 AJAX 使用专用函数 check_ajax_referer。不应做:对多个操作复用同一 nonce action;对“只读”操作跳过 nonce 校验;仅依赖 nonce 校验而不检查权限;将 nonce 存入 cookie 或 URL 长期使用。Nonce 默认 24 小时后过期(因时间窗口,前后各 12 小时)。
二、清理函数参考
清理通过移除或编码危险字符,将用户输入转换为安全格式,是抵御恶意数据的第一道防线。核心函数与用途包括:
- 文本类:sanitize_text_field()(单行文本,去除 HTML 与换行)、sanitize_textarea_field()(多行文本,保留换行)、sanitize_title()(文章别名)、sanitize_key()(数组键、meta 键)。
- 身份与地址类:sanitize_email()(邮箱)、sanitize_url() / esc_url_raw()(用于存储的 URL,会拦截危险协议)。
- 数字类:absint()(正整数)、intval()(任意整数)、floatval()(浮点数)。
- HTML 类:wp_kses_post()(允许 WordPress 文章编辑器常用标签)、wp_kses()(自定义允许标签与属性)、wp_strip_all_tags()(去除全部 HTML)。
- 文件类:sanitize_file_name()(去除路径穿越与特殊字符);完整的文件上传示例演示了先校验 nonce、清理文件名、校验 MIME 类型白名单,再交由 wp_handle_upload() 处理并保存 URL。
- 数组类:通过 array_map 配合 sanitize_text_field、absint、sanitize_email 等批量清理。
自定义清理回调:可在 register_setting() 中指定 sanitize_callback,对 API key(仅保留字母数字)、布尔复选框、十六进制颜色(sanitize_hex_color)、下拉选项(白名单校验)等进行处理。
三、校验模式
校验在清理之后确认数据满足业务逻辑,返回真/假。文中列出内置函数:is_email()、is_numeric()、is_int()、is_array()、is_user_logged_in()、username_exists()、email_exists()。示例覆盖:邮箱格式与唯一性校验;数字范围校验(如年龄 18 至 100);字符串长度校验(用户名 3 至 20 字符);必填字段校验;以及正则模式匹配(示例段落在此处截断)。
适用场景与限制
本技能适用于 WordPress 插件与主题的安全开发,特别是涉及表单提交、后台操作链接、AJAX 请求、文件上传与设置保存等需要处理用户输入的场景。
文中未提供关于安装方式、代码仓库结构、依赖管理或具体收费模式的说明;亦未给出完整的 SQL 注入防护章节细节(原文分段在正则模式匹配处截断)。