// config/production.js - VULNERABLE production configuration
module.exports = {
database: {
host: 'prod-db-cluster.us-east-1.rds.amazonaws.com',
port: 5432,
name: 'company_prod',
username: 'prod_admin',
password: 'ProdPassword123!@#' // NEVER hardcode passwords!
},
redis: {
host: 'prod-redis.abc123.cache.amazonaws.com',
port: 6379,
password: 'RedisSecretPassword456$%^' // Hardcoded Redis password!
},
external: {
aws: {
accessKeyId: 'AKIAIOSFODNN7EXAMPLE', // Hardcoded AWS credentials!
secretAccessKey: 'wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY',
region: 'us-east-1'
},
sendgrid: {
apiKey: 'SG.1234567890abcdefghijklmnopqrstuvwxyz' // Hardcoded SendGrid API key!
},
slack: {
webhookUrl: 'https://hooks.slack.com/services/T00000000/B00000000/XXXXXXXXXXXXXXXXXXXXXXXX'
}
},
security: {
jwtSecret: 'super_secret_jwt_key_that_should_not_be_here', // JWT secret exposed!
encryptionKey: 'another_hardcoded_encryption_key_32bytes'
}
};
// config/production.js - SECURE production configuration
const requiredConfig = [
'DB_HOST', 'DB_PORT', 'DB_NAME', 'DB_USERNAME', 'DB_PASSWORD',
'REDIS_HOST', 'REDIS_PORT', 'REDIS_PASSWORD',
'AWS_ACCESS_KEY_ID', 'AWS_SECRET_ACCESS_KEY', 'AWS_REGION',
'SENDGRID_API_KEY', 'SLACK_WEBHOOK_URL',
'JWT_SECRET', 'ENCRYPTION_KEY'
];
// Validate all required environment variables are present
const missingConfig = requiredConfig.filter(key => !process.env[key]);
if (missingConfig.length > 0) {
console.error('Missing required environment variables:', missingConfig);
process.exit(1);
}
module.exports = {
database: {
host: process.env.DB_HOST,
port: parseInt(process.env.DB_PORT),
name: process.env.DB_NAME,
username: process.env.DB_USERNAME,
password: process.env.DB_PASSWORD
},
redis: {
host: process.env.REDIS_HOST,
port: parseInt(process.env.REDIS_PORT),
password: process.env.REDIS_PASSWORD
},
external: {
aws: {
accessKeyId: process.env.AWS_ACCESS_KEY_ID,
secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY,
region: process.env.AWS_REGION
},
sendgrid: {
apiKey: process.env.SENDGRID_API_KEY
},
slack: {
webhookUrl: process.env.SLACK_WEBHOOK_URL
}
},
security: {
jwtSecret: process.env.JWT_SECRET,
encryptionKey: process.env.ENCRYPTION_KEY
}
};
// Optional: Add configuration validation
function validateConfiguration(config) {
// Validate JWT secret length
if (config.security.jwtSecret.length < 32) {
throw new Error('JWT secret must be at least 32 characters long');
}
// Validate encryption key length
if (config.security.encryptionKey.length !== 32) {
throw new Error('Encryption key must be exactly 32 characters long');
}
return config;
}
module.exports = validateConfiguration(module.exports);