TOOLFORGE
SITE AUDIT · IANDS.ORG · REF TF-IANDS-2026
CONTACT ↗
00
Cover — read-only site audit
00/14

iands.org
site audit

The most serious finding is not an SEO problem. It is a member-data exposure affecting 943 people, live and unremediated, alongside an end-of-life CMS, publicly reachable admin logins, and crawl waste consuming 96% of the site.

FINDINGS DATED 2026-07-27
METHOD READ-ONLY
URLS CRAWLED 7,413
STATUS BETA
01
Executive summary
01/14

Six findings, one of them urgent

Everything below was reached by an ordinary unauthenticated browser or search crawler. No authentication was attempted, no injection, no vulnerability scanning, no state change.

AreaSeverityOne line
Member directory PIICRITICAL943 members' names plus reversible email hashes, no login
End-of-life JoomlaHIGHresearch.iands.org unpatched 1,075 days
Public admin loginsMEDIUM3 live cPanel logins plus CMS admin on the open internet
Open staging / dev hostsMEDIUM12 crawlable WordPress copies, no noindex
Crawl traps / index bloatSEO7,151 of 7,413 URLs are junk; ~262 real pages
URL form and canonicalsSEOhttp/https/www split, 90 canonicals point at redirects

Confidence key. Every number on this page was measured directly unless the text says otherwise. Where severity was observed but could not be confirmed without an intrusive test, it is called out as unconfirmed rather than asserted.

02
Member directory exposure
02/14

943 people published without a login CRITICAL

The 2026 conference room and ride-sharing directory is fully public — no login, no rate limit, no noindex — and walkable page by page through a simple pagination parameter. Thirty-eight listing pages were enumerated unauthenticated.

943members listed
373email-derived slugs
943email hashes exposed
488addresses recovered
  • 943 members listed with full names.
  • 373 profile-URL slugs are the member's own email address with @ and . substituted — readable by eye, no computation needed.
  • All 943 avatar URLs embed an unsalted SHA-256 hash of the member's email address.
  • Profile pages are self-canonical with no robots directive — actively inviting Google to index name-to-email pairs.
  • Affected people include the organisation's own Vice President, Secretary, Executive Director and Office Manager.

This is very likely a notifiable data breach given identifiable members, some of them international and therefore in GDPR scope. That determination belongs to IANDS's counsel, not to this audit.

03
How the addresses were recovered
03/14

Two harmless-looking fields combine into a confirmation oracle

Neither the slug nor the avatar hash is fatal alone. Together they are, and that is the part most likely to be missed by whoever reviews this.

The slug alone is ambiguous

A slug of the form firstnamelastnamegmail-com could correspond to several real addresses — firstnamelastname@, firstname.lastname@, firstnamelast.name@ and so on. On its own it is a strong guess, not a confirmed address.

The avatar hash resolves the ambiguity

Gravatar avatar URLs embed SHA-256(lowercase(trim(email))) — unsalted, no secret. Hash each candidate address and the one that matches the published hash is the member's real address, confirmed with certainty. The same trick works from a member's public name plus common address patterns, even when the slug is unrelated to their email.

Demonstrated at scale

Across the full 943-member directory, 488 of 943 addresses (52%) were recovered from public data alone — 453 hash-confirmed and 35 spelled out directly in the slug. No external breach corpus was used.

488 is a floor on impact, not a ceiling. The remaining 455 members still publish a Gravatar hash of a real address and fall to a larger wordlist or a precomputed rainbow table of common addresses. Removing the slugs alone does not close this — the hash has to go too.

Practically: treat the directory as having disclosed 943 name-to-email pairs, not 373.

04
End-of-life CMS
04/14

Joomla 3.10.12, unpatched for 1,075 days HIGH

research.iands.org runs Joomla 3.10.12, confirmed from two public version files.

MilestoneDateElapsed
Joomla 3 end of life2023-08-171,075 days ago
Paid extended support (eLTS) ended2025-02-17525 days ago
Current major versionJoomla 5two majors ahead

The result is a public-facing CMS receiving zero security patches of any kind for nearly three years. Fix: migrate to Joomla 5, or retire the subdomain outright if the content no longer earns its keep.

05
Public admin and control panels
05/14

Ten login forms on the open internet MEDIUM

Three hosting control panels answer publicly with a live login, and ten login forms in total are served unauthenticated across the CMS and panel hosts.

HostWhat it isWhy it matters
cpanel.iands.orgcPanel loginA single cPanel credential controls files, databases, all email, and DNS for the entire hosting account — the highest-value target on the estate
cpanel.isgo.iands.orgcPanel login
cpanel.symposium.iands.orgcPanel login
iands.org/wp-login.phpWordPress adminCredential stuffing and password spraying targets; also fingerprints the stack for CVE matching
ige.iands.org/wp-login.phpWordPress admin
research.iands.org/administrator/Joomla admin

The fix is not a stronger password — it is removing the login from the public internet: IP-allowlist the cPanel logins, and enforce 2FA plus a login limiter on the CMS logins.

Unconfirmed: whether 2FA is already enforced could not be established without attempting a login, which was deliberately not done.

06
Open staging and dev hosts
06/14

Twelve crawlable copies of the live site MEDIUM

Hostname enumeration across three public sources found 59 hostnames, of which 56 respond over HTTP: 45 indexable, 11 blocked.

59hostnames found
56http-responding
45indexable
12open staging/dev

The staging and dev family — staging, staging-1 through staging-4, dev, dev1 under isgo, plus staging-1.conference and their www. variants — serve live WordPress copies with no robots.txt, no meta-robots, and no canonical. Two serve open Apache directory listings.

Staging installs routinely carry the weakest credentials on an estate and the least-patched plugins. Fix: put them behind HTTP auth or take them offline.

Other host-level oddities

  • ige.iands.org canonicals its own homepage to https://iands.org/, declaring itself a duplicate of the apex.
  • shopiands.iands.org returns 404 and canonicals to an insecure http:// URL.
  • iandsce.iands.org is a public "Account Suspended" cPanel page.
  • conferencearchives.iands.org is 403 with no robots.txt.
07
Transport, headers, and what was withdrawn
07/14

Lower-severity findings, honestly bounded

End-of-life OpenSSL advertised UNCONFIRMED

lamp1, matomo, projects and ruby.iands.org advertise OpenSSL 1.1.1q / 1.1.1l, a series that went end-of-life upstream 1,050 days ago. Caveat that matters: Linux distributions routinely backport security fixes while keeping the old version string, so the banner does not prove these are unpatched. Verify the actual build server-side before treating this as a live vulnerability.

Missing security headers LOW

No HSTS, referrer-policy or permissions-policy on the main hosts. ige.iands.org additionally lacks CSP and X-Frame-Options, so it has no clickjacking protection. Individually minor, collectively easy to fix.

Withdrawn from an earlier draft

"WordPress version disclosure"isgo reports WordPress 7.0.2, which is a current, patched release. Disclosing a current version is not a meaningful flaw. Removed rather than left in to pad the count.

Controls correctly in place PASS

  • WordPress REST user-enumeration is blocked (401/403).
  • xmlrpc.php is disabled (405/404).
  • isgo.iands.org serves its login at a custom path, not the default.
08
Crawl traps and index bloat
08/14

96% of the site is junk

The full crawl finished at 7,413 total crawlable URLs — the site's real size, well below the 60,000 cap. Of those, 7,151 (96%) belong to just two URL patterns that generate pages rather than hold content.

PatternURLsStatus codes
Legacy shopping cart (/shoppingcart/index.php?...)5,144301×2,440 · 200×2,396 · 302×302 · 410×4 · 404×2
Conference member directory (profiles, history, pagination)2,007200×2,006 · 301×1
Real content URLs~262

Google is being asked to crawl 28 junk URLs for every real one. Many of the shopping-cart URLs are insecure http://www. addresses from an old osCommerce or Zen Cart install.

Rate-limiting signal. Under an earlier, faster crawl, seven shopping-cart URLs returned HTTP 429 (Too Many Requests) — the server throttling the crawler. The slower full crawl drew zero 429s, so the behaviour is speed-dependent rather than constant. It still matters: Googlebot responds to 429s by slowing its crawl of the whole site.

09
URL form and canonicals
09/14

The same pages, reachable four ways

Pages resolve over both http and https and both www and bare hostnames, splitting whatever ranking signal they earn across duplicate addresses.

517pages over plain http
649pages over www
406redirects
90canonicals to redirects

90 canonical tags point at URLs that themselves redirect. That is the highest-value quick fix on the technical side: a canonical is supposed to name the final destination, and one that redirects makes the whole signal ambiguous.

10
Broken pages and on-page hygiene
10/14

Volume problems, all mechanical

OnPage score 91.18. Server is Sucuri/Cloudproxy; the CMS is Elementor 4.2.0.

IssueCountNote
Duplicate content pages2,046largely the two crawl-trap patterns
Non-indexable pages2,056
Broken link instances2,419resolving to 23 distinct broken URLs (19 hard 404s, 4 410s)
Duplicate titles / descriptions123 / 123
Titles over display limit329plus 32 too short
Pages with images missing alt text328accessibility as well as SEO
Pages served without compression545
Pages with render-blocking resources531
Internal / external links484,087 / 36,590inflated by the crawl traps

The broken URLs are largely leftover Joomla URL shapes — .html endings and /component/weblinks/ paths — from a migration that never cleaned up after itself.

Off-topic content diluting focus

A page on affordable restaurants in Oak Brook, Illinois ranks for roughly 5,800 monthly searches. That is traffic which cannot convert on a near-death-studies nonprofit; it is almost certainly a leftover conference-venue guide. Fold it into the conference page or noindex it.

11
Member-to-content mentions
11/14

Which listed members actually appear in the site's writing

A separate pass crawled 531 apex URLs, excluded the member-directory subtrees entirely, and searched the remaining 232 real content pages for every name on the member lists. Excluding the directory matters: leave it in and every name matches itself, which measures nothing.

ListPeopleMentioned in contentRate
Full member directory943515.4%
Confirmed-email subset488367.4%

So roughly one member in twenty is ever written about on the site that publishes their name and email. The directory is not an author roster or a contributor list — it is a conference logistics form that became a public database.

Read the top of that list carefully. The single highest-count match appears on around 80 pages, but as the site's news-author byline — not as the subject of 80 write-ups. Page-count alone will mislead anyone who does not check what kind of match it is.

12
AI search and video
12/14

The one genuinely strong position

68%ranked kws with AI overview
~80%of ranked search volume
5thmost-cited domain
48AI overview citations

Sixty-eight percent of ranked keywords now return a Google AI Overview, covering roughly 80% of ranked search volume — and IANDS is the fifth most-cited domain inside those overviews, with 48 citations. For a nonprofit in this space that is a genuinely strong position and worth defending.

The video gap

YouTube is both the single most-cited AI-Overview source and the top organic domain for these queries — but the videos ranking belong to other channels. IANDS has a channel (@IANDSvideos) and sells video through isgo. The gap is that its video content is not surfacing for its core terms, not that it is absent.

Corrected from an earlier draft, which wrongly stated there was no video presence at all.

13
Remediation order
13/14

Ordered by impact per unit of effort

Nothing here has been executed. These are instructions for whoever holds server and DNS access.

#ActionWhy now
0Close the public member directory. Require login; stop deriving usernames from email addresses; suppress the Gravatar hashes; request removal of any already-indexed profile pages.Live PII exposure of 943 identifiable people. Outranks everything below it.
1Migrate research.iands.org off Joomla 3, or retire the subdomain.Nearly three years without a single security patch.
2IP-allowlist the three cPanel logins; add 2FA and a login limiter to the CMS logins.Highest-value credential target on the estate.
3HTTP-auth or decommission the 12 staging and dev hosts.Weakest credentials, and duplicate content besides.
4Fix the 90 canonicals that point at redirecting URLs.Cheapest technical win with a real ranking effect.
5Block or retire the /shoppingcart/ URL space in robots.txt and remove internal links into it.Recovers most of the wasted crawl budget in one move.
6Consolidate URL forms onto one canonical host and scheme.Stops splitting signal four ways.
7Clear the on-page volume issues: titles, alt text, compression, render-blocking.Mechanical, delegable, no judgment calls.
14
Method, scope, and what was not assessed
14/14

What this audit did and did not do

Method

Read-only reconnaissance: public page crawling, third-party SEO APIs, and response-header and version-file inspection. No authentication attempts, no injection, no vulnerability scanning, no state changes. Every endpoint cited is one an ordinary browser or search crawler reaches unauthenticated. Hostname enumeration drew on three independent public sources (two certificate-transparency APIs and one passive-DNS source); one of the three was returning errors on the day and contributed nothing, which the tooling recorded rather than silently absorbed.

Not assessed

  • Core Web Vitals / PageSpeed — not run.
  • Backlinks and domain authority — not pulled.
  • Actual Google indexation of staging hosts and profile pages — inferred from headers, not confirmed via site: queries or Search Console.
  • Any authenticated or offensive testing — deliberately none.

Absence of a finding is not evidence of security. This audit establishes what is visible from outside without touching anything. It does not establish that nothing else is wrong.

Data handling

Recovered personal data is held privately, was never committed to any repository or published, and is referenced on this page only in aggregate. No member name or email address appears anywhere in this document. Any decision to notify IANDS, or to treat the member-directory exposure as a reportable breach, belongs to the site owner and appropriate counsel.