Jax-rs 使用 Apache CXF 的 XSS 拦截器
XSS interceptor for Jax-rs using Apache CXF
我正在使用 CXF 处理 XSS 拦截器任务。根据项目依赖项,我不能使用 Jersey。而且我看不到任何使用拦截器或过滤器从请求中更改表单数据(表单参数)的方法。
我从文档中发现我们不能使用 cxf 修改请求参数(不包括查询参数),尽管 jersey 提供了修改这些参数的方法。
但是在拦截器中我也看不到任何修改表单参数的方法。我可以看到很多修改 headers / 查询参数的示例。但是看不到任何修改请求参数的例子。谁能提供一些帮助并为此提供示例代码示例。
现在我正在检查 ReaderInterceptor。但它也没有像调用拦截器那样调用。如果您对此也有任何想法,请告诉我。
您必须定义一个拦截器来捕获入站消息,然后再由您的业务服务处理它们,提取表单参数,传递 XSS 过滤器并根据您的需要更新参数或中止处理。
拦截器
这是一个使用 CXF 的基本示例 AbstractPhaseInterceptor
public class XSSInterceptor extends AbstractPhaseInterceptor<Message> {
public XSSInterceptor () {
super(Phase.INVOKE);
}
@Override
public void handleMessage(Message message) throws Fault {
// filter only application/x-www-form-urlencoded
String contentType = (String)message.get(Message.CONTENT_TYPE);
if (MediaType.APPLICATION_FORM_URLENCODED.equals(contentType)){ /
// message parts
List list = message.getContent(List.class);
for (int i = 0; i < list.size();i++){
//get the parameter map
MultivaluedMap<String, String> params = (MultivaluedMap<String, String> )list.get(i);
for(String param: params.keySet()){
List<String> values = params.get(param);
//XSS filter here. Update the value list if needed or abort the request
List<String> updatedValues = xssFilter(values);
params.put(param, updatedValues);
}
}
}
}
@Override
public void handleFault(Message messageParam) {
}
}
CXF配置
<bean id="xssInterceptor" class="XSSInterceptor" />
<cxf:bus>
<cxf:inInterceptors>
<ref bean="xssInterceptor"/>
</cxf:inInterceptors>
</cxf:bus>
此配置将应用于这样的服务
@POST
@Path("/form")
@Consumes({MediaType.APPLICATION_FORM_URLENCODED})
public Response form(MultivaluedMap<String, String> params) throws WebApplicationException;
*RequestContextFilter
或者您可以使用 RequestContextFilter
public class CustomRequestFilter implements ContainerRequestFilter {
public void filter(ContainerRequestContext context) {
Message m = JAXRSUtils.getCurrentMessage();
//XSS filter here. In the same way the above intercerceptor
// finally use context.abortWith(Response) if you need to block the request
Spring 配置
<bean id="customRequestFilter" class="com.CustomRequestFilter" />
<!-- Add filters to provider zone in JAX-RS server-->
<bean id="myRestServer" class="org.apache.cxf.jaxrs.JAXRSServerFactoryBean" lazy-init="false" init-method="create">
...
<property name="providers">
<list>
<ref bean="customRequestFilter" />
</list>
</property>
@预匹配
public class XSSInterceptor 扩展了 AbstractPhaseInterceptor {
private XSSRequestWrapper xssRequestWrapper;
public XSSInterceptor() {
super(Phase.POST_LOGICAL);
}
@SuppressWarnings("unchecked")
@Override
public void handleMessage(Message message) throws Fault {
HttpServletRequest httpRequest = (HttpServletRequest) message.get("HTTP.REQUEST");
xssRequestWrapper = new XSSRequestWrapper(httpRequest);
// filter only application/x-www-form-urlencoded
String contentType = (String) message.get(Message.CONTENT_TYPE);
if (MediaType.APPLICATION_FORM_URLENCODED.equalsIgnoreCase(contentType)
|| MediaType.APPLICATION_JSON.equalsIgnoreCase(contentType)) {
// message parts
List list = message.getContent(List.class);
String jsonString = "";
for (int i = 0; i < list.size(); i++) {
jsonString = list.get(i).toString();
}
Response response = Response.status(Response.Status.ACCEPTED)
.entity(xssRequestWrapper.stripXSS(jsonString)).build();
message.getExchange().put(Response.class, response);
}
}
}
此拦截器将用于以下其余 api 操作:-
@POST
@Path("details2")
@Consumes({ MediaType.APPLICATION_JSON })
@Produces({ MediaType.APPLICATION_JSON })
public 响应 getPersonalInfoDetails2(String jsonString) 抛出 DataNotFoundException;
我正在使用 CXF 处理 XSS 拦截器任务。根据项目依赖项,我不能使用 Jersey。而且我看不到任何使用拦截器或过滤器从请求中更改表单数据(表单参数)的方法。 我从文档中发现我们不能使用 cxf 修改请求参数(不包括查询参数),尽管 jersey 提供了修改这些参数的方法。
但是在拦截器中我也看不到任何修改表单参数的方法。我可以看到很多修改 headers / 查询参数的示例。但是看不到任何修改请求参数的例子。谁能提供一些帮助并为此提供示例代码示例。
现在我正在检查 ReaderInterceptor。但它也没有像调用拦截器那样调用。如果您对此也有任何想法,请告诉我。
您必须定义一个拦截器来捕获入站消息,然后再由您的业务服务处理它们,提取表单参数,传递 XSS 过滤器并根据您的需要更新参数或中止处理。
拦截器
这是一个使用 CXF 的基本示例 AbstractPhaseInterceptor
public class XSSInterceptor extends AbstractPhaseInterceptor<Message> {
public XSSInterceptor () {
super(Phase.INVOKE);
}
@Override
public void handleMessage(Message message) throws Fault {
// filter only application/x-www-form-urlencoded
String contentType = (String)message.get(Message.CONTENT_TYPE);
if (MediaType.APPLICATION_FORM_URLENCODED.equals(contentType)){ /
// message parts
List list = message.getContent(List.class);
for (int i = 0; i < list.size();i++){
//get the parameter map
MultivaluedMap<String, String> params = (MultivaluedMap<String, String> )list.get(i);
for(String param: params.keySet()){
List<String> values = params.get(param);
//XSS filter here. Update the value list if needed or abort the request
List<String> updatedValues = xssFilter(values);
params.put(param, updatedValues);
}
}
}
}
@Override
public void handleFault(Message messageParam) {
}
}
CXF配置
<bean id="xssInterceptor" class="XSSInterceptor" />
<cxf:bus>
<cxf:inInterceptors>
<ref bean="xssInterceptor"/>
</cxf:inInterceptors>
</cxf:bus>
此配置将应用于这样的服务
@POST
@Path("/form")
@Consumes({MediaType.APPLICATION_FORM_URLENCODED})
public Response form(MultivaluedMap<String, String> params) throws WebApplicationException;
*RequestContextFilter
或者您可以使用 RequestContextFilter
public class CustomRequestFilter implements ContainerRequestFilter {
public void filter(ContainerRequestContext context) {
Message m = JAXRSUtils.getCurrentMessage();
//XSS filter here. In the same way the above intercerceptor
// finally use context.abortWith(Response) if you need to block the request
Spring 配置
<bean id="customRequestFilter" class="com.CustomRequestFilter" />
<!-- Add filters to provider zone in JAX-RS server-->
<bean id="myRestServer" class="org.apache.cxf.jaxrs.JAXRSServerFactoryBean" lazy-init="false" init-method="create">
...
<property name="providers">
<list>
<ref bean="customRequestFilter" />
</list>
</property>
@预匹配 public class XSSInterceptor 扩展了 AbstractPhaseInterceptor {
private XSSRequestWrapper xssRequestWrapper;
public XSSInterceptor() {
super(Phase.POST_LOGICAL);
}
@SuppressWarnings("unchecked")
@Override
public void handleMessage(Message message) throws Fault {
HttpServletRequest httpRequest = (HttpServletRequest) message.get("HTTP.REQUEST");
xssRequestWrapper = new XSSRequestWrapper(httpRequest);
// filter only application/x-www-form-urlencoded
String contentType = (String) message.get(Message.CONTENT_TYPE);
if (MediaType.APPLICATION_FORM_URLENCODED.equalsIgnoreCase(contentType)
|| MediaType.APPLICATION_JSON.equalsIgnoreCase(contentType)) {
// message parts
List list = message.getContent(List.class);
String jsonString = "";
for (int i = 0; i < list.size(); i++) {
jsonString = list.get(i).toString();
}
Response response = Response.status(Response.Status.ACCEPTED)
.entity(xssRequestWrapper.stripXSS(jsonString)).build();
message.getExchange().put(Response.class, response);
}
}
}
此拦截器将用于以下其余 api 操作:- @POST @Path("details2") @Consumes({ MediaType.APPLICATION_JSON }) @Produces({ MediaType.APPLICATION_JSON }) public 响应 getPersonalInfoDetails2(String jsonString) 抛出 DataNotFoundException;