Node.js / JavaScript security code review
When it applies
Reading Node/JS source (Express, Next.js, NestJS, a package). Language companion to
code-review-methodology — the exact sinks and framework gotchas to grep and trace.
Sinks & patterns (grep, then trace to user input)
- Command exec:
child_process.exec/execSyncwith user input (useexecFile/spawnw/ arg array); template strings in commands. - Code eval:
eval,new Function,vm.runIn…,setTimeout("string")— RCE. - Prototype pollution: recursive merge/
Object.assign/lodash.merge/set,JSON.parseinto object merges, query parsers —__proto__/constructorkeys (→web-prototype-pollution). - SQL/NoSQL: string-built SQL; Mongo queries taking raw
req.body/req.query(operator injection{$gt:''}); Sequelize.query()/literal. - SSRF:
axios/fetch/http.get/requeston a user URL. - Path/upload:
fs.readFile/sendFile/path.joinwith user paths;res.sendFiletraversal. - XSS (server + client):
res.sendof unescaped input; DOM sinksinnerHTML,document.write,dangerouslySetInnerHTML(React),v-html(Vue). - Deserialization:
node-serialize/funcster(unserialize RCE), untrustedJSON→object merge.
Framework specifics
- Express: missing
helmet/CSP, over-broadcors(),req.query/req.paramsinto sinks, weak sessionsecret, no per-object authz (IDOR/BOLA),app.useorder bypassing auth middleware. - JWT:
jsonwebtokenwithalgorithmsnot pinned (alg confusion /none), weak secret (→web-auth-jwt), secret in code. - Next.js/SSR:
getServerSidePropstrusting client input; API routes missing auth; SSRF in image/proxy. - Mass assignment: spreading
req.bodyinto a model/create(→api-mass-assignment).
Method
rg -n "child_process|eval\(|new Function|innerHTML|dangerouslySetInnerHTML|\.merge\(|__proto__|node-serialize";
run njsscan . and semgrep --config auto; trace user input to each sink.
Gotchas
- Client-side
innerHTML/v-html= DOM XSS even in a "backend" review — check the front-end too. - Mongo operator injection needs input validation/casting, not just parameterization.
References
njsscan; Semgrep JS/TS rules; OWASP Node.js & NodeGoat; Express security best practices.