Protéger un document créé avec papercl ip


#1

Bonjour,

J’utilise paper clip pour gérer des documents associés à un model et à
un controleur archive.
Déclaration paperclip se fait comme suit on y associe :document
class Archive < ActiveRecord::Base
has_attached_file :document, :styles => {:original =>
‘450x450>’,:thumb => [‘48x48>’, :jpg] },
:winy_thumbnail => true

Ces documents sont accessibles en fontion du profil de l’utilisateur
(admin, modérateur, …).
Je sais gérer l’accès au model/table archive au travers de mon
controleur et d’un before_filter, pour éviter qu’en tapant l’url
l’utilisateur ait accès à une archive à laquelle il n’a pas droit mais
comment faire de même pour document associé à cette archive qui a une
URL du type
http://localhost:3000/documents/5/original/DSC_1670-pola.jpg?1228464397

Merci
Nicolas


#2

En trois étapes :

  1. ne pas stocker les documents dans le répertoire “public” mais dans
    un
    répertoire de ton choix (tu as le droit de le créer pour l’occasion),
    paperclip te permet de stocker les documents où tu veux
  2. faire un contrôleur qui va gérer l’accès aux documents, avec une
    méthode show qui envoie en brut les données du fichier avec un type
    mime
    idoine dans les headers uniquement si l’utilisateur y a accès
  3. pour que tous les navigateurs reçoivent correctement les fichiers
    en
    tant que fichiers, l’idéal est de faire des liens vers des urls qui
    se
    terminent comme un nom de fichier du bon type

Voilà , reste plus qu’à .


Michel B.


#3

Bonjour Michel,

Merci de ta réponse, pour envoyer les fichiers tu utilises send_file,
c’est ça?

Nicolas

On Dec 9, 12:04 am, “Michel B.” removed_email_address@domain.invalid


#4

On Tue, Dec 9, 2008 at 13:10, Alban P. removed_email_address@domain.invalid
wrote:

passer par X-Sendfile : http://john.guen.in/rdoc/x_send_file/
Je préfère utiliser un système avec une string contenant du random
pour le répertoire de stockage du fichier ainsi que des liens
symboliques. Ca permet de ne pas passer par la stack rails et avec un
ttl assez faible pour les liens symboliques on conserve une assez
bonne sécurité.


http://fabien.jakimowicz.com


#5

Merci à tous,

Le problème c’est que cette solution repose sur le mod apache
xsendfile et mon hébergeur ne l’a pas installé pour l’instant.

Fabien, tu peux me donner un exemple de la façon dont tu génères tes
répertoires avec paper clip, c’est peut être une solution temporaire.

Merci


#6

send_file en effet.

Si les downloads sont importants (nombreux, gros, …), il y a moyen de
passer par X-Sendfile : http://john.guen.in/rdoc/x_send_file/

Alban P. - removed_email_address@domain.invalid
http://people.tryphon.org/~alban

Hmm, mais avec X-Sendfile, ça bloque le processus Rails durant l’envoie
de fichier non?

Sur notre site de video à la demande http://www.digiprof.fr, nous
protégeons notre contenu numérique en utilisant X-Accel-Redirect proposé
par Nginx. Sinon la solution du string random est toute indiquée (c’est
comme ça qu’imageshack.us fonctionne au passage) surtout si vous
utilisez un mutualisé qui n’a pas Nginx ni le module apache requis.


#7

Bonjour,

Tranquiliste wrote:

Merci de ta réponse, pour envoyer les fichiers tu utilises send_file,
c’est ça?

send_file en effet.

Si les downloads sont importants (nombreux, gros, …), il y a moyen de
passer par X-Sendfile : http://john.guen.in/rdoc/x_send_file/

Alban P. - removed_email_address@domain.invalid
http://people.tryphon.org/~alban


#8

Bonjour,

Merci de ces précisions. Juste des questions de béotien:

1- Si j’utilise le string random avec mes dossier dans /public/ , cela
va empêcher à des utilisateurs lamda de taper au hasard des URLs et
d’accèder trop facilement à des documents auxquels ils n’ont pas
accès, mais ça n’empêchera pas des robots de les trouver et de les
afficher? Renseigner le robot.txt suffit il dans ce cas?

2- Si je ne met pas mes documents dans /public alors dans ce cas les
documents ne sont pas accessibles via une URL et il faut que j’utilise
une solution à base de “send_file” (ou équivalent.

Est ce que j’ai bien compris?


#9

2008/12/10 Tranquiliste removed_email_address@domain.invalid:

Bonjour,

Merci de ces précisions. Juste des questions de béotien:

1- Si j’utilise le string random avec mes dossier dans /public/ , cela
va empêcher à des utilisateurs lamda de taper au hasard des URLs et
d’accèder trop facilement à des documents auxquels ils n’ont pas
accès, mais ça n’empêchera pas des robots de les trouver et de les
afficher? Renseigner le robot.txt suffit il dans ce cas?

Si ton serveur web est bien configuré, personne ne devrait pouvoir
accéder aux fichiers publics sans avoir l’url. Et si ta string random
est assez longue, ca ne devrait pas être facilement attaque sans se
faire voir.

2- Si je ne met pas mes documents dans /public alors dans ce cas les
documents ne sont pas accessibles via une URL et il faut que j’utilise
une solution à base de “send_file” (ou équivalent.

Oui, il ne sont pas accessible par le serveur web qui par défaut
n’hostera que le contenu de public en tant que contenu statique.


http://fabien.jakimowicz.com


#10

1- Si j’utilise le string random avec mes dossier dans /public/ , cela
va emp�cher � des utilisateurs lamda de taper au hasard des URLs et
d’acc�der trop facilement � des documents auxquels ils n’ont pas
acc�s, mais �a n’emp�chera pas des robots de les trouver et de les
afficher? Renseigner le robot.txt suffit il dans ce cas?
Un robot va suivre des liens pour arriver aux ressources stockées sur
ton serveur. Si aucun lien ne pointe vers tes resources privées, un
robot ne pourra pas les trouver facilement, Ã moins de faire un brute
force en testant toutes les url possibles et imaginables, donc il
laissera tomber.

Il faut bricoler avec SHA1:
require ‘digest/sha1’
secret_string = Digest::SHA1.hexdigest(‘mon_fichier’) + “mon_fichier”

Tu vas voir que ça génère une chaîne de caractère tellement longue que
ça dissuadera n’importe qui. Attention SH1 ne garantie pas l’unicité du
résultat, donc c’est pour ça que j’ai rajouté le nom du fichier en plus,
tu peux rajouter une date, tronque le nom du fichier.