Je dois fondamentalement créer un site Web sécurisé par une page de connexion écrite dans PHP qui une fois connectée, vous avez une barre de recherche qui lit les entiers et les données sont envoyées à un script PHP qui récupère une image avec le numéro comme son nom. . p>
(Je vais stocker quelques milliers d'images sur ce serveur à rechercher - Images d'inventaire) P>
- p>
ce que j'ai besoin d'aide avec: strong> p>
De mes recherches, je comprends que vous utilisez des bases de données telles que MySQL pour stocker des images réelles en raison de la vitesse et de l'inefficacité. Si vous ne le stockez pas dans une base de données et que vous le laissez sur le système de fichiers du serveur comme suggéré, si quelqu'un attribue une URL directe dans une barre d'adresse, ne les apporterait-il pas aux fichiers sur mon serveur? p>
Comment vous protectez-vous contre cela? Je ne serai pas de fichiers sur mon serveur pour être visible sans traverser avec succès la page de connexion. P>
Merci pour toute aide, toute idée ou suggestion serait appréciée. Cela est important pour moi car des informations plus complexes seront ajoutées à l'avenir. P>
3 Réponses :
Vous pouvez le faire de cette façon
Écrivez une ressource servir en php comme ceci dans ce fichier, vous obtenez des demandes demandes et lisez le lien réel (lien local) à partir de la base de données, lecture de fichier image, puis de sortie des données sur le navigateur p> $id = $_GET['requestid'];
$link = get_local_link_from_id($id); // return /images/file1.png......
$data = file_get_contents($link);
header('Content-Type', 'image/png');
echo $data;
Ils ont besoin de conserver le numéro d'origine, ce n'est pas mon système, mais comme demandé par la personne qui m'a embauché. Et c'est assez sécurisé? Tant que mon script PHP filtre demande, correct?
Obtenir n'est jamais sécurisé, même la poste aussi peut ne pas suffire à la sécurité.
@ilis - Quel est le point de votre commentaire? Obtenir et poster sont les méthodes utilisées par HTTP, elles sont "insécuritées" que si elles sont mal utilisées lors de l'interprétation de l'entrée de l'utilisateur.
@ N.b. Je pense que je ne serais pas assez pour expliquer le point sur l'insécurité d'entre eux pour le moment. Mais je reviendrai ici rapidement avec des détails complets (dans quelques jours)
Qu'est-ce qu'il y a à discuter? Le seul moyen de passer des données à l'aide de HTTP utilise GET / POST (dans le contexte actuel). Vous dites qu'ils sont peu sûrs. Non, ils ne sont pas peu sûrs. Qu'est-ce que l'insécurité est comment vous interprétez B> cette donnée, tout comme avec tout autre protocole là-bas. Il n'y a rien de mal avec le protocole ou les deux méthodes mentionnées. S'il vous plaît ne postez pas de commentaires trompeurs.
Un moyen recommandé de gérer les téléchargements de fichiers via PHP (ou tout autre script) consiste à utiliser l'en-tête de réponse «X-SendFile '». P>
Le script PHP gère l'authentification et une fois validé, il définira quelques en-têtes de réponse avec un "x-sendfile" qui indique au serveur Web de livrer un fichier; Le script se termine et le serveur Web prend la relève. P>
voir ici pour un exemple simple: p>
Ceci peut être surchargé pour votre SITUATION, mais c'est comme ça que je pense à le faire sur une application que je développe: p>
Tout d'abord, il y a 4 serveurs, un serveur Web, un serveur de logement moyen et un serveur de données p>
Lorsque quelqu'un envoie une demande au serveur Web, le serveur Web se connecte au serveur Middleware et demande le fichier, en passant le long de l'identification de l'utilisateur comme une clé de session et le fichier demandé. Le middleware se connecte à la base de données et valide la session ADN que les utilisateurs privilèges à ce fichier. Il retournera une erreur ou des données binaires s'ils ont accès. Si vous désactivez la mise en mémoire tampon de sortie sur le serveur Web et le serveur de middleware, vous pouvez envoyer des blocs de 100k à partir du serveur de middleware sur le serveur Web, et le serveur Web sortira le premier bloc pendant la réception du deuxième bloc. P>
Le fichier lui-même peut être stocké sur le serveur de base de données via FTP, SFTP ou autre fichier de fichiers p>
Il n'est certainement pas aussi efficace que l'utilisation de X-SendFile, mais si une personne est capable de pwn votre serveur Web, ils n'auront toujours pas accès au fichier - dans les scénarios ci-dessus, ils le feraient. Le serveur Web est le seul serveur public, de sorte que le reste des serveurs doit être connecté sur un réseau privé. P>
Vous pouvez également envoyer les données à un serveur de cryptage qui cryptera / déchiffrera les données de fichier réelles p>
Si quelqu'un a des idées sur la manière de s'améliorer, je suis intéressé. P>
Intéressant, mais cela est certainement plus complexe que nécessaire (mais il est intéressant de lire). Honnêtement, je ne savais pas à ce moment-là .htaccess à cette époque et qu'il peut bloquer la visualisation d'un dossier entier. J'ai déjà mis en œuvre cela. J'ai un formulaire de connexion HTML qui prend les données, l'envoie à un script de traitement qui valide l'utilisateur, ce qui est validé, envoie l'utilisateur à une page de recherche. L'utilisateur entre dans un numéro d'élément et est envoyé à un autre script de traitement qui accède à une base de données avec le numéro en tant que clé principale, détenant un chemin de fichier et d'autres informations. Si cela existe, il tire le chemin du fichier
Le dossier des images est protégé par .htaccess ("nie de tout"). J'utilise également un SSL et stocke les autres informations concernant l'image dans un dB mysql
Vous pouvez avoir un répertoire qui n'est pas accessible via http et vous pouvez utiliser un script PHP qui vérifie si l'utilisateur est connecté et si oui, lit le fichier à partir du répertoire spécifié et la sortira.
J'ai lu pour laisser un fichier en dehors du dossier "public_html". Cela le rendrait-il complètement inaccessible de HTTP? Comment mon script PHP aurait-il accès aux fichiers, alors?
Public_HTML CODE> est généralement le répertoire à partir duquel les fichiers sont servis, lors de l'utilisation d'Apache avec CPanel. Cela signifie que lorsque vous tapezhttp://yoursite.com code>, les données sont extraites de/ var / www / nom_name / public_html code>. Cela signifie également que tout ce que vous tapez dans l'URL,/ var / www / nom_nom code> est pas b> accessible. Cela signifie également qu'un répertoire que vous créeriez là-bas, tel que/ var / www / nom_servateur / fichiers code> ne serait pas non plus accessible. Depuis votre script PHP, vous y accéderiez avec quelque chose commefile_get_contents ('/ var / www / nom_nom / fichiers / imagename.exttensi sur code>); `.PHP a accès à n'importe quel fichier sur le serveur (selon les autorisations), il n'est pas limité par la racine Web.
D'accord, merci à vous deux, je sais maintenant comment stocker mes fichiers. Devrais-je utiliser une base de données pour stocker des chemins de fichiers ou dois-je simplement ignorer complètement les bases de données? Numéro de codage du chemin, avec un lieu de maintien variable pour l'entrée (nom de l'image)?
J'ai personnellement sauvegarder des informations sur le fichier à la DB.