Ninja Forms – The Contact Form Builder That Grows With You

ninja-forms · by kstover · wordpress.org ↗ · SVN ↗
Active installs
600k+
Current version
3.14.3
Added
2011-12-21
Last updated
2026-04-29 (3d ago)
First seen by beacon
11d ago
Total downloads
59,358,855

Alerts (0)

No open alerts.

Show 3 resolved alerts
High committer_younger_than_plugin Resolved · benign_company_employee 2026-04-27 10:32:30 (5d ago)
Slugninja-forms
Committer slugericwindhamsd
Committer display nameericwindhamsd
Committer employer
Committer member since2017-12-12
Committer first commit2018-07-31 16:12:04
Committer commit count3
Plugin listed authorkstover
Earliest plugin commit2015-03-03 18:25:22
Plugin age at join days1,245
Committer age at join days231
Active installs600,000
View raw JSON
{
    "slug": "ninja-forms",
    "committer_slug": "ericwindhamsd",
    "committer_display_name": "ericwindhamsd",
    "committer_employer": null,
    "committer_member_since": "2017-12-12",
    "committer_first_commit": "2018-07-31 16:12:04",
    "committer_commit_count": 3,
    "plugin_listed_author": "kstover",
    "earliest_plugin_commit": "2015-03-03 18:25:22",
    "plugin_age_at_join_days": 1245,
    "committer_age_at_join_days": 231,
    "active_installs": 600000
}
Critical code_pattern Resolved · no_longer_matches 2026-04-24 17:01:47 (7d ago)
Slugninja-forms
Patternunserialize_after_remote_call
Kindbuiltin
Version3.14.2
Hit count5
First hit
File
includes/Admin/Menus/ImportExport.php
Line
128
Snippet
L111: $import = file_get_contents( $_FILES[ 'nf_import_fields' ][ 'tmp_name' ] ); → L128: $return = unserialize($serializedValue,['allowed_classes'=>false]);
Explanationa remote HTTP fetch (`wp_remote_*`/`curl_exec`/`file_get_contents`) is followed by `@unserialize` within the same file — classic PHP Object Injection C2 gadget used by EP and most WP supply-chain backdoors. The error-suppressed form is the tell: legit code wants to know when deserialize fails; attackers suppress so malformed gadgets do not leak.
View raw JSON
{
    "slug": "ninja-forms",
    "pattern": "unserialize_after_remote_call",
    "kind": "builtin",
    "version": "3.14.2",
    "hit_count": 5,
    "first_hit": {
        "file": "includes/Admin/Menus/ImportExport.php",
        "line": 128,
        "snippet": "L111: $import = file_get_contents( $_FILES[ 'nf_import_fields' ][ 'tmp_name' ] );  \u2192  L128: $return = unserialize($serializedValue,['allowed_classes'=>false]);"
    },
    "explanation": "a remote HTTP fetch (`wp_remote_*`/`curl_exec`/`file_get_contents`) is followed by `@unserialize` within the same file \u2014 classic PHP Object Injection C2 gadget used by EP and most WP supply-chain backdoors. The error-suppressed form is the tell: legit code wants to know when deserialize fails; attackers suppress so malformed gadgets do not leak."
}
Critical code_scan_delta Resolved · fp_edd_updater_library 2026-04-24 15:47:34 (7d ago)
Slugninja-forms
Previous version3.14.2
Current version3.14.2
New findings
PatternKindFileLineSnippetConfidence
unserialize_after_remote_callbuiltinincludes/Admin/Menus/ImportExport.php128L111: $import = file_get_contents( $_FILES[ 'nf_import_fields' ][ 'tmp_name' ] ); → L128: $return = unserialize($serializedValue,['allowed_classes'=>false]);high
unserialize_after_remote_callbuiltinincludes/Integrations/EDD/EDD_SL_Plugin_Updater.php426L419: $request = wp_remote_post( $this->api_url, array( 'timeout' => 15, 'sslverify' => $ve → L426: $request->sections = maybe_unserialize( $request->sections );high
unserialize_after_remote_callbuiltinincludes/Integrations/EDD/EDD_SL_Plugin_Updater.php432L419: $request = wp_remote_post( $this->api_url, array( 'timeout' => 15, 'sslverify' => $ve → L432: $request->banners = maybe_unserialize( $request->banners );high
unserialize_after_remote_callbuiltinincludes/Integrations/EDD/EDD_SL_Plugin_Updater.php436L419: $request = wp_remote_post( $this->api_url, array( 'timeout' => 15, 'sslverify' => $ve → L436: $request->icons = maybe_unserialize( $request->icons );high
unserialize_after_remote_callbuiltinincludes/Integrations/EDD/EDD_SL_Plugin_Updater.php494L486: $request = wp_remote_post( $this->api_url, array( 'timeout' => 15, 'sslverify' => $v → L494: $version_info->sections = maybe_unserialize( $version_info->sections );high
New finding count5
View raw JSON
{
    "slug": "ninja-forms",
    "previous_version": "3.14.2",
    "current_version": "3.14.2",
    "new_findings": [
        {
            "pattern": "unserialize_after_remote_call",
            "kind": "builtin",
            "file": "includes/Admin/Menus/ImportExport.php",
            "line": 128,
            "snippet": "L111: $import = file_get_contents( $_FILES[ 'nf_import_fields' ][ 'tmp_name' ] );  \u2192  L128: $return = unserialize($serializedValue,['allowed_classes'=>false]);",
            "confidence": "high"
        },
        {
            "pattern": "unserialize_after_remote_call",
            "kind": "builtin",
            "file": "includes/Integrations/EDD/EDD_SL_Plugin_Updater.php",
            "line": 426,
            "snippet": "L419: $request    = wp_remote_post( $this->api_url, array( 'timeout' => 15, 'sslverify' => $ve  \u2192  L426: $request->sections = maybe_unserialize( $request->sections );",
            "confidence": "high"
        },
        {
            "pattern": "unserialize_after_remote_call",
            "kind": "builtin",
            "file": "includes/Integrations/EDD/EDD_SL_Plugin_Updater.php",
            "line": 432,
            "snippet": "L419: $request    = wp_remote_post( $this->api_url, array( 'timeout' => 15, 'sslverify' => $ve  \u2192  L432: $request->banners = maybe_unserialize( $request->banners );",
            "confidence": "high"
        },
        {
            "pattern": "unserialize_after_remote_call",
            "kind": "builtin",
            "file": "includes/Integrations/EDD/EDD_SL_Plugin_Updater.php",
            "line": 436,
            "snippet": "L419: $request    = wp_remote_post( $this->api_url, array( 'timeout' => 15, 'sslverify' => $ve  \u2192  L436: $request->icons = maybe_unserialize( $request->icons );",
            "confidence": "high"
        },
        {
            "pattern": "unserialize_after_remote_call",
            "kind": "builtin",
            "file": "includes/Integrations/EDD/EDD_SL_Plugin_Updater.php",
            "line": 494,
            "snippet": "L486: $request    = wp_remote_post( $this->api_url, array( 'timeout' => 15, 'sslverify' => $v  \u2192  L494: $version_info->sections = maybe_unserialize( $version_info->sections );",
            "confidence": "high"
        }
    ],
    "new_finding_count": 5
}

SVN committers (5)

Accounts with actual commit access to ninja-forms on plugins.svn.wordpress.org, reconstructed from svn log. This is the list that matters for ownership changes — not the readme contributors.

Committer Member since Commits First commit Latest commit
krmoorhouse 2017-03-06 95 2017-12-13 · r1786386 2026-01-07 · r3434576
Kyle B. Johnson 2015-01-09 23 2016-07-26 · r1460918 2016-11-21 · r1537910
ericwindhamsd 2017-12-12 3 2018-07-31 · r1917743 2018-08-31 · r1933883
Kevin Stover 2010-07-27 3 2015-03-03 · r1104374 2021-06-07 · r2543837
Nicolas Figueira 2013-07-16 1 2021-08-17 · r2583990 2026-04-29 · r3518477

Readme contributors (12)

Names the plugin's readme declares as contributors. A soft signal — anyone can be listed. The SVN access column is the ground-truth cross-reference: does this contributor actually commit code?

Contributor Member since SVN access Status
krmoorhouse 2017-03-06 95 commits Active
Kyle B. Johnson 2015-01-09 23 commits Active
ericwindhamsd 2017-12-12 3 commits Active
Kevin Stover 2010-07-27 3 commits Active
Nicolas Figueira 2013-07-16 1 commits Active
James Laws 2010-03-04 Active
Justin McElhaney 2016-08-29 Active
klhall1987 2014-12-03 Active
Matt Pritchett 2011-06-14 Active
Stuart Sequeira 2011-12-22 Active
wpninjasllc 2015-02-05 Active
Zach Skaggs 2014-09-16 Active

Versions (33 most recent)

Version Released Download
3.14.3 2026-04-29 · 3d ago zip
3.14.2 2026-03-23 · 1mo ago zip
3.14.1 2026-02-05 · 2mo ago zip
3.14.0 2026-01-26 · 3mo ago zip
3.13.4 2026-01-15 · 3mo ago zip
3.12.2.1 2026-01-07 · 3mo ago zip
3.11.1.1 2026-01-07 · 3mo ago zip
3.10.4.1 2026-01-07 · 3mo ago zip
3.9.2.1 2026-01-07 · 3mo ago zip
3.8.25.1 2026-01-07 · 3mo ago zip
3.7.3.1 2026-01-07 · 3mo ago zip
3.6.34.1 2026-01-07 · 3mo ago zip
3.5.8.5 2026-01-07 · 3mo ago zip
3.4.34.3 2026-01-07 · 3mo ago zip
3.13.3 2025-12-09 · 4mo ago zip
3.13.2 2025-12-02 · 5mo ago zip
3.13.1 2025-11-12 · 5mo ago zip
3.13.0 2025-11-06 · 5mo ago zip
3.12.2 2025-10-13 · 6mo ago zip
3.11.1 2025-08-21 · 8mo ago zip
3.10.4 2025-07-07 · 9mo ago zip
3.9.2 2025-03-12 · 1y ago zip
3.8.25 2025-01-27 · 1y ago zip
3.7.3 2024-02-12 · 2y ago zip
3.6.34 2023-10-11 · 2y ago zip
3.2.28 2022-06-15 · 3y ago zip
3.5.8.4 2022-06-15 · 3y ago zip
3.3.21.4 2022-06-15 · 3y ago zip
3.4.34.2 2022-06-15 · 3y ago zip
3.1.10 2022-06-15 · 3y ago zip
3.0.34.2 2022-06-15 · 3y ago zip
3.0 2016-09-06 · 9y ago zip
2.9.58 2016-08-30 · 9y ago zip