XSS 攻击:在 Spring Boot CRUDRepository 中抛出更改异常?
XSS attacks: change exception thrown in a Spring Boot CRUDRepository ?
我正在为一个应用程序开发 API,该应用程序能够根据其 solutionID(整数)找到所谓的 ProductSolutions。
代码如下所示:
@Repository
public interface ProductSolutionRepository extends CrudRepository<ProductSolution, String> {
public List<ProductSolution> findBySolutionId(@Param("solutionId") int solutionId);
}
当使用字符串而不是整数 (localhost:8080/api/v1/productSolutions/search/findBySolutionId?solutionId=dangerousscript
) 发送请求时,API returns 出现错误并显示以下消息:
Failed to convert from type [java.lang.String] to type
[@org.springframework.data.repository.query.Param int] for value
'dangerousscript'; nested exception is
java.lang.NumberFormatException: For input string:
\"dangerousscript\""`
虽然 Chrome 和 Firefox 似乎巧妙地转义了输入(并且不执行任何脚本),但人们仍然担心我们的 API 可能会被用于跨站点脚本攻击。
解决这个问题的一个简单方法是删除我们抛出异常时用户提供的输入,或者制作我们自己的错误页面。我可以通过什么方式配置 spring 引导以抛出自定义异常?
您可以在 class 中用 @ExceptionHandler
定义一个方法,并用 @ControllerAdvice
注释。
您可以使用 @ResponseBody
注释此方法(如果您未使用 @RestController
)并直接 return 所需的响应或使用正确的消息重新抛出异常。
@ControllerAdvice
public class RestExceptionControllerAdvice {
@ExceptionHandler(NumberFormatException.class)
public ErrorResponse handleSearchParseException(NumberFormatException exception) {
// do whathever you want
}
}
我正在为一个应用程序开发 API,该应用程序能够根据其 solutionID(整数)找到所谓的 ProductSolutions。
代码如下所示:
@Repository
public interface ProductSolutionRepository extends CrudRepository<ProductSolution, String> {
public List<ProductSolution> findBySolutionId(@Param("solutionId") int solutionId);
}
当使用字符串而不是整数 (localhost:8080/api/v1/productSolutions/search/findBySolutionId?solutionId=dangerousscript
) 发送请求时,API returns 出现错误并显示以下消息:
Failed to convert from type [java.lang.String] to type [@org.springframework.data.repository.query.Param int] for value 'dangerousscript'; nested exception is java.lang.NumberFormatException: For input string: \"dangerousscript\""`
虽然 Chrome 和 Firefox 似乎巧妙地转义了输入(并且不执行任何脚本),但人们仍然担心我们的 API 可能会被用于跨站点脚本攻击。
解决这个问题的一个简单方法是删除我们抛出异常时用户提供的输入,或者制作我们自己的错误页面。我可以通过什么方式配置 spring 引导以抛出自定义异常?
您可以在 class 中用 @ExceptionHandler
定义一个方法,并用 @ControllerAdvice
注释。
您可以使用 @ResponseBody
注释此方法(如果您未使用 @RestController
)并直接 return 所需的响应或使用正确的消息重新抛出异常。
@ControllerAdvice
public class RestExceptionControllerAdvice {
@ExceptionHandler(NumberFormatException.class)
public ErrorResponse handleSearchParseException(NumberFormatException exception) {
// do whathever you want
}
}