So, I have attached Claude (Fable 5.1) via MCP to Elements. ![]()
I got it to review my project and one of the issues it identified was:
Critical — Project backup zip exposed (reported earlier): full .elements project publicly downloadable from the live site, including contact-form SMTP password and FTP username.
I asked:
I have copied the backup to my Mac’s desktop and deleted the backup on the server. The create a backup on publish is a standard RapidWeaver Elements function. Isn’t having a random uuid in the filename secure enough and if not, why?
Claude replied:
Good — deleting it removes the immediate exposure. To answer the question directly: a random UUID in the path is a reasonable defence against guessing, but it’s not a substitute for access control, because the URL only has to leak once and there are several ordinary ways it can.
Why “unguessable” isn’t the same as “protected”:
The name is only as secret as every place it’s ever been written. That UUID appears in your project’s data.json, in .DS_Store files (which Elements publishes alongside the site — the local publish folder had one), in the FTP client’s transfer logs, in the host’s access logs if you ever opened it in a browser, in browser history, and in any screen share or support ticket. It only needs to appear once in something that gets shared, indexed, or backed up somewhere less private.
Directory listing and misconfiguration. The folder returned 404 for a listing, which is good, but that’s a property of the server config — a hosting migration, a cPanel change, or a .htaccess edit could turn listing on and the file becomes visible with no URL knowledge required. Security-by-obscurity fails silently when the assumption behind it changes.
The UUID is stable. It’s the project’s identity, not a per-publish nonce, so it never rotates. Once known, it’s known forever, and Elements refreshes the zip on every publish, so a leaked URL yields an always-current copy of the whole project.
The payload is disproportionate to the protection. A URL nobody is meant to see is fine for, say, a temporary preview image. Here it guards the FTP username, the contact form’s SMTP password, the form spam key, and the full source of every members-only admin page. The blast radius if the obscurity fails is total, so it deserves real access control, not just a hard-to-guess name.
Scanners do find things. Automated crawlers and bug-bounty tooling routinely check for _rwbackup-style patterns; RapidWeaver’s backup folder naming (_rwbackup/) is publicly known, and a scanner only needs the UUID, which brings us back to the first point.
What “secure enough” would look like, if you want to keep the feature on: have Elements publish the backup but block it from the web — a .htaccess in that folder with Require all denied (Elements can publish that as a code file), so the zip lands on the server for disaster recovery but returns 403 to any browser. That keeps the convenience with none of the exposure. Alternatively, leave the feature off for the Prod destinations and rely on your existing Keyboard Maestro/CCC source-backup scheme, which already covers the project.
Two things I’d still do regardless: rotate the contact form’s SMTP password and spam secret key (they were in a zip that was public for at least some period), and if the backup-on-publish setting is still on, delete the folder again after your next publish — Elements will have recreated it.
So I have taken Claude’s advice and removed the backup.
So @dan / @tpbradley, what do you think about Claude’s advice. I have erred on the side of caution for the moment. ![]()