WP Manifestindependent plugin directory
manifest / forms / fforms

FForms WP Registry grade D+. High-severity findings · 2 findingsWP RegistryHigh-severity findings · 2 findingsOpen the reportD+

Forms for WordPress. Support: block-editor Gutenberg, SMTP & REST API (Headless CMS)

★ 5stars
0.6latest · 3 years ago

Install

Download source zip No release zip yet

This is the repository archive. It installs, but the folder name will carry the branch suffix and updates will not flow.

Install straight from GitHub with WP-CLI:

wp plugin install https://github.com/aiiddqd/fforms/archive/refs/heads/main.zip
No built-in updater. New versions won't appear under Dashboard → Updates. Install new releases yourself, or let Git Updater track the repository.

Современный WordPress-плагин для contact/lead-форм с REST-first архитектурой.

Use cases

  • contact forms
  • lead forms
  • public forms, quizzes, surveys and brief forms
  • headless cms and email smtp for form submissions from JAMStack sites like AstroJS

Два режима

У плагина ровно две точки входа.

Headless API — один роут POST /wp-json/fforms/v1/main без схемы. Форму создавать не нужно: какие поля передали, такие и записали, а formType классифицирует заявку, чтобы записи можно было фильтровать. Без formType заявка получает тип main.

curl -X POST https://example.com/wp-json/fforms/v1/main \
  -H "Content-Type: application/json" \
  -d '{ "formType": "consultation", "email": "anna@example.com", "company": "Acme" }'

Конструктор — форма собирается блоками в Gutenberg и после публикации доступна сразу всеми способами: блок Form by FForms, шорткод [fform id=123], а если включить «Share via link» в панели «Publication» — ещё и секретная ссылка /forms/<токен>/ (без индексации), iframe- и js-сниппеты. Ссылку можно перевыпустить: старая перестаёт работать сразу.

Быстрый старт

  1. Активируйте плагин и откройте FForms → Добавить форму.
  2. Соберите поля блоками и опубликуйте форму.
  3. Вставьте её блоком или шорткодом; для внешнего сайта включите «Share via link» и скопируйте нужный сниппет.
  4. Записи доступны в FForms → Записи, экспорт — в FForms → Экспорт CSV.

Пример submit из формы конструктора:

{
  "form_id": 123,
  "fields": {
    "name": "Анна",
    "email": "anna@example.com",
    "message": "Перезвоните мне"
  },
  "website": "",
  "source": "https://example.com/contact"
}

Встроенный SMTP выключен по умолчанию. Не включайте его одновременно с другим SMTP-плагином.

Локальная разработка (wp-env)

Требуется Docker и Node 20+.

make install
make start        # http://localhost:8890 — admin/password
make status       # проверить, что всё поднялось

Плагин монтируется в контейнер из этой папки ("plugins": ["."] в .wp-env.json), правки в PHP/JS видны сразу без перезапуска. Ядро WordPress качается в контейнер ("core": null — последний стабильный).

Полный список целей — make help. Те же операции есть и как npm-скрипты:

make npm Действие
make start npm run env:start поднять окружение
make stop npm run env:stop остановить
make restart — остановить и поднять заново
make update npm run env:restart обновить ядро WordPress (--update)
make reset npm run env:reset сбросить БД и переустановить WP
make destroy npm run env:destroy удалить контейнеры и тома
make xdebug — поднять с включённым Xdebug
make logs npm run env:logs логи PHP и Docker
make tail — следить за wp-content/debug.log
make cli CMD="plugin list" npm run wp -- plugin list WP-CLI
make bash — шелл внутри контейнера
make status — версии WP/PHP, состояние плагина и блока

Порт 8890 выбран, чтобы не конфликтовать с окружением монорепо wpcraft на 8888. Тестовое окружение отключено ("testsEnvironment": false) — включите, когда появятся PHPUnit-тесты. Локальные переопределения — в .wp-env.override.json (в git не попадает).

WP_DEBUG и SCRIPT_DEBUG включены, PHP-ошибки пишутся в wp-content/debug.log внутри контейнера:

make tail

Releases

3 releases.

Tag
Published
0.6 latest
Feb 5, 2023 3 years ago
0.5
Feb 2, 2023 3 years ago
0.2
Jul 3, 2022 4 years ago

These releases are tags only. The author does not attach a packaged zip, so there are no download counts to report.

D+ grade

Security

FForms 0.6 · audited by WP Registry

High-severity findings.

1 high 1 medium
Audited release
0.6
Findings
2
Worst severity
high
Content hash
80149d1bdd31092f73870a3b…

Findings

  • high Missing edit_post capability allows any logged-in user to overwrite arbitrary posts

    missing_capability

    save_data verifies feditor_nonce and that the user is logged in, then loads $_POST['post_id'] and calls wp_insert_post without current_user_can('edit_post', $id). It always sets post_author to the current user. PublishGroup maps POST post_status=publish into the save payload. A Subscriber can deface any post/page and claim authorship.

    feditor.php:64-99

    Recommendation

    Require current_user_can('edit_post', $post_id) for updates and 'publish_posts'/'edit_posts' for create. Do not allow clients to force post_author. Sanitize post_content with wp_kses_post.

  • medium Unescaped post title in editor form and unsanitized post_content on save

    xss_stored

    PostTitle view prints get_post()->post_title into a value attribute with %s and no esc_attr. Content save assigns raw $data['post_content'] into wp_insert_post. Combined with the IDOR, this enables stored XSS and HTML injection into site content.

    includes/PostTitle.php:20-30

    Recommendation

    Use esc_attr for title output and wp_kses_post (or similar) before saving content.

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.