[object Object]

← 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

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 →