test: IDOR + admin ACL + audit ACL sections (45/45 pass)

This commit is contained in:
2026-05-30 17:14:19 +03:00
parent 1f5c0d8623
commit 91d18afe10
+77
View File
@@ -560,6 +560,83 @@ async function cleanup() {
log(got429, 'rate-limiter: POST /add → 429 после 30 запросов');
}
// ─────────────────────────────────────────────────────────────────────────────
// 18. IDOR — user пытается добавить запись в чужую компанию через company_id
// ─────────────────────────────────────────────────────────────────────────────
console.log('\n── 18. IDOR: подделка company_id ──');
{
// user2 (WZ02001) пытается добавить запись в компанию user (WZ01325)
const { MOCK_USERS } = require('../src/config');
const userClient = MOCK_USERS.find(u => u.id === 'test')?.clientId;
const uRes = await pool.query(
`SELECT id FROM companies WHERE client_id = $1 LIMIT 1`, [userClient]
);
const userCompId = uRes.rows[0]?.id;
if (userCompId && user2Agent) {
const countBefore = (await pool.query(
`SELECT COUNT(*)::int AS c FROM whitelist_entries WHERE company_id = $1 AND deleted_at IS NULL`,
[userCompId]
)).rows[0].c;
const csrf = await getCsrfFromIndex(user2Agent);
// user2 подделывает company_id = чужой компании
const res = await user2Agent.post('/add').type('form')
.send({ value: '5.6.7.8', comment: 'IDOR test', company_id: userCompId, _csrf: csrf });
const countAfter = (await pool.query(
`SELECT COUNT(*)::int AS c FROM whitelist_entries WHERE company_id = $1 AND deleted_at IS NULL`,
[userCompId]
)).rows[0].c;
log(countBefore === countAfter,
'IDOR: user2 не смог добавить в компанию user через company_id',
`before=${countBefore} after=${countAfter}`);
// Чистим на случай если баг сработал
await pool.query(
`UPDATE whitelist_entries SET deleted_at = NOW(), deleted_by = 'test-cleanup'
WHERE value_cidr = '5.6.7.8/32' AND deleted_at IS NULL`
);
} else {
log(false, 'IDOR: нет userCompId или user2Agent');
}
}
// ─────────────────────────────────────────────────────────────────────────────
// 19. /admin страница — user не может зайти
// ─────────────────────────────────────────────────────────────────────────────
console.log('\n── 19. /admin — только для admin ──');
{
const res = await userAgent.get('/admin');
log(res.status === 302 || res.status === 403,
'user: GET /admin → redirect или 403', `status=${res.status}`);
}
{
const res = await adminAgent.get('/admin');
log(res.status === 200, 'admin: GET /admin → 200', `status=${res.status}`);
}
// ─────────────────────────────────────────────────────────────────────────────
// 20. /audit — только для admin, user видит только свои
// ─────────────────────────────────────────────────────────────────────────────
console.log('\n── 20. /audit ──');
{
const res = await userAgent.get('/audit');
// /audit только для admin — user получает 403
log(res.status === 403 || res.status === 302,
'user: GET /audit → 403 (нет доступа)', `status=${res.status}`);
}
{
const res = await adminAgent.get('/audit');
log(res.status === 200, 'admin: GET /audit → 200', `status=${res.status}`);
}
// ─────────────────────────────────────────────────────────────────────────────
// Cleanup
// ─────────────────────────────────────────────────────────────────────────────