0

spring-boot 1.3.0-BUILD-SNAPSHOT w/SpringSecurity プロジェクトがあり、REST エンドポイントのセキュリティが心配です。CORS フィルターが定義されています。

@Configuration
public class CorsConfiguration {

    @Bean
    public WebMvcConfigurer corsConfigurer() {

        return new WebMvcConfigurerAdapter() {

            @Override
            public void addCorsMappings(CorsRegistry registry) {

                registry.addMapping( "/**" ).allowedOrigins( "*" )
                        .allowedHeaders( "Access-Control-Allow-Origin", "*"          )       "x-requested-with" )
                        .allowedHeaders("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE")
                        .allowedMethods("GET", "POST", "PUT", "DELETE")
                        .allowedMethods("Access-Control-Allow-Headers", "Content-Type")
                        .maxAge( 3600);

            }

        };
    }
}

そして、私はRESTコントローラーを持っています:

@Controller
@Transactional
public class Controller extends BaseController {

    @Autowired
    private QuestionService questionService;

    @RequestMapping(value = "/questions", method = RequestMethod.GET)
    @ResponseBody
    public List<Question> getAllQuestions() {
        return questionService.getAllAvailableQuestions();
    }

  ...
}

しかし、OPTIONS 呼び出しでエンドポイントの 1 つをヒットすると、このエンドポイントが定義する GET 以外のことを許可するように見える結果が得られます。

Allow → GET, HEAD, POST, PUT, DELETE, TRACE, OPTIONS, PATCH
Cache-Control → no-cache, no-store, max-age=0, must-revalidate
Content-Length → 0
Date → Wed, 28 Oct 2015 16:32:12 GMT
Expires → 0
Pragma → no-cache
Server → Apache-Coyote/1.1
X-CSRF-HEADER → X-CSRF-TOKEN
X-CSRF-PARAM → _csrf
X-CSRF-TOKEN → 83983056-f904-449e-a215-fe9f9492866b
X-Content-Type-Options → nosniff
X-Frame-Options → DENY
X-XSS-Protection → 1; mode=block

Spring MVC はデフォルトで OPTIONS 呼び出しを無視すると思っていました。Allow → GET, HEAD, POST, PUT, DELETE, TRACE, OPTIONS, PATCHしかし、その呼び出しに対して GET のみを許可しているのに、なぜ返されているのか理解できないと思います。アプリケーション全体で、GET、PUT、POST、DELETE のみを許可するため、他の値が返される理由とその意味がわかりません。そして最も重要なことは、これはセキュリティ上の脆弱性ですか?

4

2 に答える 2

3

JavaDoc を見ると、BaseFrameworkServlet#setDispatchOptionsRequest()次のコメントが含まれています。

このサーブレットがメソッドに HTTP OPTIONS リクエストをディスパッチするかどうかを設定します。#doServiceデフォルトは「false」で、javax.servlet.http.HttpServletのデフォルトの動作を適用します (つまり、すべての標準 HTTP リクエスト メソッドを OPTIONS リクエストへの応答として列挙します)。


しかし、その呼び出しに対して GET のみを許可すると、Allow → GET、HEAD、POST、PUT、DELETE、TRACE、OPTIONS、PATCH が返される理由も理解できないと思います。

上記のコメントで述べたように、リクエストは Spring MVC ディスパッチャーではなく、サーバーがサポートするHttpServletRequest#doOptionsHTTP メソッドを列挙し、コントローラーのマッピングについて何も知らない によって処理されます。

この動作を確認したい場合は、DispatcherServletdoServiceメソッドとHttpServletdoOptionsメソッドにブレークポイントを配置して、どちらが呼び出されるかを確認できます。OPTIONS リクエストをディスパッチャで処理したい場合は、こちらで説明されている方法のいずれかを使用して有効にすることができます。

于 2015-10-28T19:20:08.847 に答える