WordPress 本身是安全的,但二次开发过程中引入的不规范代码,往往是安全漏洞的根源。与其等到网站被攻击再去修复,不如在编写代码时就养成良好的安全习惯。

以下是 WordPress 开发中必须遵守的 8 条安全规范:

第一条:永远不要信任任何输入。 不管是 $_GET$_POST$_REQUEST 还是 $_COOKIE,只要来自用户的输入,都假设是恶意的。用 sanitize_text_field 清洗普通文本,用 intval 强制转换数字,用 sanitize_email 清洗邮箱地址。

第二条:输出前必须转义。 很多漏洞不是发生在存储时,而是发生在输出时。在 HTML 属性中用 esc_attr,在 URL 中用 esc_url,在文本区域中用 esc_html,在 JS 中用 esc_js。永远不要直接 echo 用户输入的内容。

第三条:所有数据库操作必须预处理。 使用 $wpdb->prepare 构造 SQL 语句,千万不能用拼接字符串的方式。即使你觉得某个变量一定是安全的,也坚持使用预处理,这是一种安全习惯而非成本。

第四条:非管理员操作必须做权限检查。 如果某个功能只允许管理员执行,在代码开头加上 current_user_can('manage_options')。对于普通用户级别的操作,检查 current_user_can('read') 或更细粒度的权限。如果没有检查,任何知道 URL 的人都可以触发你的函数。

第五条:AJAX 请求必须加 nonce。 wp_create_nonce 生成一个一次性令牌,在前端 AJAX 请求中携带这个令牌,后端用 check_ajax_referer 验证。这样可以防止跨站请求伪造攻击。

第六条:文件上传必须严格限制类型。 如果允许用户上传文件,务必检查 MIME 类型,限制扩展名白名单,并且把文件存储在无法直接执行脚本的目录中。用 wp_check_filetype 和 wp_handle_upload 提供的安全机制。

第七条:禁用文件编辑功能。 在 wp-config.php 中添加 define('DISALLOW_FILE_EDIT', true),避免后台出现主题/插件编辑器。一旦被注入管理员权限,攻击者首先会去编辑器里写后门。

第八条:保持所有组件更新。 这不是编码规范,却是最重要的安全措施。无论是 WordPress 核心、主题还是插件,过时的版本都是已知漏洞的载体。

一旦发现网站已经被攻击,紧急处理流程如下:

  1. 立即关闭网站(可以通过插件或服务器配置返回 503)。

  2. 检查最近 7 天内被修改的文件(用命令行 find . -type f -mtime -7)。

  3. 检查数据库 wp_posts 和 wp_options 表中是否有不明内容。

  4. 检查是否有未知的管理员用户。

  5. 从官方渠道重新下载 WordPress 核心、主题和插件。

  6. 修改所有密码(数据库、FTP、主机后台、WordPress 管理员)。

  7. 恢复干净备份后,再上线观察。

安全不是某一项技术,而是贯穿整个开发过程的一套思维方式。