Spaces:
Paused
Paused
File size: 1,931 Bytes
5a81b95 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 | const { execSync } = require('child_process');
const fs = require('fs');
const path = require('path');
class SecurityAuditor {
constructor() {
this.results = {
timestamp: new Date().toISOString(),
vulnerabilities: [],
summary: {},
};
}
runNpmAudit() {
try {
const output = execSync('npm audit --json', { encoding: 'utf-8' });
const auditData = JSON.parse(output);
this.results.vulnerabilities.push(...auditData.vulnerabilities);
this.results.summary.npm = {
total: auditData.metadata.vulnerabilities.total,
critical: auditData.metadata.vulnerabilities.critical,
high: auditData.metadata.vulnerabilities.high,
moderate: auditData.metadata.vulnerabilities.moderate,
low: auditData.metadata.vulnerabilities.low,
};
} catch (error) {
console.error('npm audit failed:', error.message);
}
}
checkSecurityHeaders() {
const required = ['helmet', 'express-rate-limit', 'csurf', 'sanitize-html'];
const packageJson = require('../../package.json');
const missing = required.filter(
pkg => !packageJson.dependencies[pkg] && !packageJson.devDependencies[pkg]
);
this.results.summary.securityPackages = {
required,
missing,
installed: required.length - missing.length,
};
}
generateReport() {
const reportPath = path.join(__dirname, '../reports/audit-report.json');
fs.writeFileSync(reportPath, JSON.stringify(this.results, null, 2));
console.log('Security Audit Report:');
console.log(JSON.stringify(this.results.summary, null, 2));
return this.results;
}
run() {
console.log('Running security audit...');
this.runNpmAudit();
this.checkSecurityHeaders();
return this.generateReport();
}
}
if (require.main === module) {
const auditor = new SecurityAuditor();
auditor.run();
}
module.exports = SecurityAuditor;
|