{"id":6,"date":"2026-08-29T10:15:27","date_gmt":"2026-08-29T10:15:27","guid":{"rendered":"https:\/\/wp-opsec.eagleeye-intelligence.com\/?page_id=6"},"modified":"2026-08-29T10:35:19","modified_gmt":"2026-08-29T10:35:19","slug":"wp-opsec","status":"publish","type":"page","link":"https:\/\/wp-opsec.eagleeye-intelligence.com\/","title":{"rendered":"WP Opsec"},"content":{"rendered":"\n<div style=\"display:flex;gap:22px;align-items:center;flex-wrap:wrap;margin-bottom:8px\">\n  <svg viewBox=\"0 0 120 132\" width=\"104\" height=\"114\" role=\"img\" aria-label=\"WP Opsec layered shield mark\" style=\"flex:none\">\n    <defs>\n      <linearGradient id=\"wpo-shield\" x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1\">\n        <stop offset=\"0\" stop-color=\"#2271b1\"\/>\n        <stop offset=\"1\" stop-color=\"#124f80\"\/>\n      <\/linearGradient>\n    <\/defs>\n    <path d=\"M60 4 L112 22 v42 c0 34-23 55-52 64 C31 119 8 98 8 64 V22 Z\" fill=\"url(#wpo-shield)\"\/>\n    <path d=\"M60 20 L97 33 v31 c0 25-17 41-37 48 C40 105 23 89 23 64 V33 Z\" fill=\"none\" stroke=\"#ffffff\" stroke-opacity=\".45\" stroke-width=\"2\"\/>\n    <path d=\"M60 36 L82 44 v20 c0 16-11 26-22 31 C49 90 38 80 38 64 V44 Z\" fill=\"none\" stroke=\"#ffffff\" stroke-opacity=\".7\" stroke-width=\"2\"\/>\n    <path d=\"M46 65 l10 11 20-24\" fill=\"none\" stroke=\"#ffffff\" stroke-width=\"5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\/>\n  <\/svg>\n  <p style=\"flex:1;min-width:260px;font-size:1.3rem;line-height:1.5;margin:0\">A modular WordPress security plugin built around one idea: block what can be blocked <em>before WordPress finishes loading<\/em>, and make everything else visible enough to act on.<\/p>\n<\/div>\n\n\n\n<p class=\"wp-block-paragraph\">Twelve independent modules \u2014 IP reputation, request scanning, login protection, file integrity, vulnerability scanning and more \u2014 each shipping in log-only mode until you trust what it catches.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Why this exists<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The design follows what current data actually says about how WordPress sites get compromised, rather than what is easiest to write signatures for:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n\n<li><strong>91%<\/strong> of the 11,334 WordPress vulnerabilities disclosed in 2025 were in plugins \u2014 not core, not themes.<\/li>\n\n\n<li><strong>~60%<\/strong> of infections exploit a flaw that <em>already had a patch available<\/em>.<\/li>\n\n\n<li>Median time from disclosure to mass exploitation: <strong>about five hours<\/strong>.<\/li>\n\n\n<li><strong>43%<\/strong> of plugin vulnerabilities are exploitable without authenticating at all.<\/li>\n\n\n<li>Typical hosting-level defences blocked only <strong>12%<\/strong> of WordPress-specific attacks.<\/li>\n\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Two consequences shaped the plugin. A human reading a report loses a five-hour race, so the update path is automated rather than merely reported. And because the 2026 supply-chain backdoors survived by creating hidden administrator accounts, detecting <em>that<\/em> step matters more than detecting the obfuscated code that performed it.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">The twelve modules<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Blocking the request<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n\n<li><strong>IP Blocklist<\/strong> \u2014 pulls CINS Army, DShield, Spamhaus DROP and FireHOL feeds daily, compiles them into a merged sorted-range file and binary-searches it with no database hit. Also enforces a shared local list that other modules escalate into.<\/li>\n\n\n<li><strong>Query Guard<\/strong> \u2014 signature scanning for SQLi, XSS, traversal and command injection in query strings, plus a deliberately narrower set for POST bodies and file uploads. Optional xmlrpc.php blocking with a Jetpack exemption.<\/li>\n\n\n<li><strong>Login Guard<\/strong> \u2014 per-IP failed-login rate limiting with lockout, escalating repeat offenders to the early gate so a bot stops receiving the login page at all.<\/li>\n\n\n<li><strong>User Enumeration<\/strong> \u2014 blocks <code>?author=N<\/code> probing, anonymous REST user listing and oEmbed author leakage. A known-valid username halves the work of a brute force.<\/li>\n\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Detecting compromise<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n\n<li><strong>File Integrity<\/strong> \u2014 core verified against WordPress.org&#8217;s published checksums, which is authoritative even if the plugin was installed <em>after<\/em> a compromise. Plugins and themes are compared against a local baseline, since no published checksums exist for them.<\/li>\n\n\n<li><strong>User Watchdog<\/strong> \u2014 watches privileged accounts through WordPress hooks, and separately by hourly snapshot diff, which catches an administrator inserted straight into the database by raw SQL where no hook ever fires.<\/li>\n\n\n<li><strong>Hardening<\/strong> \u2014 disables the dashboard file editor, blocks PHP execution in uploads, and finds plugins that hide themselves from the Plugins screen by filtering it.<\/li>\n\n\n<li><strong>Vulnerability Scan<\/strong> \u2014 flags outdated components, plugins pulled from the .org directory, and anything unmaintained for two years or more. An optional WPScan token adds real CVE records.<\/li>\n\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Closing the loop<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n\n<li><strong>Auto Updates<\/strong> \u2014 installs what the vulnerability scan flagged, rather than waiting for someone to read the report. Only ever adds to what you already enabled per plugin; an explicit exclusion list is the one thing that turns an update off.<\/li>\n\n\n<li><strong>Security Headers<\/strong> \u2014 CSP, HSTS, frame and referrer policy. The two that can genuinely break a site are off by default, and HSTS understands sitting behind a TLS-terminating proxy.<\/li>\n\n\n<li><strong>Event Log<\/strong> \u2014 one filterable table every module writes to, so the answer to &#8220;what happened&#8221; is not an SSH session and a <code>grep<\/code>.<\/li>\n\n\n<li><strong>Telegram Alerts<\/strong> \u2014 real-time notification for events above a severity threshold, with a cooldown so a scanner cannot flood the channel.<\/li>\n\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">How it works<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Blocking happens before WordPress loads<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">The enforcement layer is a must-use plugin that runs before the rest of WordPress bootstraps. Modules drop individual check files into it, and a blocked request never reaches theme or plugin code. This is also why alerting is wired directly into the logging function rather than a WordPress action hook: a real block calls <code>wp_die()<\/code> immediately, so <code>plugins_loaded<\/code> never fires for exactly the requests most worth knowing about.<\/p>\n\n\n\n<svg viewBox=\"0 0 920 330\" role=\"img\" aria-label=\"Request flow: a request meets the must-use plugin gate before WordPress loads. Blocked requests return 403 immediately; allowed requests continue into WordPress, where hook-based modules run. Both paths write to the event log, which can notify Telegram.\" style=\"display:block;margin-left:auto;margin-right:auto;width:100%;height:auto;max-width:920px;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,sans-serif\">\n  <defs>\n    <marker id=\"wpo-ar\" viewBox=\"0 0 10 10\" refX=\"9\" refY=\"5\" markerWidth=\"7\" markerHeight=\"7\" orient=\"auto-start-reverse\">\n      <path d=\"M0 0 L10 5 L0 10 z\" fill=\"#646970\"\/>\n    <\/marker>\n    <marker id=\"wpo-ar-red\" viewBox=\"0 0 10 10\" refX=\"9\" refY=\"5\" markerWidth=\"7\" markerHeight=\"7\" orient=\"auto-start-reverse\">\n      <path d=\"M0 0 L10 5 L0 10 z\" fill=\"#c9356a\"\/>\n    <\/marker>\n  <\/defs>\n\n  <!-- request -->\n  <rect x=\"6\" y=\"58\" width=\"112\" height=\"66\" rx=\"8\" fill=\"#f6f7f7\" stroke=\"#dcdcde\"\/>\n  <text x=\"62\" y=\"88\" text-anchor=\"middle\" font-size=\"14\" font-weight=\"600\" fill=\"#1d2327\">Request<\/text>\n  <text x=\"62\" y=\"107\" text-anchor=\"middle\" font-size=\"11\" fill=\"#646970\">from the internet<\/text>\n  <line x1=\"118\" y1=\"91\" x2=\"156\" y2=\"91\" stroke=\"#646970\" stroke-width=\"2\" marker-end=\"url(#wpo-ar)\"\/>\n\n  <!-- early gate -->\n  <rect x=\"158\" y=\"40\" width=\"242\" height=\"102\" rx=\"8\" fill=\"#eef4fa\" stroke=\"#2271b1\" stroke-width=\"2\"\/>\n  <text x=\"279\" y=\"65\" text-anchor=\"middle\" font-size=\"14\" font-weight=\"700\" fill=\"#124f80\">must-use plugin gate<\/text>\n  <text x=\"279\" y=\"84\" text-anchor=\"middle\" font-size=\"11\" fill=\"#124f80\">runs before WordPress loads<\/text>\n  <text x=\"279\" y=\"106\" text-anchor=\"middle\" font-size=\"11.5\" fill=\"#1d2327\">IP blocklist \u00b7 query string<\/text>\n  <text x=\"279\" y=\"123\" text-anchor=\"middle\" font-size=\"11.5\" fill=\"#1d2327\">POST body \u00b7 uploads \u00b7 xmlrpc<\/text>\n\n  <!-- blocked -->\n  <line x1=\"279\" y1=\"142\" x2=\"279\" y2=\"196\" stroke=\"#c9356a\" stroke-width=\"2\" marker-end=\"url(#wpo-ar-red)\"\/>\n  <text x=\"289\" y=\"170\" font-size=\"11\" fill=\"#c9356a\" font-weight=\"600\">blocked<\/text>\n  <rect x=\"182\" y=\"198\" width=\"194\" height=\"58\" rx=\"8\" fill=\"#fdeaf1\" stroke=\"#c9356a\" stroke-width=\"1.5\"\/>\n  <text x=\"279\" y=\"223\" text-anchor=\"middle\" font-size=\"14\" font-weight=\"700\" fill=\"#8b0a3e\">403 Forbidden<\/text>\n  <text x=\"279\" y=\"242\" text-anchor=\"middle\" font-size=\"11\" fill=\"#8b0a3e\">theme and plugins never run<\/text>\n\n  <!-- allowed -->\n  <line x1=\"400\" y1=\"91\" x2=\"440\" y2=\"91\" stroke=\"#646970\" stroke-width=\"2\" marker-end=\"url(#wpo-ar)\"\/>\n  <text x=\"420\" y=\"82\" text-anchor=\"middle\" font-size=\"10.5\" fill=\"#00875a\" font-weight=\"600\">allowed<\/text>\n\n  <!-- wordpress -->\n  <rect x=\"442\" y=\"40\" width=\"222\" height=\"102\" rx=\"8\" fill=\"#f6f7f7\" stroke=\"#dcdcde\"\/>\n  <text x=\"553\" y=\"65\" text-anchor=\"middle\" font-size=\"14\" font-weight=\"700\" fill=\"#1d2327\">WordPress loads<\/text>\n  <text x=\"553\" y=\"84\" text-anchor=\"middle\" font-size=\"11\" fill=\"#646970\">hook-based modules<\/text>\n  <text x=\"553\" y=\"106\" text-anchor=\"middle\" font-size=\"11.5\" fill=\"#1d2327\">login guard \u00b7 user watchdog<\/text>\n  <text x=\"553\" y=\"123\" text-anchor=\"middle\" font-size=\"11.5\" fill=\"#1d2327\">REST \u00b7 headers \u00b7 integrity<\/text>\n\n  <line x1=\"664\" y1=\"91\" x2=\"704\" y2=\"91\" stroke=\"#646970\" stroke-width=\"2\" marker-end=\"url(#wpo-ar)\"\/>\n\n  <!-- event log -->\n  <rect x=\"706\" y=\"52\" width=\"208\" height=\"78\" rx=\"8\" fill=\"#f6f7f7\" stroke=\"#dcdcde\"\/>\n  <text x=\"810\" y=\"80\" text-anchor=\"middle\" font-size=\"14\" font-weight=\"700\" fill=\"#1d2327\">Event log<\/text>\n  <text x=\"810\" y=\"99\" text-anchor=\"middle\" font-size=\"11\" fill=\"#646970\">severity 1\u201320, filterable<\/text>\n  <text x=\"810\" y=\"116\" text-anchor=\"middle\" font-size=\"11\" fill=\"#646970\">every module writes here<\/text>\n\n  <!-- both paths feed the log -->\n  <path d=\"M376 227 C520 227 560 200 700 140\" fill=\"none\" stroke=\"#646970\" stroke-width=\"1.6\" stroke-dasharray=\"5 4\" marker-end=\"url(#wpo-ar)\"\/>\n  <text x=\"520\" y=\"215\" font-size=\"10.5\" fill=\"#646970\">blocked requests are logged too<\/text>\n\n  <!-- telegram -->\n  <line x1=\"810\" y1=\"130\" x2=\"810\" y2=\"196\" stroke=\"#646970\" stroke-width=\"2\" marker-end=\"url(#wpo-ar)\"\/>\n  <text x=\"820\" y=\"166\" font-size=\"10.5\" fill=\"#646970\">above threshold<\/text>\n  <rect x=\"716\" y=\"198\" width=\"188\" height=\"58\" rx=\"8\" fill=\"#eef4fa\" stroke=\"#2271b1\" stroke-width=\"1.5\"\/>\n  <text x=\"810\" y=\"223\" text-anchor=\"middle\" font-size=\"13.5\" font-weight=\"700\" fill=\"#124f80\">Telegram alert<\/text>\n  <text x=\"810\" y=\"242\" text-anchor=\"middle\" font-size=\"11\" fill=\"#124f80\">real time, rate limited<\/text>\n\n  <text x=\"6\" y=\"296\" font-size=\"11\" fill=\"#646970\">Reserved and private IP ranges, plus an operator-supplied trusted-networks file, are exempt from every blocking path \u2014 no feed update can lock you out.<\/text>\n<\/svg>\n\n\n\n<h3 class=\"wp-block-heading\">Every event carries a severity, 1 to 20<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Severity describes what an event <em>implies<\/em>, not how confident the detection is. Anything at 18 or above means something already succeeded \u2014 a core file changed, an administrator exists that should not. A serious exploitation attempt that was stopped tops out at 17. That distinction is what makes the log sortable into &#8220;investigate now&#8221; versus &#8220;background noise from the internet&#8221;.<\/p>\n\n\n\n<svg viewBox=\"0 0 920 168\" role=\"img\" aria-label=\"Severity scale from 1 to 20. Info 1 to 4, Low 5 to 9, Medium 10 to 13, High 14 to 17, Critical 18 to 20. Bands from 18 upward mean a compromise already occurred.\" style=\"display:block;margin-left:auto;margin-right:auto;width:100%;height:auto;max-width:920px;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,sans-serif\">\n  <rect x=\"10\"  y=\"30\" width=\"176\" height=\"34\" rx=\"5\" fill=\"#646970\"\/>\n  <rect x=\"190\" y=\"30\" width=\"212\" height=\"34\" rx=\"5\" fill=\"#2271b1\"\/>\n  <rect x=\"406\" y=\"30\" width=\"172\" height=\"34\" rx=\"5\" fill=\"#b26e00\"\/>\n  <rect x=\"582\" y=\"30\" width=\"172\" height=\"34\" rx=\"5\" fill=\"#c9356a\"\/>\n  <rect x=\"758\" y=\"30\" width=\"152\" height=\"34\" rx=\"5\" fill=\"#8b0a3e\"\/>\n\n  <text x=\"98\"  y=\"52\" text-anchor=\"middle\" font-size=\"13\" font-weight=\"700\" fill=\"#fff\">Info<\/text>\n  <text x=\"296\" y=\"52\" text-anchor=\"middle\" font-size=\"13\" font-weight=\"700\" fill=\"#fff\">Low<\/text>\n  <text x=\"492\" y=\"52\" text-anchor=\"middle\" font-size=\"13\" font-weight=\"700\" fill=\"#fff\">Medium<\/text>\n  <text x=\"668\" y=\"52\" text-anchor=\"middle\" font-size=\"13\" font-weight=\"700\" fill=\"#fff\">High<\/text>\n  <text x=\"834\" y=\"52\" text-anchor=\"middle\" font-size=\"13\" font-weight=\"700\" fill=\"#fff\">Critical<\/text>\n\n  <text x=\"98\"  y=\"82\" text-anchor=\"middle\" font-size=\"11.5\" font-weight=\"600\" fill=\"#646970\">1 \u2013 4<\/text>\n  <text x=\"296\" y=\"82\" text-anchor=\"middle\" font-size=\"11.5\" font-weight=\"600\" fill=\"#646970\">5 \u2013 9<\/text>\n  <text x=\"492\" y=\"82\" text-anchor=\"middle\" font-size=\"11.5\" font-weight=\"600\" fill=\"#646970\">10 \u2013 13<\/text>\n  <text x=\"668\" y=\"82\" text-anchor=\"middle\" font-size=\"11.5\" font-weight=\"600\" fill=\"#646970\">14 \u2013 17<\/text>\n  <text x=\"834\" y=\"82\" text-anchor=\"middle\" font-size=\"11.5\" font-weight=\"600\" fill=\"#646970\">18 \u2013 20<\/text>\n\n  <text x=\"98\"  y=\"102\" text-anchor=\"middle\" font-size=\"11\" fill=\"#646970\">successful login,<\/text>\n  <text x=\"98\"  y=\"117\" text-anchor=\"middle\" font-size=\"11\" fill=\"#646970\">baseline taken<\/text>\n  <text x=\"296\" y=\"102\" text-anchor=\"middle\" font-size=\"11\" fill=\"#646970\">failed login, author<\/text>\n  <text x=\"296\" y=\"117\" text-anchor=\"middle\" font-size=\"11\" fill=\"#646970\">scan, listed IP<\/text>\n  <text x=\"492\" y=\"102\" text-anchor=\"middle\" font-size=\"11\" fill=\"#646970\">brute-force lockout,<\/text>\n  <text x=\"492\" y=\"117\" text-anchor=\"middle\" font-size=\"11\" fill=\"#646970\">XSS attempt<\/text>\n  <text x=\"668\" y=\"102\" text-anchor=\"middle\" font-size=\"11\" fill=\"#646970\">SQLi, webshell<\/text>\n  <text x=\"668\" y=\"117\" text-anchor=\"middle\" font-size=\"11\" fill=\"#646970\">upload, RCE attempt<\/text>\n  <text x=\"834\" y=\"102\" text-anchor=\"middle\" font-size=\"11\" fill=\"#646970\">core file changed,<\/text>\n  <text x=\"834\" y=\"117\" text-anchor=\"middle\" font-size=\"11\" fill=\"#646970\">rogue admin account<\/text>\n\n  <line x1=\"758\" y1=\"132\" x2=\"910\" y2=\"132\" stroke=\"#8b0a3e\" stroke-width=\"2\"\/>\n  <text x=\"834\" y=\"152\" text-anchor=\"middle\" font-size=\"11.5\" font-weight=\"700\" fill=\"#8b0a3e\">already happened<\/text>\n  <line x1=\"10\" y1=\"132\" x2=\"754\" y2=\"132\" stroke=\"#dcdcde\" stroke-width=\"2\"\/>\n  <text x=\"382\" y=\"152\" text-anchor=\"middle\" font-size=\"11.5\" fill=\"#646970\">attempted, and stopped<\/text>\n<\/svg>\n\n\n\n<h3 class=\"wp-block-heading\">Nothing enforces until you say so<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Every blocking module ships in log-only mode. The intended sequence is to watch the Event Log until you trust what it is catching, then switch that module to enforce. Private and reserved IP ranges are permanently exempt from every blocking path, and an operator-supplied trusted-networks file (search-engine crawlers, monitoring) is exempt too \u2014 so no feed update or escalation can lock you out of your own site.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Honest limitations<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n\n<li>A WordPress plugin only ever sees requests that reach PHP. If a file genuinely exists \u2014 an exposed <code>.git<\/code> directory, for instance \u2014 the web server serves it directly and no plugin can intervene. That fix belongs in the server config.<\/li>\n\n\n<li>Probe detection for sensitive paths depends on the site&#8217;s permalink structure routing 404s into WordPress. Where it cannot work, it says so rather than implying coverage it does not have.<\/li>\n\n\n<li>Baseline comparison for plugins and themes detects change since the baseline was taken \u2014 not whether the current state was clean to begin with. Core checksums do not share that limitation.<\/li>\n\n\n<li>An IP allowlist only helps for services that publish stable ranges. Mobile apps, desktop clients and pingbacks arrive from arbitrary addresses and cannot be selectively permitted that way.<\/li>\n\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Status<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Under active development. Twelve modules implemented and tested against simulated attacks \u2014 including an administrator account inserted by raw SQL, a self-hiding backdoor plugin, webshell uploads and a deliberately downgraded plugin. A full code review produced ten findings, all since fixed and individually verified against the specific failure each one described.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Not yet released, and not yet running in enforcing mode on a production site.<\/p>\n\n","protected":false},"excerpt":{"rendered":"<p>A modular WordPress security plugin built around one idea: block what can be blocked before WordPress finishes loading, and make everything else visible enough to act on. Twelve independent modules \u2014 IP reputation, request scanning, login protection, file integrity, vulnerability scanning and more \u2014 each shipping in log-only mode until you trust what it catches. [&hellip;]<\/p>\n","protected":false},"author":0,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-6","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/wp-opsec.eagleeye-intelligence.com\/index.php?rest_route=\/wp\/v2\/pages\/6","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wp-opsec.eagleeye-intelligence.com\/index.php?rest_route=\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/wp-opsec.eagleeye-intelligence.com\/index.php?rest_route=\/wp\/v2\/types\/page"}],"replies":[{"embeddable":true,"href":"https:\/\/wp-opsec.eagleeye-intelligence.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=6"}],"version-history":[{"count":4,"href":"https:\/\/wp-opsec.eagleeye-intelligence.com\/index.php?rest_route=\/wp\/v2\/pages\/6\/revisions"}],"predecessor-version":[{"id":10,"href":"https:\/\/wp-opsec.eagleeye-intelligence.com\/index.php?rest_route=\/wp\/v2\/pages\/6\/revisions\/10"}],"wp:attachment":[{"href":"https:\/\/wp-opsec.eagleeye-intelligence.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=6"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}