2013-06-21 6 views
2

Мы хотим внедрить публичный RESTful API, встроенный в наше программное обеспечение (написанное в java), которое может использоваться различными клиентами для создания небольших приложений для электронной коммерции (например, для Android или iPhone). Этот API включает в себя получение списка продуктов, категорий, поддержки корзины покупок и т. Д.REST API для регистрации

Нам необходимо предоставить API, который позволит регистрировать пользователя и пару других чувствительных функций. Как мы должны защищать этот API от спама и грубой силы? В стандартном продукте мы используем reCAPTCHA. Любая альтернатива для партнера REST?

ответ

1

Во-первых, подумайте о разделении вопросов. Какова цель REST API?

API REST должен предлагать услугу клиенту. Клиент отправляет запрос через протокол REST и получает ответ на запрос. В коде это выглядит примерно так:

@GET 
public Response getClientInfo(@QueryParam("clientId") Integer clientId) { 
    ClientDTO clientDTO = database.getClientInfo(clientId); 
    return ResponseWrapper.wrap(clientDTO); 
} 

Теперь вы хотите, чтобы ваш метод REST выполнял ТОЛЬКО это и ничего больше. В противном случае вы бы поставили block-bruteforce-and-spam-logic в свой метод REST, и вы получите беспорядок кода, который не является расширяемым, труднодоступным для версии и т. Д. Если вы хотите изменить свой, например, политики черного списка, вам придется изменить каждый метод REST, и он громоздкий. Если вы хотите проверить вызовы до того, как сделать это с помощью методов REST, взгляните на Filters. Каждый запрос и ответ проходят через цепочку фильтров и могут быть проверены на неправильное использование сервера.

Я не знаю, что ваш стек технологии, но я хотел бы предложить, глядя на эти:

  • JBoss AS7.
  • DeltaSpike (включает в себя мощные перехватчики, которые будут проверять права пользователя и права выполнения перед выполнением метода REST).

, например:

@LoggedInUser 
@GET 
public Response getClientInfo(...) { 
    ... 
} 

Эта безопасность аннотация @LoggedInUser (который, кстати, можно определить) даст знак перехватчик, чтобы проверить это ограничение безопасности, например,

@Secures (built in annotation) 
@LoggedInUser 
public boolean hasRight(Identity identity) { 
    return identity.isLoggedIn(); //or if he is in certain group of users 
} 
  • контекст и контекст внедрения зависимостей (используемый в DeltaSpike).
  • JBoss Filters (цепь фильтров, в которой вы можете создать свой собственный фильтр, который, например, проверяет, пытается ли какой-либо IP-адрес несколько вызовов в течение короткого периода времени - 10 строк кода).

Пример фильтра

@Startup 
@ApplicationScoped 
@Filter(around= "org.jboss.seam.web.ajax4jsfFilter") 
public class IPTrackerFilter extends AbstractFilter { 

    //IPTracker is your @ApplicationScoped bean that remembers all IP addresses accessing the application. 
    @Inject 
    private IPTracker fIPTracker; 

    @Override 
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { 
     if (!(req instanceof HttpServletRequest)) { 
      chain.doFilter(req, res); 
      return; 
     } 

     final String ipAddress= ((HttpServletRequest)req).getRemoteAddr(); 
     if (fIPTracker.isBlackListed(ipAddress)) { 
      //implement error message here 
      sendErrorMessage(response); 
      return; 
     } else { 
      //all good, continue 
      chain.doFilter(req, res); 
     } 
    } 
} 

PS. Я дал вам ссылку для DeltaSpike, для других очень легко найти. Кроме того, если вы обнаружите, что DeltaSpike скрывается, попробуйте с JBoss Seam Security Framework.

+0

Спасибо за ваш комментарий. Технология, которую мы используем, представляет собой небольшую структуру, построенную на вершине Джерси. Мы обеспечили звонки, доступные для зарегистрированных пользователей, к сожалению, есть некоторые звонки, которые разрешены для анонимных пользователей (например, регистрация). Они должны быть каким-то образом защищены от спамеров, ботов, оскорбительных пользователей и т. Д. Я прочитаю ссылки, которые вы предоставили. –

+0

Затем взгляните на 'ContainerRequestFilter'. – darijan