2016-08-03 5 views
1

Я работаю над задачей перехватчика XSS с использованием CXF. В зависимости от зависимостей проекта я не могу использовать Джерси. И я не вижу способа изменить данные формы (параметры формы) из запроса с помощью перехватчиков или фильтров. Я нашел из документов, что мы не можем изменять параметры запроса (исключая параметры запроса), используя cxf, хотя jersey предоставляет способ изменения этих параметров.XSS-перехватчик для Jax-rs с использованием Apache CXF

Но в Interceptors также я не могу увидеть способ изменения параметров формы. Я могу увидеть множество примеров для изменения параметров заголовков/запросов. Но не вижу никакого примера для изменения параметров запроса. Может ли кто-нибудь предоставить некоторую помощь и дать мне пример кода для этого.

Прямо сейчас я проверяю с помощью ReaderInterceptor. Но он также не вызывается как способ вызова Interceptors. Пожалуйста, дайте мне знать, если у вас есть представление об этом.

ответ

0

Вы должны определить перехватчик для захвата входящих сообщений до того, как они будут обработаны службой bussiness, извлеките параметры формы, передайте фильтр 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> 
+0

Спасибо за помощь XSSInterceptor работает нормально, но мы не можем обновлять параметры формы с помощью CustomRequestFilter. Я попробовал, но это провалилось. – Sandeep

+0

hi @pedrofb, можете ли вы мне помочь, если мы изменим MediaType нашего сервиса отдыха от APPLICATION_FORM_URLENCODED до Application_json. Потому что в моем случае наш пользовательский интерфейс отправит только запрос Application_json, и в этом случае он не работает. Какие изменения мне нужно сделать для этого – Sandeep

+0

С помощью 'application/json' вам приходится иметь дело с входящим потоком, а не с параметрами. Получите его с помощью 'message.getContent (InputStream.class) ', потреблять и обрабатывать строковые данные и устанавливать новое содержимое с помощью' message.getExchange(). setContent (проанализированоStream) ' – pedrofb

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 ("details2") @Consumes ({MediaType.APPLICATION_JSON}) @Produces ({MediaType .APPLICATION_JSON}) public Response getPersonalInfoDetails2 (String jsonString) выдает DataNotFoundException;

 Смежные вопросы

  • Нет связанных вопросов^_^