Search code examples
jspspring-mvcspring-securityapache-commons-fileupload

HTTP 403 error while upload - Invalid CSRF Token 'null'


this file contains a form to upload a file

uploadForm.jsp

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"   pageEncoding="ISO-8859-1"%>
<%@ taglib uri="http://www.springframework.org/security/tags" prefix="sec" %>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<sec:csrfMetaTags/>
<title>File Upload</title>
</head>
<body>
    <jsp:include page="/resources/layout/header.jsp"/>      <!-- Header -->   
        <div class="container">

            <form action="uploadfile" method="POST" enctype="multipart/form-data">              
                    File to upload: <input type="file" name="file"><br /> 
                    Name: <input type="text" name="name"><br /> <br />
                    <input type="submit" value="Upload"> Press here to upload the file!
            </form>
        </div>  <!-- Container -->

        <jsp:include page="/resources/layout/footer.jsp"/>      <!-- Footer -->
</body>
</html>

and My controller method is

@RequestMapping(value = "/uploadFile", method = RequestMethod.POST)
    public String uploadFileHandler(@RequestParam("name") String name,@RequestParam("file") MultipartFile file) {

        if (!file.isEmpty()) {
            try {
                byte[] bytes = file.getBytes();

                // Creating the directory to store file
                String rootPath = System.getProperty("catalina.home");
                File dir = new File(rootPath + File.separator + "tmpFiles");
                if (!dir.exists())
                    dir.mkdirs();

                // Create the file on server
                File serverFile = new File(dir.getAbsolutePath()
                        + File.separator + name);
                BufferedOutputStream stream = new BufferedOutputStream(
                        new FileOutputStream(serverFile));
                stream.write(bytes);
                stream.close();

                logger.info("Server File Location="
                        + serverFile.getAbsolutePath());

                return "You successfully uploaded file=" + name;
            } catch (Exception e) {
                return "You failed to upload " + name + " => " + e.getMessage();
            }
        } else {
            return "You failed to upload " + name
                    + " because the file was empty.";
        }
    }

I have the following error on upload :

HTTP Status 403 - Invalid CSRF Token 'null' was found on the request parameter '_csrf' or header 'X-CSRF-TOKEN'

I have used spring security also. But i always give an same error. i tried lot but unable to solve it. Could you please help to solve this.


Solution

  • It looks like the CSRF (Cross Site Request Forgery) protection in your Spring application is enabled. Actually it is enabled by default.

    According to spring.io:

    When should you use CSRF protection? Our recommendation is to use CSRF protection for any request that could be processed by a browser by normal users. If you are only creating a service that is used by non-browser clients, you will likely want to disable CSRF protection.

    So to disable it:

    @Configuration
    public class RestSecurityConfig extends WebSecurityConfigurerAdapter {
      @Override
      protected void configure(HttpSecurity http) throws Exception {
        http.csrf().disable();
      }
    }
    

    If you want though to keep CSRF protection enabled then you have to include in your form the csrftoken. You can do it like this:

    <form .... >
      ....other fields here....
      <input type="hidden"  name="${_csrf.parameterName}"   value="${_csrf.token}"/>
    </form>
    

    You can even include the CSRF token in the form's action:

    <form action="./upload?${_csrf.parameterName}=${_csrf.token}" method="post" enctype="multipart/form-data">