| name | code-review |
| description | Review ServiceNow server-side scripts for ES5 violations, ACL/injection/XSS issues, N+1 queries, missing setLimit/error handling, hard-coded sys_ids, and business-rule recursion risks. |
| license | Apache-2.0 |
| compatibility | Designed for Snow-Code and ServiceNow development |
| metadata | {"author":"serac","version":"1.0.0","category":"servicenow"} |
| tools | ["snow_artifact_manage","snow_execute_script"] |
ServiceNow Code Review Checklist
Use this checklist when reviewing ServiceNow server-side code (Business Rules, Script Includes, Scheduled Jobs, etc.).
1. ES5 Compliance (CRITICAL)
const x = 5;
let items = [];
() => {}
`template ${var}`
for (x of arr)
{a, b} = obj
Action: Flag ALL ES6+ syntax as CRITICAL errors.
2. Security Issues
2.1 SQL/GlideRecord Injection
gr.addEncodedQuery(userInput)
gr.addQuery("field", userInput)
var safeInput = new GlideSysAttachment().cleanFileName(userInput)
gr.addQuery("field", safeInput)
2.2 Cross-Site Scripting (XSS)
gs.addInfoMessage(userInput)
gs.addInfoMessage(GlideStringUtil.escapeHTML(userInput))
2.3 Access Control
var gr = new GlideRecord("sys_user")
gr.get(userProvidedSysId)
var gr = new GlideRecord("sys_user")
if (gr.get(userProvidedSysId) && gr.canRead()) {
}
2.4 Sensitive Data Exposure
gs.info("Password: " + password)
gs.info("API Key: " + apiKey)
gs.info("Authentication attempt for user: " + username)
3. Performance Issues
3.1 Queries in Loops
for (var i = 0; i < userIds.length; i++) {
var gr = new GlideRecord("sys_user")
gr.get(userIds[i])
}
var gr = new GlideRecord("sys_user")
gr.addQuery("sys_id", "IN", userIds.join(","))
gr.query()
while (gr.next()) {}
3.2 Missing setLimit()
var gr = new GlideRecord("incident")
gr.query()
var gr = new GlideRecord("incident")
gr.setLimit(1000)
gr.query()
3.3 Unnecessary Queries
var gr = new GlideRecord("incident")
gr.addQuery("number", incNumber)
gr.query()
if (gr.getRowCount() > 0) {
}
var gr = new GlideRecord("incident")
if (gr.get("number", incNumber)) {
}
3.4 GlideRecord vs GlideAggregate
var count = 0
var gr = new GlideRecord("incident")
gr.addQuery("active", true)
gr.query()
while (gr.next()) count++
var ga = new GlideAggregate("incident")
ga.addQuery("active", true)
ga.addAggregate("COUNT")
ga.query()
var count = ga.next() ? ga.getAggregate("COUNT") : 0
4. Code Quality Issues
4.1 Hard-coded sys_ids
var assignmentGroup = "681ccaf9c0a8016400b98a06818d57c7"
var assignmentGroup = gs.getProperty("my.default.assignment.group")
var gr = new GlideRecord("sys_user_group")
if (gr.get("name", "Service Desk")) {
var assignmentGroup = gr.getUniqueValue()
}
4.2 Magic Numbers/Strings
if (current.state == 6) {
}
if (current.priority == 1) {
}
var STATE_RESOLVED = 6
var PRIORITY_CRITICAL = 1
if (current.state == STATE_RESOLVED) {
}
4.3 Missing Error Handling
var response = request.execute()
var data = JSON.parse(response.getBody())
try {
var response = request.execute()
var status = response.getStatusCode()
if (status != 200) {
gs.error("API call failed: " + status)
return null
}
var data = JSON.parse(response.getBody())
} catch (e) {
gs.error("Exception: " + e.message)
return null
}
4.4 Proper Logging
gs.info("Error occurred")
gs.info("[MyScriptInclude.process] Processing incident: " + current.number + ", user: " + gs.getUserName())
5. Business Rule Specific
5.1 Recursion Prevention
current.update()
current.setWorkflow(false)
current.update()
current.setWorkflow(true)
5.2 Appropriate Rule Type
6. Review Output Format
When reviewing code, structure your feedback as:
## Code Review Summary
### Critical Issues (Must Fix)
1. [SECURITY] Description...
2. [ES5] Description...
### Performance Issues (Should Fix)
1. [PERF] Description...
### Code Quality (Nice to Have)
1. [QUALITY] Description...
### Positive Observations
- Good use of...
- Well-structured...
7. Severity Levels
| Level | Action | Examples |
|---|
| CRITICAL | Must fix before deployment | Security vulnerabilities, ES6 syntax |
| HIGH | Should fix | Performance issues, missing error handling |
| MEDIUM | Recommend fixing | Code quality, hard-coded values |
| LOW | Consider fixing | Style, minor improvements |