{"id":11367,"date":"2026-05-30T05:29:56","date_gmt":"2026-05-29T21:29:56","guid":{"rendered":"https:\/\/aeosub.com\/plugseal\/"},"modified":"2026-05-30T05:29:56","modified_gmt":"2026-05-29T21:29:56","slug":"plugseal","status":"publish","type":"post","link":"https:\/\/aeosub.com\/zh\/plugseal\/","title":{"rendered":"PlugSeal"},"content":{"rendered":"<div class=\"plugin-info-card\" style=\"border: 1px solid #e2e8f0;border-radius: 10px;overflow: hidden;margin-bottom: 30px;font-family: -apple-system, system-ui, sans-serif;background: #fff\">\n<table style=\"width: 100%;border-collapse: collapse;font-size: 14px\">\n<tr style=\"border-bottom: 1px solid #edf2f7\">\n<th style=\"padding: 15px 20px;text-align: left;width: 35%;color: #4a5568;background: #fcfcfc\"><img decoding=\"async\" src=\"https:\/\/ps.w.org\/plugseal\/assets\/icon-256x256.jpg?rev=3554199\" style=\"width: 40px;height: 40px;border-radius: 6px;margin-right: 12px;vertical-align: middle\"> Developer<\/th>\n<td style=\"padding: 15px 20px;font-weight: 500\"><a href=\"https:\/\/profiles.wordpress.org\/marc4\/\" target=\"_blank\" rel=\"noopener\">Marc Armengou<\/a><\/td>\n<\/tr>\n<tr style=\"border-bottom: 1px solid #edf2f7\">\n<th style=\"padding: 12px 20px;text-align: left;color: #4a5568;background: #fcfcfc\">Version<\/th>\n<td style=\"padding: 12px 20px\">v0.1.0<\/td>\n<\/tr>\n<tr style=\"border-bottom: 1px solid #edf2f7\">\n<th style=\"padding: 12px 20px;text-align: left;color: #4a5568;background: #fcfcfc\">Active Installs<\/th>\n<td style=\"padding: 12px 20px\">0 +<\/td>\n<\/tr>\n<tr style=\"border-bottom: 1px solid #edf2f7\">\n<th style=\"padding: 12px 20px;text-align: left;color: #4a5568;background: #fcfcfc\">Requires \/ Tested<\/th>\n<td style=\"padding: 12px 20px\">6.6 \/ 7.0<\/td>\n<\/tr>\n<tr style=\"border-bottom: 1px solid #edf2f7\">\n<th style=\"padding: 12px 20px;text-align: left;color: #4a5568;background: #fcfcfc\">Last Updated<\/th>\n<td style=\"padding: 12px 20px\">2026-05-29 9:16pm GMT<\/td>\n<\/tr>\n<tr>\n<th style=\"padding: 12px 20px;text-align: left;color: #4a5568;background: #fcfcfc\">Official Link<\/th>\n<td style=\"padding: 12px 20px\"><a href=\"https:\/\/wordpress.org\/plugins\/plugseal\/\" target=\"_blank\" style=\"text-decoration: none;color: #4a3bca;font-weight: bold\" rel=\"noopener\">View Details \u2192<\/a><\/td>\n<\/tr>\n<\/table><\/div>\n<div class=\"plugin-short-desc\" style=\"margin: 20px 0;padding: 12px 15px;background: #f9fafb;border-left: 4px solid #4a3bca;border-radius: 6px;font-style: italic;color: #4a5568\">Control what each active plugin is allowed to do. Allow or deny specific permissions per plugin, with immediate effect.<\/div>\n<p>PlugSeal gives administrators granular control over what each active plugin is allowed to do, inspired by Android app permissions. Each active plugin is listed in the settings page. For each plugin, administrators can allow or deny individual permissions with immediate effect. All permissions are allowed by default, so no existing functionality is broken until an administrator explicitly restricts it.<\/p>\n<p><strong>Permissions covered:<\/strong><\/p>\n<ul>\n<li><code>db:read<\/code> \/ <code>db:write<\/code> \u2014 database queries via $wpdb<\/li>\n<li><code>db:read:users<\/code> \/ <code>db:write:users<\/code> \u2014 read and write access to user data (also covers wp_delete_user and wp_update_user)<\/li>\n<li><code>http:outbound<\/code> \u2014 outbound HTTP requests via the WordPress HTTP API<\/li>\n<li><code>options:read<\/code> \/ <code>options:write<\/code> \u2014 WordPress options via get_option \/ update_option (see limitations)<\/li>\n<li><code>email:send<\/code> \u2014 sending email via wp_mail()<\/li>\n<li><code>cron:write<\/code> \u2014 scheduling events via wp_schedule_event()<\/li>\n<li><code>transients:write<\/code> \u2014 writing transients via set_transient()<\/li>\n<li><code>users:create<\/code> \u2014 creating users via wp_create_user() (updates and deletes are covered by db:write:users)<\/li>\n<li><code>rest:register<\/code> \u2014 registering REST API endpoints via register_rest_route()<\/li>\n<li><code>shortcode:register<\/code> \u2014 registering shortcodes via add_shortcode()<\/li>\n<li><code>rewrite:register<\/code> \u2014 registering rewrite rules via add_rewrite_rule()<\/li>\n<li><code>admin:menu<\/code> \u2014 adding entries to the admin menu and submenus<\/li>\n<li><code>dashboard:widget<\/code> \u2014 adding dashboard widgets via wp_add_dashboard_widget()<\/li>\n<li><code>hooks:frontend<\/code> \u2014 hooking into frontend hooks (wp_head, wp_footer, the_content, wp_enqueue_scripts&#8230;)<\/li>\n<li><code>hooks:admin<\/code> \u2014 hooking into admin hooks (admin_head, admin_notices, admin_enqueue_scripts&#8230;)<\/li>\n<li><code>hooks:auth<\/code> \u2014 hooking into authentication hooks (wp_login, wp_logout, user_register, authenticate&#8230;)<\/li>\n<li><code>hooks:content<\/code> \u2014 hooking into content hooks (save_post, delete_post, pre_get_posts, wp_handle_upload&#8230;)<\/li>\n<li><code>hooks:lifecycle<\/code> \u2014 hooking into plugin and theme lifecycle hooks (activated_plugin, deactivated_plugin, switch_theme&#8230;)<\/li>\n<\/ul>\n<p><strong>Honest limitations:<\/strong><\/p>\n<p>This plugin intercepts official WordPress APIs by identifying the calling plugin via the PHP call stack. It cannot intercept calls made by WordPress core on behalf of a plugin \u2014 for example, when WordPress processes a settings form via <code>options.php<\/code>, the call stack contains core files rather than the plugin files.<\/p>\n<p>Specific limitations:<\/p>\n<ul>\n<li><code>options:read<\/code> \/ <code>options:write<\/code> \u2014 work when a plugin calls these APIs directly from its own code (hooks, AJAX, cron). Do not block standard WordPress settings forms processed by <code>options.php<\/code>.<\/li>\n<li>Filesystem access (<code>file_get_contents<\/code>, <code>fopen<\/code>, etc.) is not intercepted.<\/li>\n<li>Direct <code>mysqli<\/code> connections, <code>eval()<\/code>, and raw PHP file functions bypass all interceptors.<\/li>\n<li><code>wp_update_user()<\/code> and <code>wp_delete_user()<\/code> are covered by <code>db:write:users<\/code> since they write directly to the users table.<\/li>\n<li><code>admin_init<\/code> is intentionally excluded from <code>hooks:admin<\/code> as it is too critical to block safely.<\/li>\n<\/ul>","protected":false},"excerpt":{"rendered":"<p>Control what each active plugin is allowed to do. Allow or deny specific permissions per plugin, with immediate effect.<\/p>","protected":false},"author":1,"featured_media":9317,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"inline_featured_image":false,"footnotes":""},"categories":[252],"tags":[1692,1027,2572,664,555],"class_list":["post-11367","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-trends","tag-access-control","tag-hardening","tag-permissions","tag-security","tag-wordpress-plugin"],"_links":{"self":[{"href":"https:\/\/aeosub.com\/zh\/wp-json\/wp\/v2\/posts\/11367","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/aeosub.com\/zh\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/aeosub.com\/zh\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/aeosub.com\/zh\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/aeosub.com\/zh\/wp-json\/wp\/v2\/comments?post=11367"}],"version-history":[{"count":0,"href":"https:\/\/aeosub.com\/zh\/wp-json\/wp\/v2\/posts\/11367\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/aeosub.com\/zh\/wp-json\/wp\/v2\/media\/9317"}],"wp:attachment":[{"href":"https:\/\/aeosub.com\/zh\/wp-json\/wp\/v2\/media?parent=11367"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/aeosub.com\/zh\/wp-json\/wp\/v2\/categories?post=11367"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/aeosub.com\/zh\/wp-json\/wp\/v2\/tags?post=11367"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}