Web 開発再入門 #19 ― セキュリティ設定(Not Found Page 処理)
fmockup
★ 本ページは工事中 ★
はじめに
SpringBoot のデフォルトでは、誤った URL をアクセスすると、いろいろな情報を返却してしまいます。ハッカーは、これらの情報を見て、Web アプリケーションの作りを想像して、攻撃を仕掛けてきます。
よって、最低限の情報しか返却しないように修正します。
フォルダー・ファイル構成
D:\
└ Developments\
└ Workspace\
└ fmockup\
├ build\
├ sql\
├ src\
│ └ main\
│ ├ java\
│ │ └ cn\
│ │ └ com\
│ │ └ xxxx\
│ │ └ fmockup\
│ │ ├ action\
│ │ ├ controller\
│ │ ├ customizer\
│ │ │ └ ErrorIntercepter.java ← コレ
│ │ ├ entity\
│ │ ├ mapper\
│ │ ├ response\
│ │ ├ service\
│ │ ├ util\
│ │ ├ validator\
│ │ └ validator_order\
│ └ resources\
│ ├ mapper\
│ │ └ error.html ← コレ
│ ├ templates\
│ └ static\
├ vue-vite\
└ WinSW.NET-nnn\
ファイルの文字コード
基本的に Eclipse でファイルを作成するので、あまり意識したことがありません。
多分、Unix 改行(LF)なのだと思います。
ファイルの作成
- ファイル “ErrorIntercepter.java”、“error.html” を作成する。
ErrorIntercepter.java
・・・ package cn.com.xxxx.fmockup.customizer; import java.util.HashMap; import java.util.Map; import org.springframework.boot.web.servlet.error.ErrorController; import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.servlet.ModelAndView; import jakarta.servlet.RequestDispatcher; import jakarta.servlet.http.HttpServletRequest; /** * Error Interceptor * It Cuts off Some Information from Error Information. */ /* * If a URL is invalid, the Spring Boot does not become an error. * * If this is not specified. Spring boot outputs a "Not Found" page. * It gives a hint to attackers, so it is not secured... */ @Controller public class ErrorInterceptor implements ErrorController { /** * Error Interceptor (for HTML request) * It Cuts off Some Information from Error Information. */ @RequestMapping(produces = {MediaType.TEXT_HTML_VALUE}) public ModelAndView errorHtml(HttpServletRequest request, ModelAndView mav) { HttpStatus status = HttpStatus.INTERNAL_SERVER_ERROR; Object statusCode = request.getAttribute(RequestDispatcher.ERROR_STATUS_CODE); if (statusCode != null && statusCode.toString().equals("404")) { status = HttpStatus.NOT_FOUND; } mav.setStatus(status); return mav; } /** * Error Interceptor (for JSON request) * It Cuts off Some Information from Error Information. */ @RequestMapping(produces = {MediaType.APPLICATION_JSON_VALUE}) public ResponseEntity<Map<String, Object>> errorJson(HttpServletRequest req) { HttpStatus status = HttpStatus.INTERNAL_SERVER_ERROR; // No Convert // Object statusCode = req.getAttribute(RequestDispatcher.ERROR_STATUS_CODE); // if (statusCode != null && statusCode.toString().equals("404")) { // status = HttpStatus.NOT_FOUND; // } Map<String, Object> body = new HashMap<String, Object>(); body.put("status", status.value()); return new ResponseEntity<>(body, status); } }
error.html<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Error</title> </head> <body> Error<br> </body> </html>
参考
Not Found Page 処理