-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathapp.js
More file actions
143 lines (128 loc) · 4.38 KB
/
Copy pathapp.js
File metadata and controls
143 lines (128 loc) · 4.38 KB
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
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
const express = require('express');
const mysql = require('mysql2');
const { Sequelize, DataTypes } = require('sequelize');
const pidusage = require('pidusage');
const app = express();
app.use(express.json());
app.use(express.urlencoded({ extended: true }));
// Setup Sequelize connection
const sequelize = new Sequelize('testdb', 'testuser', 'testpass', {
host: 'localhost',
dialect: 'mysql'
});
// Test database connection
sequelize.authenticate()
.then(() => console.log('✅ Connected to MySQL.'))
.catch(err => console.error('❌ Connection failed:', err));
// Define User model
const User = sequelize.define('user', {
username: DataTypes.STRING,
password: DataTypes.STRING
}, {
timestamps: false,
tableName: 'users'
});
// Helper: log CPU and execution time
async function logPerformance(startTime, endpoint, payload) {
const durationMs = Date.now() - startTime;
const stats = await pidusage(process.pid);
const memoryMB = process.memoryUsage().rss / 1024 / 1024;
console.log(`🕒 [${endpoint}] Payload: ${payload}`);
console.log(`✅ Response time: ${durationMs} ms`);
console.log(`🔥 CPU Usage: ${stats.cpu.toFixed(2)} %`);
console.log(`🧠 Memory Usage: ${memoryMB.toFixed(2)} MB`);
console.log('---------------------------');
}
// 1. Raw SQL (vulnerable)
app.post('/login-raw', async (req, res) => {
const startTime = Date.now();
const { username, password } = req.body;
try {
const query = `SELECT * FROM users WHERE username='${username}' AND password='${password}'`;
const [results] = await sequelize.query(query);
res.send(results.length > 0 ? 'Login success (raw)' : 'Login failed');
} catch (err) {
res.status(500).send('Server error');
} finally {
await logPerformance(startTime, '/login-raw', username);
}
});
// 2. Escaped Input (manually escaped)
app.post('/login-escaped', async (req, res) => {
const startTime = Date.now();
let { username, password } = req.body;
try {
username = mysql.escape(username);
password = mysql.escape(password);
const query = `SELECT * FROM users WHERE username=${username} AND password=${password}`;
const [results] = await sequelize.query(query);
res.send(results.length > 0 ? 'Login success (escaped)' : 'Login failed');
} catch (err) {
res.status(500).send('Server error');
} finally {
await logPerformance(startTime, '/login-escaped', username);
}
});
// 3. Prepared Statement (parameter binding)
app.post('/login-prepared', async (req, res) => {
const startTime = Date.now();
const { username, password } = req.body;
try {
const results = await sequelize.query(
'SELECT * FROM users WHERE username = ? AND password = ?',
{
replacements: [username, password],
type: Sequelize.QueryTypes.SELECT
}
);
res.send(results.length > 0 ? 'Login success (prepared)' : 'Login failed');
} catch (err) {
console.error('Prepared statement error:', err);
res.status(500).send('Server error');
} finally {
await logPerformance(startTime, '/login-prepared', username);
}
});
// 4. ORM method
app.post('/login-orm', async (req, res) => {
const startTime = Date.now();
const { username, password } = req.body;
try {
const user = await User.findOne({ where: { username, password } });
res.send(user ? 'Login success (ORM)' : 'Login failed');
} catch (err) {
res.status(500).send('Server error');
} finally {
await logPerformance(startTime, '/login-orm', username);
}
});
const axios = require('axios');
app.post('/login-batch', async (req, res) => {
const { payload, count = 10 } = req.body;
const endpoints = ['/login-raw', '/login-escaped', '/login-prepared', '/login-orm'];
const allRequests = [];
endpoints.forEach(endpoint => {
for (let i = 0; i < count; i++) {
allRequests.push(
axios.post(`http://localhost:3000${endpoint}`, {
username: payload,
password: '123'
}).then(response => ({
endpoint,
status: response.status,
data: response.data
})).catch(error => ({
endpoint,
status: error?.response?.status || 500,
data: error?.response?.data || 'Error'
}))
);
}
});
const results = await Promise.all(allRequests);
res.json({ status: 'Batch completed', results });
});
// Start the server
app.listen(3000, () => {
console.log('🚀 Server running on http://localhost:3000');
});