Symfony + WSSE: Почему папка кэша nonce имеет размер 20 ГБ?

Я работаю над проектами на основе Symfony 3.4, в которых используется аутентификация WSSE, как описано в документации Symfony< /а>.

Каждый одноразовый номер хранится в виде отдельного файла в каталоге кэша myProject/var/cache/prod/security/nonces. Проблема в том, что этот каталог становится очень и очень большим. Проект запущен и работает, и одноразовые номера уже занимают почти 20 ГБ на диске!

$ cd myProject/var/cache/prod/security/
$ du -sch *
19G    nonces
19G    total

Мне кажется, что это довольно много ... Я попытался выяснить, сколько одноразовых номеров хранится, и использовал следующую команду для подсчета файлов:

$ cd myProject/var/cache/prod/security/nonces
$ find -maxdepth 1 -type f | wc -l
4697417

Даже для 4,7 млн ​​файлов 19 ГБ кажется многовато. Каждый файл должен иметь размер примерно около 4 КБ. Однако, насколько я могу судить, каждый файл имеет только 10 байт...

$ cd myProject/var/cache/prod/security/nonces
$ ls -lh
-rw-r----- 1 user nobody 10 Jul 25 16:46 'MWFiYWM5YjAiOTRyOWRmZA=='
-rw-r----- 1 user nobody 10 Jul  1 19:41 'MWFiYWNiYTflNTdhLGYwYQ=='
-rw-r----- 1 user nobody 10 Sep 29 11:05 'MWFiYWNkNzEjZfFlCjM0OQ=='
...

Я знаю, что существует разница между размером файла и занимаемым дисковым пространством. Однако du также показывает 10 байт дискового пространства:

$ du -sb --apparent-size MWFiYWNkNzEjZfFlCjM0OQ==
10

Итак, как файлы могут занимать 19 ГБ дискового пространства, в то время как каждый файл использует только 10 Б? Я что-то упускаю? Или я не правильно использовал команды?

Не лучше ли хранить одноразовые номера?

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


person Andrei Herford    schedule 27.10.2020    source источник
comment
Я не знаю о WSSE, но размер на диске может зависеть от размера вашего дискового блока. Может быть, вы можете хранить одноразовые номера в базе данных?   -  person Fabien Papet    schedule 27.10.2020
comment
@FabienPapet Спасибо. Как описано в вопросе, я знаю, что существует разница между размером файла и дисковым пространством из-за размера блока. Однако использование du должно показывать потребляемое дисковое пространство, не так ли?   -  person Andrei Herford    schedule 27.10.2020
comment
Я не знаю об использовании du, вы можете попробовать на сайте суперпользователя, у них будет ответ   -  person Fabien Papet    schedule 27.10.2020
comment
Да du сообщает о потребленном дисковом пространстве. В вашем случае это 4 КБ на файл, потому что 4 КБ — это размер блока вашей файловой системы.   -  person simon.ro    schedule 27.10.2020


Ответы (1)


Размер файла

du сообщает о размере потребляемого дискового пространства. Дисковое пространство выделяется блоками. Таким образом, минимальное пространство, которое может занимать файл, составляет 1 блок. В вашем случае размер блока вашей файловой системы составляет 4 КБ. Следовательно, ~4,7 миллиона файлов размером 10 байт потребляют 4700000 * 4 КБ, что составляет около 19 ГБ.

Как долго хранить одноразовые номера

Nonces обычно кэшируются на несколько минут. Упомянутая вами поваренная книга Symfony рекомендует использовать nonce ttl в 5 минут. Вот выдержка из этой документации

class WsseProvider implements AuthenticationProviderInterface
{
  protected function validateDigest($digest, $nonce, $created, $secret)
    {
        // Check created time is not in the future
        if (strtotime($created) > time()) {
            return false;
        }

        // Expire timestamp after 5 minutes
        if (time() - strtotime($created) > 300) {
            return false;
        }

        // Try to fetch the cache item from pool
        $cacheItem = $this->cachePool->getItem(md5($nonce));

        // Validate that the nonce is *not* in cache
        // if it is, this could be a replay attack
        if ($cacheItem->isHit()) {
            // In a real world application you should throw a custom
            // exception extending the AuthenticationException
            throw new AuthenticationException('Previously used nonce detected');
        }

        // Store the item in cache for 5 minutes
        $cacheItem->set(null)->expiresAfter(300);
        $this->cachePool->save($cacheItem);

        // Validate Secret
        $expected = base64_encode(sha1(base64_decode($nonce).$created.$secret, true));

        return hash_equals($expected, $digest);
    }
}

Одноразовые номера добавляются в кэш-пул с ttl 5 минут. Хранение одноразовых номеров дольше, чем время, которое вы считаете действительным созданное поле (пять минут в этом примере if (time() - strtotime($created) > 300)), не добавляет никакой дополнительной безопасности, потому что, как только дата создания устаревает, повторный запрос может быть отклонен на основе созданной метки времени.

person simon.ro    schedule 27.10.2020