Mon composant produira des factures au format PDF qui pourra être téléchargé par les clients).
Où est le meilleur endroit pour stocker ces fichiers?
/adminitrator/componentes/com_mycomponent/invoices
/componentes/com_mycomponent/invoices
/media/com_mycomponent/invoices
Comment puis-je empêcher les utilisateurs non autorisés de télécharger directement ces fichiers?
Comment puis-je empêcher les clients de télécharger les factures d'autres personnes?
Je déconseille d'utiliser
administrator/components/com_mycomponent/invoices
En effet, cela pourrait poser un problème lorsque vous utilisez .htaccess
sur votre répertoire d’administrateur. Par exemple, avec Akeeba Admin Tools
Je préférerais également utiliser le dossier multimédia.
Vous pouvez également servir les fichiers hachés avec leurs noms d'origine propres, comme ceci:
<?php
header("Content-type:application/pdf");
// It will be called Nice_TITLE.pdf
header("Content-Disposition:attachment;filename='Nice_TITLE.pdf'");
// The PDF source is in HASHED_FILE.pdf
readfile("HASHED_FILE.pdf");
?>
Cela ne répond peut-être pas directement à votre question, mais je voulais donner un autre point de vue sur cette question.
Je voudrais essayer de éviter autant que possible de stocker les documents que vous pouvez générer. Raison: vous devez décider des noms de dossier/nom de fichier, qui sont difficiles à modifier ultérieurement. Il peut utiliser trop d’espace et poser des problèmes de sécurité.
Bien sûr, cela dépend du fonctionnement de votre application, mais idéalement, je disposerais des données de facturation dans des tables de base de données et générerais des factures à la volée, le cas échéant.
Mes deux centimes.
Je pensais juste que je mettrais mes 2 centimes (quelques bons points dans le hachage du nom de fichier).
J'ai récemment eu un problème similaire. Au lieu de se soucier de .htaccess
, Je viens de sauvegarder les fichiers ci-dessus public_html
, avec un paramètre de composant spécifiant le chemin, puis en utilisant le readfile
de PHP pour extraire et générer le PDF.
Ne fonctionnera pas avec tous les hôtes, mais pour la plupart des applications, cela demande relativement peu d'effort et empêche complètement tout lien de liaison ou autre accès.
Ne stockez jamais de fichiers générés par l'utilisateur dans les répertoires des composants. Vous risquez de les perdre lors d'une mise à jour de votre composant (si cela n'est pas fait correctement) ou à coup sûr lorsque l'utilisateur le désinstalle.
Le bon endroit pour stocker de tels fichiers est en réalité le dossier "images". C'est l'endroit où l'utilisateur pourra gérer les fichiers facilement à l'aide du gestionnaire de médias. Le dossier "media" serait un autre choix viable, mais il est en réalité plus destiné à contenir des ressources d'extension telles que CSS, JS, etc.
Toutefois, si les fichiers contiennent des données sensibles qui ne devraient pas être accessibles à quiconque, leur stockage dans l'un de ces dossiers est une mauvaise idée. Même si vous les hachez, vous pouvez être sûr que quelqu'un finira par être capable de les lire.
S'il doit être sécurisé, ne stockez pas le fichier et ne le générez pas de manière dynamique à la demande. Ou stockez-le en dehors de la racine Web et accédez-y à l'aide de PHP. Il n'y a pas d'autre moyen sécurisé.
Utiliser le répertoire suivant en tant que racine pour toutes les factures convient parfaitement:
administrator/components/com_mycomponent/invoices
Cependant, ce que je recommanderais est de hacher le nom du fichier une fois la facture générée. Ainsi:
administrator/components/com_mycomponent/invoices/HASHED_FILE.pdf
Ou bien, ou pour chaque facture, créez un répertoire haché et stockez le PDF dans celui-ci, comme suit:
administrator/components/com_mycomponent/invoices/HASHED_DIR/file.pdf
Mise à jour:
Si cette méthode est choisie, vous pouvez utiliser un fichier htaccess pour empêcher tout accès direct et n'autoriser que PHP accès contrôlé à ces fichiers PDF.
Pour un téléchargement PHP, je suggérerais de stocker le hachage dans une base de données tabling, avec l'identifiant de l'utilisateur. Lorsqu'une demande de téléchargement du fichier est faite, vous pouvez alors faire correspondre l'identifiant que vous ' Vous enregistrez avec l’ID de l’utilisateur actuellement connecté connecté et, bien sûr, correspond au hachage stocké dans la base de données.
Pour moi, son dossier multimédia convient le mieux à cette fin Pour restreindre l'accès direct, créez simplement un fichier .htaccess dans votre dossier avec le contenu ci-dessous.
DENY FROM ALL