Безопасность

Приложение не использует готовые фреймворки и за безопасность полностью отвечает разработчик.

С web связаны различные уязвимости рассмотрим некоторые из них.

Атака на идентификаторы

Мы используем последовательные идентификаторы, таким образом можно легко просмотреть все страницы.

Кроме этого идентификаторы глобально уникальны, и может возникнуть ситуация, когда в интерактор удаления поста злоумышленник передал идентификатор пользователя, а интерактор не проверяет права или тип агрегата.

Для защиты можно шифровать идентификаторы с помощью hashids или добавлять в query параметр подпись URL: /posts/1?sign=some-sign, а при обработке поверять эту подпись.

Cross Site Request Forgery

На backend используется библиотека ring-anti-forgery. Она состоит из middleware, проверяющая CSRF токен, и динамической переменной, содержащей этот токен.

(ns publicator.web.handler
  (:require
   [ring.middleware.anti-forgery :as ring.anti-forgery]
   [publicator.web.routing :as routing]
   ;;...
   ))

(defn build [binding-map]
  (-> routing/handler
      ;; ...
      ring.anti-forgery/wrap-anti-forgery
      ;; ...
      ))

Презентер получает токен, и добавляет его в ViewModel:

(ns publicator.web.presenters.layout
  (:require
   [publicator.use-cases.services.user-session :as user-session]
   [publicator.web.routing :as routing]
   [ring.middleware.anti-forgery :as anti-forgery]))

(defn present [req]
  (cond-> {:csrf anti-forgery/*anti-forgery-token*}
  ;; ...
  ))

В html > head добавляются мета-теги

<meta name="csrf-token" content="{{csrf}}">
<meta name="csrf-param" content="__anti-forgery-token">

Мы используем rails-ujs для реализации ссылок, отправляющих post запросы. Она автоматически подхватывает этот токен и вставляет его в форму при отправке.

form-ujs с помощью которой отправляются формы так же подхватывает токен.