File tree Expand file tree Collapse file tree
Expand file tree Collapse file tree Original file line number Diff line number Diff line change @@ -3,11 +3,16 @@ const FormResponse = require('../models/hgnFormResponse');
33const communityMemberController = function ( ) {
44 const getCommunityMembers = async function ( req , res ) {
55 try {
6- const query = { } ;
7- const { search, skills, sortOrder = 'asc' } = req . query ;
6+ const { search, skills } = req . query ;
7+
8+ // Validate sortOrder against an allowlist to prevent injection
9+ const sortOrder = req . query . sortOrder === 'desc' ? 'desc' : 'asc' ;
810
11+ const query = { } ;
912 if ( search ) {
10- query [ 'userInfo.name' ] = { $regex : search , $options : 'i' } ;
13+ // Escape regex special characters to prevent ReDoS
14+ const escapedSearch = search . replace ( / [ . * + ? ^ $ { } ( ) | [ \] \\ ] / g, '\\$&' ) ;
15+ query [ 'userInfo.name' ] = { $regex : escapedSearch , $options : 'i' } ;
1116 }
1217
1318 // Use .lean() to get plain JS objects so Object.entries() works correctly on subdocuments
@@ -34,7 +39,6 @@ const communityMemberController = function () {
3439
3540 const structuredMembers = formResponses . map ( ( member ) => {
3641 const { userInfo, frontend, backend, general } = member ;
37-
3842 return {
3943 _id : member . _id ,
4044 name : userInfo ?. name || 'N/A' ,
You can’t perform that action at this time.
0 commit comments