사용자 입력이 쿼리·명령어에 그대로 삽입돼 의도치 않은 동작을 유발합니다. SQL Injection, Stored XSS 등이 해당됩니다.
// ❌ 취약: 문자열 연결 SQL
const query = `SELECT * FROM users
WHERE username = '${username}'
AND password = '${password}'`;
// 입력: admin'-- → WHERE username='admin'--' AND...
// 주석 이후 조건 무시 → admin으로 로그인
// ❌ 취약: XSS - 미이스케이프 출력
<div><%- comment.content %></div>
// <script>alert(1)</script> 그대로 실행
// ✅ 안전: Parameterized Query
const user = get(
'SELECT * FROM users WHERE username=? AND password=?',
[username, password]
);
// ✅ 안전: HTML 이스케이프 출력
<div><%= comment.content %></div>
// EJS에서 <%= %> 는 자동 이스케이프 (<%- %> 는 raw HTML)