J'utilise un plan d'hébergement Web Godaddy sur une plate-forme Windows. Ce n'était pas mon choix - cela a à voir avec une autre partie du site actuel utilisant ASP.NET (pas non mon choix). p>
J'ai une base de données SQL avec une bande d'entrées avec des informations client non sensibles. La clé principale de ceci est un entier d'autocrampe, et j'ai une série de fichiers PDF qui correspondent à chacun de ces entiers (par exemple 555.pdf, 7891.PDF, etc.). P>
Mon objectif est de limiter l'accès direct à ces fichiers, je souhaite que les utilisateurs devaient d'abord suivre un processus de recherche et de connexion (PHP). À l'origine, j'ai envisagé de mettre les fichiers au-dessus du dossier public_html, mais Godaddy refuse de me donner un accès root sans serveur dédié (20 $ par mois d'entre eux). p>
La prochaine chose que j'ai regardée était htaccess. J'allais limiter l'accès aux fichiers à seulement des scripts PHP en permettant uniquement l'accès à l'adresse IP du serveur (ou localhost / 127.0.0.1). Malheureusement, cela ne fonctionne pas car Godaddy n'exécute pas Apache sur ses serveurs Windows. P>
Je pourrais mettre les fichiers dans les blobs dans la base de données, mais cela devient vraiment désordonné lorsque j'ai besoin de travailler avec eux rapidement (plus j'ai eu des problèmes avec cette approche). P>
Toute suggestion pour limiter l'accès aux fichiers uniquement à un script PHP (ReadFile ())? P>
4 Réponses :
Vous pouvez simplement les cacher. C'est la sécurité par l'obscurité, mais cela ressemble à votre meilleure option si vous ne pouvez pas les garder hors de la racine Web ou trouver un moyen de dire au serveur de ne pas les servir directement.
Alors enfoncez-les dans Un répertoire aléatoire nommé: p> puis écrivez-vous un petit script PHP qui enverra des en-têtes appropriés et transmettez le contenu du fichier via. P> par exemple : P> <?PHP
//pdf.php
$id = $_GET['id'];
//make sure nobody is doing anything sneaky. is_numeric() might do the trick if the IDs are always integers.
if (!some_validation_passes($id)){
die();
}
<?php
header('Content-type: application/pdf');
header('Content-Disposition: attachment; filename="'.$id.'.pdf"');
readfile('asd8b8asd8327bh'.$id.'pdf');
C'est la sécurité par l'obscurité. En d'autres termes, pas sécurisé.
@Borealid Vous dites que comme si je n'avais pas explicitement qualifié ma réponse en première ligne. Ne pas entrer dans un débat sur la sécurité par l'obscurité, mais "c'est un logiciel. En d'autres termes, pas sécurisé". Ou "Ceci est un système de mot de passe, et donc non sécurisé". En fait, maintenant que je pense à cela, ma solution est à peu près aussi sécurisée qu'un mot de passe puissant, en supposant qu'aucun trou non lié permet aux annuaires de la liste d'attaquants.
Faites un web dossier inaccessible via chmod. PHP sera toujours en mesure d'inclure / besoin de ce qui est sur le serveur, mais les utilisateurs ne seront pas en mesure de naviguer vers les fichiers de tous les temps. P>
exemple: Ceci est défini sur 770, c'est-à-dire que l'utilisateur et le groupe peuvent lire / écrire / exécuter, d'autres ne peuvent rien faire. P>
Cette réponse est fausse. En empêchant une configuration SUEXEC / CGI, PHP utilise les autorisations du serveur Web. Si le fichier est inaccessible sur le serveur Web, il est également inaccessible à PHP.
J'ai un dossier défini sur 770 et je suis capable d'inclure, mais je ne peux pas naviguer directement dans mon navigateur.
De plus, je pense que vous avez mal compris, le serveur Web dispose toujours des autorisations, des utilisateurs et du groupe ont des autorisations en 770, d'autres ne le font pas. Cela donne donc un accès complet à PHP aux fichiers, le navigateur Web n'obtiendra rien.
Je ne comprends pas comment je pourrais chmod dans le système s'il n'est pas un système Linux !?
Si vous n'êtes pas sur un système Linux, recherchez des paramètres de sécurité équivalents pour l'environnement Windows.
Parce que PHP utilise les autorisations de l'utilisateur du serveur Web, il n'est pas moyen de restreindre l'accès aux fichiers sans non plus: p>
Les mettre dans une base de données compte comme en dehors du docroot. Pour la troisième option, vous pouvez créer les fichiers PDFS PHP, mais honnêtement, ce serait assez compliqué. P>
Je vous recommande de contacter Godaddy et voyez s'ils ont un moyen de configurer des autorisations de fichier par répertoire. P>
Astucieux. En supposant que OP ne puisse rien faire sur le serveur, j'aime votre troisième option, couplé au code de base que j'ai décrit.
Étant donné que vous ne pouvez pas mettre les fichiers nulle part, mais dans votre répertoire public_html, vous devrez choisir la méthode «Sécurité par obscurité» crainte / détestée
créer un sous-répertoire nommé de manière aléatoire pour stocker les fichiers dans: public_html / randomgarbage p> li>
Assurez-vous que le répertoire n'est pas navigable. Désactiver la navigation du répertoire (si vous le pouvez) et mettre un document par défaut (index.html?) Dans votre référence également, alors même si la navigation est activée, vous n'obtiendrez pas la liste de répertoires. P> LI>
Ne stockez pas vos fichiers avec des noms devinables. Au lieu de les stocker avec l'identifiant de la base de données, rangez-les à la place d'un nom salé + haché: Servez les fichiers via un script PHP - ne liez jamais directement au nom de fichier haché directement p>
Télécharger P> LI>
ol> qui fait alors: p> de cette façon, l'utilisateur ne verra jamais ce que votre nom de fichier "S00PER DRIT" est, ils verront simplement leur navigateur sur le dessus de cela, vous pouvez occasionnellement renommer le sous-sol spécial -Directory à quelque chose d'autre sur une base régulière, tout en modifiant le texte du sel (qui nécessite ensuite de mettre à jour tous les noms de fichiers hachés avec les nouvelles valeurs SHA1). P> P> $ crypted_filename = SHA1 ($ real_filename. "Quelques textes de sel difficiles" (bien sûr, rendre cela plus complexe si vous avez besoin de). Stockez le nom de fichier d'origine dans votre base de données. Donc, vous vous retrouvez avec quelque chose comme: p>
Public_html / RandomGarbage / 5BF1FD927DFB8679496A2E6CF00CBE50C1C87145 CODE>
Public_HTML / RandomGarbage / 7ec1F0EB9119D48EB6A3176CA47380C6496304C8 CODE> P> LI>
... php? fileid = 37 code> et démarrez un téléchargement de
fichier secret.pdf code> p>
Cela dépendra du serveur Web qu'ils utilisent (IIS, Supposons). Peut-être devriez-vous marquer cela avec IIS.