← back to AbramsOS
Stop unauth info-disclosure on public surface (/healthz + error handler)
8c7f239da4e8c5e1c73571aba4bb91a33972354b · 2026-07-31 15:49:00 -0700 · Steve Abrams
- /healthz returns {ok} only (drop pid + err.message); full error logged server-side.
- Global error handler renders a generic client message; internal err.message no
longer leaks (Postgres schema etc.) to the internet. Full detail still logged.
Keepalive still gets 200. /yoloforever cycle 2; verified healthz+auth intact.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Files touched
M routes/health.jsM server.js
Diff
commit 8c7f239da4e8c5e1c73571aba4bb91a33972354b
Author: Steve Abrams <steve@designerwallcoverings.com>
Date: Fri Jul 31 15:49:00 2026 -0700
Stop unauth info-disclosure on public surface (/healthz + error handler)
- /healthz returns {ok} only (drop pid + err.message); full error logged server-side.
- Global error handler renders a generic client message; internal err.message no
longer leaks (Postgres schema etc.) to the internet. Full detail still logged.
Keepalive still gets 200. /yoloforever cycle 2; verified healthz+auth intact.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
---
routes/health.js | 5 +++--
server.js | 4 ++--
2 files changed, 5 insertions(+), 4 deletions(-)
diff --git a/routes/health.js b/routes/health.js
index a5f72c4..05758f3 100644
--- a/routes/health.js
+++ b/routes/health.js
@@ -5,9 +5,10 @@ const router = express.Router();
router.get('/healthz', async (_req, res) => {
try {
const r = await db.query('SELECT 1 AS ok');
- res.json({ ok: r.rows[0].ok === 1, db: 'up', pid: process.pid });
+ res.json({ ok: r.rows[0].ok === 1 }); // no pid/internal detail — unauth endpoint on a public host
} catch (err) {
- res.status(500).json({ ok: false, db: 'down', error: err.message });
+ console.error('[healthz]', err);
+ res.status(500).json({ ok: false });
}
});
diff --git a/server.js b/server.js
index ba33c86..bc752cd 100644
--- a/server.js
+++ b/server.js
@@ -117,8 +117,8 @@ app.use(prescriptionsRouter); // /prescriptions, /api/prescriptions
app.use('/import', requireStepUp, importRouter);
app.use((err, _req, res, _next) => {
- console.error('[unhandled]', err);
- res.status(500).render('error', { error: err.message });
+ console.error('[unhandled]', err); // full detail server-side only
+ res.status(500).render('error', { error: 'Something went wrong. Please try again.' });
});
if (require.main === module) {
← d08f146 Harden auth cookies for public HTTPS surface + record claims
·
back to AbramsOS
·
Rate-limit auth endpoints + fix audit-log IP integrity 254e60d →