Sample challenge

Click a line to select it, or press and drag down the diff to select a block (Shift-click works too). Then flag why it is vulnerable, and flag everything you would push back on before you submit.

lib/auth.jsmodified+11-1
@@ -1,4 +1,14 @@
11const crypto = require('crypto')
22const { db } = require('./db')
33
4+function hashPassword(password) {
5+ return crypto.createHash('md5').update(password).digest('hex')
6+}
7+
8+async function createSession(userId) {
9+ const token = crypto.randomBytes(32).toString('hex')
10+ await db.sessions.insert({ userId, token })
11+ return { token }
12+}
13+
4-module.exports = {}
14+module.exports = { createSession, hashPassword }
routes/auth.jsadded+26-0
@@ -0,0 +1,26 @@
1+const express = require('express')
2+
3+const { hashPassword, createSession } = require('../lib/auth')
4+const { findUserByEmail } = require('../lib/users')
5+
6+const router = express.Router()
7+
8+router.post('/login', async (req, res) => {
9+ const { email, password } = req.body
10+
11+ const user = await findUserByEmail(email)
12+ if (!user || user.passwordHash !== hashPassword(password)) {
13+ return res.status(401).render('login', { error: 'Wrong email or password.' })
14+ }
15+
16+ const session = await createSession(user.id)
17+
18+ res.cookie('sid', session.token, {
19+ maxAge: 1000 * 60 * 60 * 24 * 30,
20+ sameSite: 'lax',
21+ })
22+
23+ res.redirect('/lists')
24+})
25+
26+module.exports = router