Advanced Custom Fields 6.8.11 发布安全更新,修复多项权限与数据暴露问题
ACF 6.8.11 Security Release
Advanced Custom Fields 6.8.11 已发布,为 ACF 和 ACF PRO 修复多项安全问题。更新后仅保存已显示或位置规则匹配的字段,User 字段不再通过短代码和 block bindings 输出个人数据,关系类字段会尊重读取权限,密码保护文章的字段值在输入密码前不再公开。
原文列出了 ACF 6.8.11 的多项安全修复及受影响场景,可据此检查表单、双向字段和受密码保护内容的兼容性。
Advanced Custom Fields 6.8.11 现已推出。
本次发布包含 ACF 和 ACF PRO 的多项安全修复。
我们建议所有 ACF 和 ACF PRO 用户尽快升级。
其中一些修复会改变 ACF 保存和显示数据的方式,少数网站需要作出调整。请在更新前阅读以下摘要,尤其是在您使用前端表单、 短代码、区块绑定或向表单添加字段的自定义代码时。
变更内容及受影响对象
字段仅在显示过后才会保存
ACF 现在仅保存已在所提交表单中显示过的字段,或其字段组的位置规则与所保存内容相匹配的字段。这可以防止用户保存从未向其显示过的字段值。
大多数网站不会注意到任何差异。以下情况下,您可能会受到影响:
- 您自己的 JavaScript 会向表单添加 ACF 输入项。
- 自定义或第三方表单提交的 ACF 字段,其字段组未分配给相应内容。
- 您的注册表单使用了位置规则为“User Form is Add / Edit”的字段组。用户注册时,这些字段将不再保存。请将规则改为“User Form is Register”或“All”。
ACF 现在还会阻止 WordPress 内置的“自定义字段”元框编辑属于 ACF 字段的元数据。请改为通过 ACF 字段编辑这些值。
如果某个字段停止保存,请先检查其字段组的位置规则是否与字段使用位置相匹配。如果该字段是自定义代码有意添加的,请使用 acf/form/{context}/allowed_field_keys 过滤器允许它保存。{context} 是保存字段的位置,例如 post、user、taxonomy 或 options_page。启用 WP_DEBUG 和 WP_DEBUG_LOG 后,ACF 会记录每个未保存的字段,包括过滤器名称中要使用的上下文。
使用 acf_form() 创建的前端表单原本就只保存所显示的字段,本次发布不会改变这一点。若要在这些表单中允许额外字段,请继续使用现有的 acf/form/allowed_field_keys 过滤器。从这些表单中移除的字段不会被记录。
add_filter( 'acf/form/post/allowed_field_keys', function ( $keys, $post_id ) {
$keys[] = 'field_abc123';
return $keys;
}, 10, 2 );
短代码和区块绑定不再输出个人数据
短代码和 ACF 区块绑定现在对 User 字段仅输出用户 ID,而不再输出用户姓名、电子邮箱地址及其他详细信息。
如果您使用短代码或区块绑定显示 User 字段(例如作者署名),它现在会显示用户 ID,而不是其详细信息列表。最佳修复方法是使用 acf/format_value 将该值格式化为所需文本:
add_filter( 'acf/format_value/name=post_contact', function ( $value ) {
return is_array( $value ) && isset( $value['display_name'] ) ? $value['display_name'] : $value;
}, 20 );
若要完全恢复之前的输出,请使用 acf/bindings/allow_user_data 过滤器。这会向每位访问者显示用户的个人数据,包括其电子邮箱地址,因此请仅在您确实希望如此时使用。
有两项相关变更:
- 返回嵌套数据的字段,例如设置为返回 Image Array 的 Image 字段,以前会输出一串杂乱的值。现在不会输出任何内容。简单列表(例如 Checkbox 值)保持不变。
- 返回文章对象的字段,例如 Relationship 字段,以前会导致致命错误。现在不会输出任何内容。
对于上述两种情况,请更改字段的返回格式(例如 Image URL 或 Post ID),或在模板中使用 get_field()。
Relationship、Post Object 和 Page Link 字段遵守读取权限
这些字段现在仅显示当前用户有权读取的文章。搜索时,Contributor 和 Author 不再看到其他用户的草稿、待审核或定时发布文章,也无法选择这些文章。Editor 和 Administrator 不受影响。
如果 Editor 已选择了一篇其他用户无权读取的文章,该用户将看到“(Restricted item)”而不是文章标题。保存时,该选择会被保留。
在 ACF 区块中,前端会根据保存该区块的文章作者来检查这些值。如果区块引用了作者无权阅读的文章,例如另一位用户未发布的草稿,那么该区块不会对访客显示。通常的解决方法是发布被引用的文章。要关闭此检查,请使用 acf/fields/relational/hide_unreadable_posts 过滤器。主题模板中的 get_field() 保持不变。
授予单篇文章访问权限的会员和编辑插件可以使用 acf/user_can_read_post 和 acf/fields/relational/unreadable_post_statuses 过滤器。
双向字段:检查用户能否编辑另一侧
当用户保存双向字段时,ACF 现在只有在该用户能够编辑相应文章、分配相应术语或编辑相应用户时,才会在另一侧添加引用。能够编辑该文章类型下他人文章的任何用户,也都可以关联用户,正如他们此前已经能够将该用户设置为文章作者一样。如果用户无法更新另一侧,其自己的值仍会保存,但另一侧不会更新。
通过 update_field()、WP-CLI 或 cron 保存的值不会经过检查。未登录用户的前端表单会经过检查,因此不再更新双向字段的另一侧。如果希望访客能够创建这些关联,请使用 acf/bidirectional/can_update_target 过滤器,并将其范围限定为需要此功能的字段。要将你自己代码中的保存标记为可信,请使用 acf/is_trusted_save_context。
受密码保护的文章:字段值保持隐藏
在输入密码之前,受密码保护文章的字段值不再由 短代码、区块绑定、JSON-LD 输出或 REST API 显示。这与 WordPress 处理文章内容的方式一致,也适用于在前端查看内容的编辑人员。
通过 REST API 读取受保护文章字段的无头网站,需要发送该文章的 password 参数,或以有权编辑该文章的用户身份进行身份验证。引用受密码保护文章的关系字段和 Post Object 字段,现在会在 REST 响应中返回文章 ID,而不是完整的文章对象,除非用户能够编辑被引用的文章。如果有任何被引用的文章受到保护,整个字段都会返回 ID,其格式与 ?acf_format=light 相同。
由不具备 unfiltered_html 权限的用户保存的字段设置
现在,由不具备 unfiltered_html 能力的用户保存的字段、字段组、文章类型、分类法和选项页设置都会进行清理。在多站点中,这包括站点管理员,因为只有超级管理员具备此能力。<strong> 等安全 HTML 会保留,而 <script> 等不安全 HTML 会被移除。单站点上的管理员不受影响。
对于这些用户,字段的包装器设置仅限于宽度、class 和 id。字段包装器设置中的事件处理程序属性(例如 onclick)不再为任何字段输出,包括通过 PHP 或本地 JSON 注册的字段。如需有意添加此类属性,请使用 acf/field_wrapper_attributes 过滤器。
这也修复了一个长期存在的错误:包含 &、< 或某些 HTML 实体的设置可能会将字段重置为默认设置。
前端上传不再为不受信任的用户生成预览
由不具备 upload_files 能力的用户通过基本上传器(例如前端表单中的上传器)上传的文件,不再生成 PDF 预览图像,也不再保存嵌入音频和视频文件中的封面图。这包括未登录访客、订阅者和贡献者。通过媒体库上传的文件不受影响。
如果你信任通过表单上传文件的人,可以使用 acf/upload/generate_previews 过滤器重新启用预览。
限制谁可以添加自定义选项
复选框、单选框和选择字段会将提交的自定义值保存到字段选项中,其行为与以往相同。新增的 acf/fields/allow_append_choices 过滤器可限制谁能够添加新选项。如果访客可以在你的网站上提交这些字段,例如通过前端表单,我们建议使用该过滤器。
add_filter( 'acf/fields/allow_append_choices', function () {
return current_user_can( 'edit_posts' );
} );
我们要感谢 Jakub Herman 和 vuxvinh 通过 WPScan 负责任地披露了此版本中修复的漏洞。
总结
请查看下面的发行说明。要获取 ACF 的最新消息,请在 Twitter 上关注我们 @wp_acf。
我们极其重视 ACF 的安全,并始终致力于保护用户安全。如果你发现了代码漏洞或存在安全问题,请查看我们的安全页面以了解更多信息。
更新日志
- 安全 – 为启用了“保存自定义值”的复选框、单选框和选择字段提交的自定义值,不再能够破坏字段设置或向字段包装器添加 HTML 属性。新增的
acf/fields/allow_append_choices过滤器可用于限制谁能够向字段添加新选项。感谢 Jakub Herman 通过 WPScan 负责任地披露此问题 - 安全 – ACF 现在会清除用户保存的字段、字段组、文章类型、分类法和选项页设置中不含
unfiltered_html权限级别部分。对于这些用户,字段包装器设置仅限于宽度、class 和 id。字段包装器设置中的事件处理程序(on*)属性不再为任何字段输出,包括通过 PHP 或本地 JSON 注册的字段 - 安全 – 在输入密码之前,受密码保护文章的字段值不再由
短代码、区块绑定、JSON-LD 输出或 REST API 显示。REST 响应也不再将引用的受密码保护文章展开为完整的文章对象 - 安全 –
短代码和 ACF 区块绑定现在对用户字段仅输出用户 ID,而不再输出姓名、电子邮件地址等个人数据。可通过新增的acf/bindings/allow_user_data过滤器恢复之前的输出 - 安全 – 由不具备
upload_files权限级别的用户通过基础上传器上传的文件,不再生成 PDF 预览图,也不再保存内嵌音频和视频的封面图。可通过新增的acf/upload/generate_previews过滤器更改此设置 - 安全 – ACF 现在仅保存为正在保存的内容而显示的字段,或其字段组位置规则与之匹配的字段,从而防止用户保存从未向其显示过的字段的值。可通过
acf/form/{context}/allowed_field_keys和acf/options_page/allowed_field_keys过滤器允许这些规则之外的输入,例如通过 JavaScript 添加的字段。注册表单不再保存来自设置为“用户表单为添加 / 编辑”的字段组的字段。感谢 vuxvinh 通过 WPScan 负责任地披露此问题 - 安全 – WordPress 的自定义字段元框、AJAX 处理程序和 XML-RPC 不再能够更改属于 ACF 字段的元数据
- 安全 – 基础上传器的 nonce 现在与正在编辑的内容绑定
- 安全 – 编辑文章时加载字段组的 AJAX 请求不再返回分配给其他内容的字段组
- 安全 – 关系、文章对象和页面链接字段不再泄露当前用户无权阅读的文章标题或状态,也不再保存用户无权阅读的新选定文章。用户无权阅读的现有选择会显示为“(受限项)”,并在用户保存时保留。感谢 vuxvinh 通过 WPScan 负责任地披露此问题
- 安全性 – 在 ACF 区块中呈现的 Relationship、Post Object 和 Page Link 值现在会排除文章作者无权阅读的文章,例如另一位用户未发布的草稿。可通过新的
acf/fields/relational/hide_unreadable_posts过滤器禁用此功能 - 安全性 – 双向字段现在只会添加对当前用户可编辑的文章、其可分配的分类法项,以及其可编辑或可设置为文章作者的用户 的引用。使用
update_field()、WP-CLI 或 cron 进行的保存不会被检查,新的acf/bidirectional/can_update_target和acf/is_trusted_save_context过滤器可用于调整此行为。感谢 vuxvinh 通过 WPScan 负责任地披露此问题 - 修复 – 当字段返回对象(例如设置为返回文章对象的 Relationship 字段)时,
短代码和 ACF 区块绑定在 PHP 8 上不再引发致命错误。这些值以及数组值(例如设置为返回数组的 Image 字段)现在不会输出任何内容 - 修复 – 包含
&、<或特定 HTML 实体的字段设置在保存后不再导致字段恢复为默认设置 - 修复 – 保存自定义选项时不再从该字段的其他设置中移除反斜杠
如对本次发布有任何疑问或需要帮助,请联系我们的支持团队。
如对本次发布有任何疑问或需要帮助,请联系我们的支持团队。
文章 ACF 6.8.11 安全版首次发布于 ACF。
来源:Advanced Custom Fields 官方博客 · https://www.advancedcustomfields.com/blog/acf-6-8-11-security-release/
部分链接为推广/关联链接。