Файловый репозиторий в ruby ​​на рельсах - PullRequest
2 голосов
/ 04 июня 2011

Я хотел бы создать простой файловый репозиторий в Ruby on Rails.У пользователей есть свои учетные записи, и после одного входа они могут загрузить файл или загрузить ранее загруженные файлы.

Проблема здесь заключается в безопасности.Файлы должны быть безопасными и недоступными для всех, кроме владельцев.

  1. Где, в какой папке я должен хранить файлы, чтобы сделать их максимально безопасными?
  2. Имеет ли смысл переименовывать загруженные файлы, хранить имена в базе данных и восстанавливать их при необходимости?Это может помочь избежать конфликтов имен, хотя я не уверен, что это хорошая идея.
  3. Должны ли файлы храниться в одной папке или они должны быть несколько разделены?

Ответы [ 4 ]

5 голосов
/ 04 июня 2011
  • переименуйте файлы, по одной причине, потому что у вас нет возможности узнать, должен ли сегодняшний файл "test" заменить "тест" прошлой недели или нет (возможно, у пользователя они были в разных каталогах)
  • предоставляет каждому пользователю свой собственный каталог, это предотвращает проблемы с производительностью и позволяет легко переносить, архивировать или удалять одного пользователя
  • помещать метаданные в базу данных и файлы в файловую систему
  • обратите внимание на ввод кода через имя файла
3 голосов
/ 04 июня 2011

Это интересный вопрос. В зависимости от уровня безопасности, который вы хотите применить, я бы порекомендовал следующее:

  1. Выберите папку, доступную только вашему серверу приложений (если вы решили сохранить в FS)

  2. Я бы всегда рекомендовал переименовывать файлы в произвольно сгенерированный хеш (или сгенерированное по инкременту имя, например, используемое в средствах сокращения URL, см. Реализацию rubyurl с открытым исходным кодом). Тем не менее, я не буду хранить их в базе данных, потому что файловые системы созданы для обработки файлов, так что пусть это сделает свою работу. Вы должны хранить метаданные в базе данных, чтобы иметь возможность установить правильное имя файла, когда пользователь загружает файл.

  3. Вы должны разбить файлы на несколько папок. Это дает вам множество преимуществ. Во-первых, файловые системы не созданы для обработки миллионов файлов в одной папке. Если у вас есть операции, которые пытаются получить все файлы из папки, это занимает значительно больше времени. Если вы запутаете исходное имя файла, вы можете создать один каталог для каждой буквы в имени файла и получить довольно хорошее распределенное количество файлов в каталоге.

Последнее, что нужно учитывать, - это возможное столкновение имен файлов. Пользователь не должен иметь возможность угадать имя файла от другого пользователя. Так что здесь вам могут потребоваться дополнительные проверки.

В зависимости от уровня безопасности, которого вы хотите достичь, вы можете применять все больше и больше шаблонов.

2 голосов
/ 04 июня 2011

Только не сохраняйте файлы в общей папке и не создавайте контроллер, который будет отправлять файлы.

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

1 голос
/ 04 июня 2011

Для простых случаев (когда вы не хотите распространять хранилище файлов):

  1. Сохраните файлы в каталоге tmp.НЕ храните их в public.Затем открывайте эти файлы только через маршрут и контроллер, где вы проверяете аутентификацию / авторизацию.

  2. Я не вижу причин переименовывать файлы;Вы можете разделить их на подкаталоги на основе идентификатора пользователя.Но если вы хотите разрешить загрузку файлов с одинаковыми именами, вам может потребоваться сгенерировать уникальный хэш или что-то еще для имени каждого файла.

  3. См. Выше.Вы можете разделить их так, как считаете нужным.Но я бы определенно рекомендовал разбить их на части, а не объединять в одну директорию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...