Java Web Application Security Code Review Methodology

MVC (Model-View-Controller) represents a software design pattern extensively utilized in Java enterprise development.

Model Component

The Model handles data processing logic, including data mapping and CRUD operations. This layer typically contains beans, data access objects (DAOs), and related data structures.

View Component

Views manage data presentation and user interface rendering. HTML, JSP, and other templating technologies commonly implement this layer.

Controller Component

Controllers serve as intermediaries between Models and Views, managing data flow and user interactions. They process input from Views, communicate with Models, and return data for presentation.

Project Structure Analysis

Understanding project architecture is fundamental to code review. The src/main directory typically contains:

Java Source Directory

  • annotation: Custom project annotations
  • controller: Request handlers with parameter validation and basic business logic
  • dao: Data access layer components for database operations
  • entity: Domain model classes
  • interceptor: Request interception logic
  • service: Business logic interfaces and implementations
  • utils: Utility classes
  • dto: Data transfer objects for request/response handling
  • vo: View objects for data encapsulation and security
  • constant: Application constants
  • filter: Request filtering components

Resources Directory

  • mapper: MyBatis XML configuration files
  • static: Static assets (JavaScript, CSS, images)
  • templates: View templates
  • application.properties/application.yml: Spring Boot configuration

Request Flow Processing

HTTP requests follow this sequence: Filter → Interceptor → Controller → Service Interface → Service Implementation → DAO layer.

Common Annotations and Methods

Spring Annotations

@Controller marks classes as request handlers. Combined with @ResponseBody, it enables direct JSON responses for REST APIs.

@RestController combines @Controller and @ResponseBody functionality.

@RequestMapping maps URLs to handler methods:

@RestController
@RequestMapping("/api")
public class UserEndpoint {
    
    @GetMapping("/profile/{userId}/{type}")
    public String getUserProfile(@PathVariable("userId") String id, 
                                 @PathVariable("type") String profileType) {
        return "User " + id + " - " + profileType;
    }
}

@RequestParam binds request parameters to method arguments, commonly used for form submissions.

Untrusted Data Entry Points

Method Purpose
getParameter Retrieves request parameters
getParameterNames Lists parameter names
getParameterValues Returns parameter values
getParameterMap Provides parameter mapping
getQueryString Extracts URL query values
getHeader Accesses HTTP headers
getHeaderNames Lists header names
getRequestURI Obtains request URI
getCookies Retrieves cookies
getRequestedSessionId Gets session identifier
getInputStream Reads input stream
getReader Accesses request content
getMethod Identifies HTTP method
getProtocol Determines request protocol
getServerName Returns server name
getRemoteUser Retrieves cached user
getUserPrincipal Obtains user principal

File Operations Methods

Method Description
FileInputStream File input operations
FileOutputStream File output operations
FileReader File reading
FileWriter File writing

Security Review Methodology

Third-Party Component Analysis

Examine pom.xml for vulnerable dependencies:

  • Frameworks: Struts2, Shiro, Spring
  • Middleware: JBoss, WebLogic, Jenkins
  • Libraries: Fastjson, Jackson
  • Editors: UEditor, KindEditor, FCKeditor

Use automated tools like PomEye:

python3 main.py

Configuration Review

Filter Analysis

Search for doFilter implementations. Filters work across frameworks while interceptors are Spring-specific.

Example XSS filter configuration:

<filter>
    <filter-name>securityFilter</filter-name>
    <filter-class>com.example.filter.SecurityFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>securityFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

Filter implementation:

public class SecurityFilter implements Filter {
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, 
                        FilterChain chain) throws IOException, ServletException {
        SecurityRequestWrapper wrappedRequest = new SecurityRequestWrapper((HttpServletRequest) request);
        chain.doFilter(wrappedRequest, response);
    }
}

Request wrapper for XSS prevention:

public class SecurityRequestWrapper extends HttpServletRequestWrapper {
    public SecurityRequestWrapper(HttpServletRequest request) {
        super(request);
    }
    
    @Override
    public String[] getParameterValues(String paramName) {
        if("richtext".equals(paramName)) {
            return super.getParameterValues(paramName);
        }
        String[] originalValues = super.getParameterValues(paramName);
        String[] sanitizedValues = new String[originalValues.length];
        for (int i = 0; i < originalValues.length; i++) {
            sanitizedValues[i] = HtmlUtils.htmlEscape(originalValues[i]);
        }
        return sanitizedValues;
    }
}

Configuration Files

Review application.properties and application.yml for:

  • Spring Boot Actuator unauthorized access
  • Database connection details
  • Druid authentication configurations

Interceptor Configuration

Search for WebMvcConfigurer implementations and review interceptor directories.

Code Review Approaches

Forward Analysis

Search pattern: @(.*?)Mapping\( Trace external parameters from controllers through execution flow to identify security risks.

Reverse Analysis

Identify dangerous functions and trace parameter origins to validate input sanitization.

Feature-Based Review

Analyze specific application functionalities for security implications.

Tool-Assisted Review

Combine automated scanning with manual code inspection.

Patch Comparison

Compare code versions to identify security fixes and potential vulnerabilities.

Common Vulnerability Patterns

Authentication and Authorization Issues

Third-Party Component Unauthorized Access

Actuator Endpoints Dependency: spring-boot-starter-actuator Configuration: management.endpoints

Vulnerable endpoints:

  • /actuator/heapdump - Database credential extraction
  • Session management vulnerabilities

Remediation:

endpoints.env.enabled=false

Swagger Documentation Dependency: springfox-swagger-ui

Remediation options:

  • Disable documentation: .enable(false)
  • Implement authentication mechanisms
  • Restrict access by IP range
  • Remove from production environments

Druid Monitoring Configuration: druid settings

Authentication Bypass

Filter Misconfiguration Session-based authentication flaws where path matching allows unauthorized access.

Interceptor Vulnerabilities Using request.getRequestURI() for path matching can be bypassed with special characters:

  • /;/admin/endpoint
  • ///admin/endpoint

Use getRequestURL() instead for proper path resolution.

Spring Security Configuration Authorization rules using antMatchers():

@Override
protected void configure(HttpSecurity http) throws Exception {
    http.authorizeRequests()
        .antMatchers("/admin/**").hasRole("admin")
        .antMatchers("/user/**").hasRole("user")
        .antMatchers("/public").permitAll()
        .anyRequest().authenticated()
        .and()
        .formLogin();
}

Proper configuration order is critical - specific rules should precede general ones.

Tags: java-security code-audit mvc-architecture spring-security Vulnerability-Analysis

Posted on Sat, 17 Oct 2026 16:09:52 +0000 by Cbrams