Skip to content

Commit ec56163

Browse files
codergautamclaude
andcommitted
fix: Prevent NoSQL injection in secret-based authentication
- validateSecret.js: Add type check before MongoDB query - googleAuth.js: Validate secret is string before findOne - eloRank.js: Add type check for secret parameter - mapHome.js: Move type validation BEFORE the database query Attackers could send {"secret": {"$ne": null}} to bypass auth and authenticate as any user in the database. Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
1 parent 410dff0 commit ec56163

File tree

4 files changed

+13
-5
lines changed

4 files changed

+13
-5
lines changed

api/eloRank.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,8 @@ export default async function handler(req, res) {
3535
let user;
3636
if(username) {
3737
user = await User.findOne({ username: username }).collation(USERNAME_COLLATION).cache(120);
38-
} else if(secret) {
38+
} else if(secret && typeof secret === 'string') {
39+
// Prevent NoSQL injection - secret must be a string
3940
user = await User.findOne({ secret }).cache(120);
4041
}
4142

api/googleAuth.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,8 @@ export default async function handler(req, res) {
107107

108108
const { code, secret } = req.body;
109109
if (!code) {
110-
if(!secret) {
110+
// Prevent NoSQL injection - secret must be a string
111+
if(!secret || typeof secret !== 'string') {
111112
return res.status(400).json({ error: 'Invalid' });
112113
}
113114

api/map/mapHome.js

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -40,12 +40,13 @@ export default async function handler(req, res) {
4040

4141
// Skip user lookup for anonymous requests
4242
if(secret && !isAnon) {
43-
const startUser = Date.now();
44-
user = await User.findOne({ secret: secret });
45-
timings.userLookup = Date.now() - startUser;
43+
// Prevent NoSQL injection - validate secret type BEFORE the query
4644
if(typeof secret !== 'string') {
4745
return res.status(400).json({ message: 'Invalid input' });
4846
}
47+
const startUser = Date.now();
48+
user = await User.findOne({ secret: secret });
49+
timings.userLookup = Date.now() - startUser;
4950
if(!user) {
5051
return res.status(404).json({ message: 'User not found' });
5152
}

serverUtils/validateSecret.js

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,9 @@
11
export default async function validateSecret(secret, User) {
2+
// Prevent NoSQL injection - secret must be a string
3+
if (typeof secret !== 'string') {
4+
return null;
5+
}
6+
27
const user = await User.findOne({
38
secret
49
});

0 commit comments

Comments
 (0)