我有一个简单的REST/API Spring bootstrap 项目,当有一个错误的模式输入时需要测试,例如:

curl -D- -X POST -H 'Content-Type: application/json' \
  -d 'BAD-SCHEMA-$@#%{[|!/-' \
  http://127.0.0.1:8080/auth/sign-up

我try 在测试计划中使用本机JUnit5 for Spring测试的RestTemplate:

    @Test
    public void signUpBadInputSchemaValidation() {
        /*
        curl -D- -X POST -H 'Content-Type: application/json' \
        -d 'BAD-SCHEMA-$@#%{[|!/-' \
        http://127.0.0.1:8080/auth/sign-up
        */

        // Prepare request headers
        HttpHeaders headers = new HttpHeaders();
        headers.setContentType(MediaType.APPLICATION_JSON);

        // Prepare request body
        HttpEntity<String> requestEntity = new HttpEntity<>("BAD-SCHEMA-$@#%{[|!/-");

        // Create http request
        ResponseEntity<Object> responseEntity = restTemplate.exchange(
            "http://127.0.0.1:" + port + "/auth/sign-up",
            HttpMethod.POST, requestEntity, Object.class);

        // Response validation
        assertThat(responseEntity.getStatusCode())
            .isEqualTo(HttpStatus.UNPROCESSABLE_ENTITY);
    }

restTemplate自动将Content-Type改为text/plain,但需要保留application/json.

我try 在测试请求中更改端口,并使用Netcat进行嗅探:

ncat -vlp 9999
Ncat: Version 7.80 ( https://nmap.org/ncat )
Ncat: Listening on :::9999
Ncat: Listening on 0.0.0.0:9999
Ncat: Connection from 127.0.0.1.
Ncat: Connection from 127.0.0.1:54478.
POST /system/access/first HTTP/1.1
Accept: application/json, application/*+json
Content-Type: text/plain;charset=UTF-8
User-Agent: Java/17.0.8
Host: 127.0.0.1:9999
Connection: keep-alive
Content-Length: 21

BAD-SCHEMA-$@#%{[|!/-

restTemplate将标题更改为Content-Type: text/plain;charset=UTF-8.

如何保持application/json与明文体使用restTemplate来执行安全测试?

推荐答案

这是因为您没有将HttpHeadersContent-Type=application/json配置为RestTemplate发出的HttpEntity.

对以下内容进行更改应可解决问题:

// Prepare request headers
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);

// Prepare request body
HttpEntity<String> requestEntity = new HttpEntity<>("BAD-SCHEMA-$@#%{[|!/-", headers);

Java相关问答推荐

如何在Spring Security中设置CustomLogin路径?

Maven Google Sheets版本问题

Java字符串常数池困惑

具有额外列的Hibert多对多关系在添加关系时返回NonUniqueHealthExcellent

强制Mockito返回null而不是emtpy list

JavaFX如何在MeshView中修复多个立方体?

计算两个浮点数之间的距离是否对称?

如何从错误通道回复网关,使其不会挂起

垃圾收集时间长,会丢弃网络连接,但不会在Kubernetes中反弹Pod

根本不显示JavaFX阿拉伯字母

Java组件项目中的JavaFX对话框国际化

Android应用程序为错误的显示类型 Select 尺寸文件

Java中HashSet的搜索时间与TreeSet的搜索时间

我的代码是线程安全的吗?[Java、CAS、转账]

用于Java的Visual Studio代码完成不起作用

在Spring Boot中使用咖啡因进行缓存-根据输出控制缓存

如何在Spring Security中设置一个任何人都可以打开的主页?

验证没有';t work on Hibernate Entity';s字段

try 添加;按流派搜索;在Web应用程序上,但没有;I don’我不知道;It’这个代码错了

在不带instanceof或switch的java中记录模式