WP Manifestindependent plugin directory
manifest / analytics / nicen-replay

nicen-replay WP Registry grade D+. High-severity findings · 3 findingsWP RegistryHigh-severity findings · 3 findingsOpen the reportD+

一款可以监控并回放用户行为的wordpress插件

★ 19stars
1.0.2latest · 1 year 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/friend-nicen/nicen-replay/archive/refs/heads/master.zip
No built-in updater. New versions won't appear under Dashboard → Updates. Install new releases yourself, or let Git Updater track the repository.
/**
Plugin Name: nicen-replay
Plugin URI: https://nicen.cn/7565.html
Description: 一款可以监控并回放用户行为的插件
Version: 1.0.0
Author: 友人a丶
Author URI: https://nicen.cn
Text Domain: nicen-replay
License: GPLv2 or later
 */

插件介绍

在数字营销的世界里,了解用户行为是提升用户体验和转化率的关键。nicen-replay 插件,它能够让您轻松回放用户在网站上的每一步操作,从点击到滚动,再到表单填写,每一个细节都清晰可见。

nicen-replay

nicen-replay,是一款可以监控并回放用户行为的插件,支持如下功能:

数据收集:在不影响站点速度的情况下,收集用户在站点上的操作, 实时回放:插件后台可以回放用户的所有行为,通过视频的方式来帮助你分析用户行为 ...

Github:https://github.com/friend-nicen/nicen-replay

Gitee:https://gitee.com/friend-nicen/nicen-replay

注意:启用插件后,需要将插件目录下的events目录设置为可写,这个目录将用于存放用户行为数据

使用场景

  1. 理解用户需求:通过观察用户在网站上的行为,我们可以了解他们的兴趣点和需求。
  2. 优化用户体验:发现并解决用户在使用网站过程中遇到的问题,提升整体体验。
  3. 提高转化率:通过分析用户行为,我们可以优化网站布局和内容,提高用户转化率。
  4. 收集反馈:用户的行为可以作为最直接的反馈,帮助我们不断改进产品。

在线体验

演示站:https://nicen.cn

实时回放演示站:https://nicen.cn/wp-content/plugins/nicen-replay/response/player.html?api=https://nicen.cn

性能说明

日志上报是上行带宽,不会占用服务器的下行带宽,简单说就是不影响网站的加载速度。 日志存的是纯文本,不走数据库,性能问题忽略不计 唯一的问题就是日志占磁盘空间

Pro版

Pro版 50元,无授权无限制,拉群包更新,如有需要或有任何问题请联系微信good7341,支持如下功能,

  • 支持单个用户多次访问时记录多条事件日志。
  • 日志回放界面支持直接删除指定的事件日志。
  • 支持IP黑名单、白名单功能,指定IP录制或者不录制。
  • 支持按照标签、目录、链接排除指定文章录制或者不录制。
  • 支持浏览器ua黑名单、用户名黑名单。
  • 支持定时任务,自动删除日志。
  • 支持自定义IP地址查询接口。
  • 支持日志文件批量删除。
  • 支持GZIP压缩,占用的存储空间减少80%。
  • 速度更快,性能更强
  • 支持日志导入和导出
  • 内置日志播放器,无需加载CDN文件
  • 更加完善的日志管理功能
  • 还有更多功能正在开发....

Releases

2 releases.

Tag
Published
1.0.2 latest
Jul 25, 2025 1 year ago
Oct 15, 2024 2 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

nicen-replay 1.0.0 · audited by WP Registry

High-severity findings.

1 high 2 medium
Audited release
1.0.0
Findings
3
Worst severity
high
Content hash
584e45387549334d89cf98e4…

Findings

  • high Session recordings are web-reachable; list/download APIs only check a GET secret

    missing_auth

    Nicen_Replay_response runs on plugins_loaded for every front-end request. nicen_replay_event has no authentication and FILE_APPENDs base64-decoded bodies to nicen_replay_path/events/{nicen_replay_plugin_private}/{Y-m-d}/{ip}.txt (mkdir 0777). That directory is inside the plugin webroot; events/ contains only a .gitignore (no index.php, no .htaccess deny). The folder name is the same value stored in option nicen_replay_plugin_private, which auth() compares with loose != against $_GET/$_POST['private']—there is no current_user_can, is_user_logged_in, or nonce. admin/render.php then loads the world-readable static file response/player.html?api={site_url}&private={secret} in an iframe, and the CDN player posts that secret back to /?nicen_replay_get_all_logs=1 and /?nicen_replay_get_event=1. On any host that lists directories (or once the player URL/access logs leak), an unauthenticated client learns the secret, downloads every visitor's rrweb log as a static .txt (bypassing even json_decode), and calls the list/download APIs with no WordPress session. Recordings include form field values from the public site (login identifiers, checkout/address fields; rrweb masks type=password only). The secret itself is md5(time().rand(0,9999)), not a CSPRNG.

    response/api.php:15-18,182-191

    Recommendation

    Store recordings outside the document root (or deny HTTP to events/ with nginx location + Apache .htaccess + index.php). Authenticate list/download with current_user_can('manage_options') plus a POST nonce; do not put the API secret in GET URLs or directory names. Generate nicen_replay_plugin_private with wp_generate_password() / random_bytes() and never echo it into a publicly reachable player.html. Serve the player from an admin-only PHP wrapper.

  • medium get_event/get_all_logs path traversal via date/file/ip JSON fields

    file_access

    After auth() succeeds, nicen_replay_get_event builds $file_path = $this->root . $date . '/' . $file using sanitize_text_field() on php://input JSON. sanitize_text_field does not strip ../, and there is no realpath/str_starts_with confinement to $this->root. POST date=../../../../..& file=composer.json (or any other on-disk JSON document) causes file_get_contents of files outside the events tree; each line is json_decode'd and returned. nicen_replay_get_all_logs concatenates the same $date and $ip into glob(), so date=../.. or date=* lists plugin/PHP files and other users' logs. php://input bypasses wp_magic_quotes. Impact is limited to files that json_decode (wp-config.php lines become nulls) and requires the private key, which finding 1 shows is not equivalent to a manage_options session.

    response/api.php:206-257

    Recommendation

    Resolve realpath($file_path) and reject unless it is inside realpath($this->root). Use basename() on $file, allowlist $date as /^\d{4}-\d{2}-\d{2}$/, and treat $ip as a literal filename (no glob metacharacters).

  • medium Unauthenticated event endpoint appends unbounded data into 0777 webroot files

    dos

    POST /?nicen_replay_event=1 is reachable by anyone (no capability, nonce, origin check, size cap, or rate limit). The client-chosen JSON ip is sanitize_file_name'd and becomes the log filename, so an attacker can append into another visitor's YYYY-MM-DD/{ip}.txt and poison the admin replay. events is base64_decode'd and FILE_APPENDed as-is; mkdir(..., 0777, true) creates world-writable date folders under the plugin directory. Observable consequence is disk exhaustion (WordPress can no longer write) plus contaminated session files the administrator then opens in player.html. This is the intended beacon, but without quotas it is an unauthenticated write sink in a web-reachable path.

    response/api.php:120-166

    Recommendation

    Keep the beacon public if needed, but write outside the document root with 0750 dirs, cap body size, rate-limit per IP, bind the filename to a server-derived ID rather than client-supplied ip, and reject non-JSON payloads after decode.

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.