// ❌ DANGER - SQL InjectionStringquery="SELECT * FROM users WHERE id = "+userId;jdbcTemplate.queryForObject(query,User.class);// ✅ SAFE - Use JPA or parameterized queries@Query("SELECT u FROM User u WHERE u.id = :id")Optional<User>findById(@Param("id")Longid);
// ❌ DANGER - Unescaped output in templates@GetMapping("/profile")publicStringprofile(Modelmodel,@RequestParamStringname){model.addAttribute("name",name);// If rendered without escapingreturn"profile";}// ✅ SAFE - Use Thymeleaf with proper escaping<!--Thymeleafauto-escapesbydefault--><pth:text="${name}">Namehere</p>// ✅ SAFE - Manual escaping if neededimportorg.springframework.web.util.HtmlUtils;Stringsafe=HtmlUtils.htmlEscape(userInput);
// ❌ DANGER - Predictable random for securityRandomrandom=newRandom();Stringtoken=String.valueOf(random.nextInt());// ✅ SAFE - Use SecureRandom for security purposesSecureRandomsecureRandom=newSecureRandom();byte[]token=newbyte[32];secureRandom.nextBytes(token);StringtokenStr=Base64.getUrlEncoder().encodeToString(token);
## Security Review: [Component]### Summary-Critical: [X]
-High: [X]
-Medium: [X]
-Low: [X]
### Findings#### [CRITICAL] SQL Injection in UserService**Location**: api/src/main/java/com/example/service/UserService.java:47
**Description**: User input concatenated into SQL query
**Remediation**: Use JPA with named parameters
**Code**:
```java
// Current (vulnerable)
String query = "SELECT * FROM users WHERE email = '" + email + "'";
// ✅ Recommended fix
@Query("SELECT u FROM User u WHERE u.email = :email")
Optional<User> findByEmail(@Param("email") String email);