WP Manifestindependent plugin directory
manifest / content / fieldpress

FieldPress WP Registry grade C-. High-severity findings · 1 findingWP RegistryHigh-severity findings · 1 findingOpen the reportC-

Gutenberg for site builders, ACF for clients.

★ 1stars
21release downloads
≈10active sites
v1.2.0latest · 3 years ago

Install

Download field-press.zip From the v1.2.0 release on GitHub, Apr 30, 2023

Upload it under Plugins → Add New Plugin → Upload Plugin, then activate.

Install straight from GitHub with WP-CLI:

wp plugin install https://github.com/crosslink-ch/fieldpress/releases/download/v1.2.0/field-press.zip
No built-in updater. New versions won't appear under Dashboard → Updates. Install new releases yourself, or let Git Updater track the repository.

Gutenberg for site builders, ACF for clients.

Releases

3 releases. Each count is every asset in that release; expand a row for the breakdown.

Tag
Published
Assets
Downloads
v1.2.0 latest
Apr 30, 2023 3 years ago
field-press.zip
7
Apr 30, 2023 3 years ago
field-press.zip
4
Apr 30, 2023 3 years ago
field-press.zip
10

Active-site estimate ≈10 comes from the median of recent superseded releases. Method.

C- grade

Security

FieldPress 1.2.0 · audited by WP Registry

High-severity findings.

1 high
Audited release
1.2.0
Findings
1
Worst severity
high
Content hash
dde4cd2761739cf8a2cb776a…

Findings

  • high Stored XSS via unescaped ACF {{{ field }}} interpolation in rendered blocks

    xss_stored

    DynamicData::render_block_data runs on every block render (frontend and REST-rendered content) with no capability check. It regex-replaces {{{ field }}} (optional whitespace) in innerHTML and each innerContent string by calling ACF get_field($field, get_the_ID()) and inserting the return value unchanged. get_field() is invoked with two arguments, so ACF 6.2.6+ $escape_html stays false and the value is raw post meta. WordPress render_block() then echoes those chunks as the HTML document; <script> and inline event handlers in the field execute for every visitor of the published post. Write path is the post editor (core edit_post + ACF’s own nonce): Subscriber/customer cannot use it; Contributor can save the payload on their own posts (and add the placeholder as ordinary paragraph text, which kses does not strip); Author can publish. That is an unfiltered_html bypass — WordPress kses post_content for those roles, but ACF text/textarea values are stored as meta and this plugin splices them into the page at view time. The field name is taken from the token ([^}]+), so the actor can also surface ACF fields that the field-group UI hides from their role. Reusable core/block is skipped, but nested innerBlocks are processed recursively. Util::get_field() is a separate unused wrapper and is not this sink. Assets::init is commented out and is not involved.

    src/DynamicData.php:23-49

    Recommendation

    Escape at the sink: pass true as get_field()'s fourth argument (ACF ≥ 6.2.6) or wrap the return in wp_kses_post() / esc_html() depending on whether the token is meant to allow HTML. If raw HTML is required, restrict interpolation to content last saved by a user with unfiltered_html, or allowlist field names instead of accepting [^}]+ from post_content. Do not treat Contributor-authored {{{ … }}} as a trusted template. Keep ACF inactive-safe with function_exists('get_field') so missing ACF is not a fatal on every render.

WP Registry hashes the installable build and reports on that exact bytes-for-bytes copy. Embargoed findings are withheld until they are disclosed, so a clean verdict means nothing public is outstanding. WP Manifest does not audit code itself.