Проверка на допустимый тип вложений в Multipart-FormData#

Допустим, существует поток данных, в виде запросов в виде Multipart/Formdata, и известно, что в некотором поле archive должны передаваться только gzip архивы. Рассмотрим конфигурацию, которая позволяет это делать. Добавим в наш профиль chains еще один сервис:

- id: 5
  allowed_queries:
    - method: post
  optional:
    file_upload_limit: off
  url: /balancer$
  listen:
    - port: 20205
  chains:
    request_chains:
      - actions:
        - action: MultipartExtract
          params:
            field_name: archive
          actions:
            - action: CheckMimeType
              params:
                file_filter_type: extension
                allowable_types: gz
        message: $clj_request_body
  upstream_group_id: 1
  upstream_groups:
    - id: 1
      servers:
        - server: 127.0.0.1:30001
      rewrite_uri:
       - from: /balancer
         to: /test

Обратите внимание:

  1. В секции optional с помощью директивы file_upload_limit и выставления значения off разрешаем передачу muiltipart/formdata, которая по умолчанию не разрешена.

  2. Определяем цепочку действий для запроса, где первым действием идет извлечение поля archive, а вторым действием идет проверка на соответствие реального mime-типа сообщения на application/gzip, при этом данное ограничение задается через зарегистрированное расширение для этого Mime-типа «gz».

Остановим, сконфигурируем и запустим профиль.

Сгенерируем файл, содержащий случайную последовательность байт и запакуем его утилитой gzip:

[sowacfg@741037ad695c chains_examples]$ head -c 1k </dev/urandom >test
[sowacfg@741037ad695c chains_examples]$ gzip test

На выходе получили файл test.gz.

Теперь попробуем отправить данный файл в multipart/formdata:

[sowacfg@741037ad695c chains_examples]$ curl -v http://localhost:20205 -F "archive=@test.gz"

В результате получаем:

d41

Сгенерируем еще один файл со случайным набором байт и попробуем отправить его:

[sowacfg@741037ad695c chains_examples]$ head -c 1k </dev/urand >test2
[sowacfg@741037ad695c chains_examples]$ curl -v http://localhost:20205/balancer -F "archive=@test2"

На выходе получаем:

d42

Немного модифицируем нашу конфигурацию сервиса, добавив еще проверку на допустимый размер вложения перед его проверкой на MIME-тип, конфигурация цепочки приобретет следующий вид:

request_chains:
- actions:
  - action: MultipartExtract
    params:
      field_name: archive
    actions:
      - action: CheckDataSize
        params:
          max_allowable_size: 5k
      - action: CheckMimeType
        params:
          file_filter_type: extension
          allowable_types: gz
  message: $clj_request_body

Здесь задается ограничение, что размер вложений не должен превышать 5 килобайт. Остановим, сконфигурируем и запустим профиль.

Сгенерируем еще один файл размером 10 kb и запакуем его в gz.

[sowacfg@741037ad695c chains_examples]$ head -c 10k </dev/urandom >test2
[sowacfg@741037ad695c chains_examples]$ gzip test2

Отправим форму с файлом на наш сервис:

[sowacfg@741037ad695c chains_examples]curl -v http://localhost:20205/balancer -F "archive=@test2.gz"

В ответ получим: d43

Если отправим первый файл, то в ответ получим OK: d44