47 votes

suppression complète d'un fichier sur le serveur

Je souhaite supprimer un fichier en utilisant PHP. J'ai utilisé la fonction unlink() mais je m'interrogeais sur la sécurité de la fonction unlink . Le fichier est-il complètement supprimé du serveur ? Je veux m'assurer qu'il n'y a aucun moyen de récupérer le fichier et que le fichier est complètement supprimé du serveur.

1 votes

Unlink() ; la sécurité est assurée par vous

3 votes

Ceci est lié au système d'exploitation (comment il supprime le fichier), cependant, vous pouvez d'abord tronquer (vider) le fichier et ensuite le supprimer, +1 belle question.

0 votes

@Akam cela ne garantit pas que le fichier soit supprimé, seule sa longueur peut changer. Je suggère d'abord de l'écrire entièrement avec des zéros, puis de le supprimer, mais ce n'est pas non plus sûr à 100 %.

50voto

bizzehdee Points 4388

Ouvre le fichier en mode binaire pour écriture, écrit des 1 sur l'ensemble du fichier, ferme le fichier, puis le dissocie. écrase toutes les données contenues dans le fichier de manière à ce qu'elles ne puissent pas être récupérées.

Personnellement, je dirais qu'il faut utiliser des 1 plutôt que des 0, car les 1 sont des données réelles et s'écrivent toujours, alors que les 0 peuvent ne pas s'écrire, en fonction de plusieurs facteurs.

Edita: Après avoir réfléchi et lu les commentaires, j'opterais pour une approche hybride, en fonction du "degré de suppression" que vous souhaitez pour le fichier. Si vous souhaitez simplement faire en sorte que les données ne puissent pas être récupérées, écrasez toute la longueur du fichier avec des 1, car cette méthode est rapide et détruit les données, mais le problème est qu'elle laisse une longueur déterminée de données uniformes sur le disque, ce qui laisse supposer qu'il y avait un fichier auparavant et donne la longueur du fichier, ce qui fournit des éléments d'information essentiels pour la police scientifique. Le simple fait d'écrire des données aléatoires ne permet pas non plus d'éviter ce problème, car si tous les secteurs du disque autour de ce fichier sont intacts, cela laissera également une trace médico-légale.

La meilleure solution en tenant compte l'effacement judiciaire, l'obscurcissement et le déni plausible (encore une fois, c'est exagéré, mais je l'ajoute pour le plaisir de l'ajouter), écrasez toute la longueur du fichier avec des 1 et ensuite, pour la MOITIÉ de la longueur du fichier en octets, écrivez à partir de mt_rand de longueurs aléatoires, à partir de points de départ aléatoires, ce qui donne l'impression que de nombreux fichiers de longueurs variables se trouvaient dans cette zone, créant ainsi une fausse piste. (encore une fois, c'est complètement exagéré et n'est généralement nécessaire que pour les tueurs en série et la CIA, mais je l'ajoute pour le plaisir de le faire).

0 votes

Bonne idée, l'avez-vous testé ? Quelle est la différence entre l'écrasement et la troncature à la longueur zéro ? Car lorsque vous modifiez le même fichier, l'OS met à jour l'index sur le stockage...

0 votes

La troncature à la longueur zéro ne modifie que les métadonnées/la table des fichiers en fonction du système de fichiers, l'écrasement, puis la déliaison détruisent complètement les données sur le disque en s'assurant qu'elles ne peuvent pas revenir.

2 votes

Ou utilisons mt_rand() pour écrire des nombres aléatoires ! Btw tu es recherché dans le chatroom php :)

11voto

Scott Herbert Points 610

Le gouvernement américain recommandait un nettoyage en sept étapes pour les disques. 1) tous les '1 2) tous les "0 3) le motif "01 4) le motif "10 5) un motif aléatoire 6) tous les "1 7) un motif aléatoire,

Pour ce qui est de l'exemple de code, l'utilisation d'un langage comme PHP n'est pas appropriée pour ce type d'effacement car vous dépendez du système d'exploitation qui efface réellement le fichier et ne fait pas quelque chose d'intelligent comme l'effacer seulement la dernière fois ou le délier, cependant...

(non testé)

$filename = "/usr/local/something.txt";
$size = filesize($filename);

$pat1 = chr(0);
$pat2 = chr(255);
$pat3 = chr(170);
$pat4 = chr(85);

$mask = str_repeat($pat1, $size);
file_put_contents($filename, $mask);

$mask = str_repeat($pat2, $size);
file_put_contents($filename, $mask);

$mask = str_repeat($pat3, $size);
file_put_contents($filename, $mask);

$mask = str_repeat($pat4, $size);
file_put_contents($filename, $mask);

1 votes

Au fait, les spécialistes de la police scientifique seront toujours en mesure de récupérer le fichier. mais ce n'est pas grave, je pense.

0 votes

Hé, corrigez plutôt un code file_put_contents($handle, $mask); sera file_put_contents($filename, $mask);

4voto

Panique Points 4680

Cela ne répond peut-être pas à la question de savoir COMMENT supprimer parfaitement un fichier "avec PHP", mais cela répond à votre question : "Le fichier est-il complètement effacé du serveur ?"

Dans certains cas, Non ! (sous UNIX/POSIX OS).

Selon le commentaire le plus voté sur le site Page officielle du manuel PHP unlink() la fonction unlink fait pas vraiment supprimer le dossier, il supprime le lien système avec le contenu du fichier ! Comme les fichiers peuvent avoir plusieurs noms de fichiers ( !) [liens symboliques ?], le fichier ne sera supprimé que lorsque TOUS les noms de fichiers seront dissociés. Donc, si votre fichier a 2 noms, alors unlink() ne supprimera pas vraiment le fichier à moins que vous ne déliiez() les deux noms de fichiers. Chers collègues de linux, merci de me corriger ici si nécessaire.

C'est peut-être la raison pour laquelle la fonction s'appelle unLINK() et non supprimer() ! !!

Voici une citation complète de l'excellent commentaire :

Vous avez supprimé un fichier volumineux, mais vous ne constatez aucune augmentation de l'espace libre ni aucune diminution de l'utilisation du disque ? Vous utilisez UNIX ou un autre système d'exploitation POSIX ? La fonction unlink() ne sert pas à supprimer un fichier, mais à supprimer un nom de fichier. La page de manuel dit : `unlink - delete a name and possibly the file it refers to''. Most of the time a file has just one name -- removing it will also remove (free, deallocate) the corps" du dossier (avec une mise en garde, voir ci-dessous). C'est le cas simple et habituel. Cependant, un fichier peut parfaitement porter plusieurs noms (voir la fonction link()), dans le même répertoire ou dans des répertoires différents. Tous les noms feront référence au corps du fichier et à la fonction keep it alive', so to say. Only when all the names are removed, the body of file actually is freed. The caveat: A file's body may *also* be maintenu en vie" (utilisant toujours l'espace disque) par un processus qui maintient le fichier ouvert. Le corps ne sera pas désalloué (il ne libérera pas d'espace disque) tant que le processus le maintiendra ouvert. En fait, il existe une façon élégante de ressusciter un fichier supprimé par erreur mais toujours maintenu ouvert par un processus...

Jetez un coup d'œil sur unlink() La fonction sœur de link() aquí .

La meilleure façon (imo) de supprimer un fichier via PHP :

Pour supprimer un fichier avec PHP (sous Linux), il faut utiliser la commande exec() qui exécute de vraies commandes bash (faire des choses avec linux bash semble correct). Dans ce cas, le fichier test.jpg serait supprimée de ce fait :

exec("rm test.jpg);

Plus d'informations sur l'utilisation rm (supprimer) correctement peut être trouvé par exemple aquí . Attention : PHP doit avoir le droit de supprimer le fichier !

UPDATE : Malheureusement, le système linux rm ne supprime pas vraiment le fichier s'il a deux noms/liens. Regardez ici pour plus d'informations. Je ferai des recherches plus approfondies à ce sujet et je vous ferai part de mes commentaires...

1 votes

Pourriez-vous également ajouter des informations relatives à la question de savoir comment l'utilisateur podría atteindre le type d'effacement qu'ils recherchent ? Vous avez de bonnes informations, mais comme vous l'avez noté, ce n'est pas le cas. parfaitement une réponse à la question. Ce n'est qu'une suggestion !

0 votes

@AndrewBarber Fait ! ;)

2voto

Voitcus Points 2748

Il est possible qu'en raison de la fragmentation du disque, certaines parties du fichier soient conservées, même si le fichier est totalement écrasé.

L'autre solution consiste à exécuter (par shell_exec() ), qui est spécifique au système. En voici un exemple (pour Windows), mais je ne l'ai pas testé.

0 votes

Est correcte, bien que cela n'aide pas vraiment à obtenir une meilleure sécurité que celle offerte par la norme juste la déliaison.

0voto

kasp3r Points 319

Voici ce que l'EFF recommande pour supprimer définitivement un fichier http://ssd.eff.org/tech/deletion .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X