使用Apache CXF的Jax-rs的XSS拦截器

时间:2016-08-03 06:26:47

标签: jax-rs cxf xss interceptor

我正在使用CXF处理XSS拦截器任务。根据项目依赖关系,我不能使用Jersey。并且我看不到使用拦截器或过滤器从请求更改表单数据(表单参数)的任何方法。 我从文档中发现,我们无法使用cxf修改请求参数(不包括查询参数),尽管jersey提供了一种修改这些参数的方法。

但是在拦截器中我也无法看到任何修改表单参数的方法。我可以看到许多示例来修改标头/查询参数。但是看不到任何修改请求参数的例子。任何人都可以提供一些帮助,并为此提供示例代码示例。

现在我正在使用ReaderInterceptor进行检查。但它也不像调用拦截器一样调用它。如果您对此有任何疑问,请告诉我。

2 个答案:

答案 0 :(得分:0)

您必须定义一个拦截器,以便在您的商务服务处理之前捕获入站邮件,提取表单参数,传递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 config

<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>

答案 1 :(得分:0)

@PreMatching 公共类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(&#34; details2&#34)     @Consumes({MediaType.APPLICATION_JSON})     @Produces({MediaType.APPLICATION_JSON})     public Response getPersonalInfoDetails2(String jsonString)抛出DataNotFoundException;