Cet article vous présentera l'analyse de l'implémentation logique du téléchargement de fichiers PHP. Je pense que ce type d'implémentation est relativement courant dans les projets. Jetons un coup d'œil ~ J'espère que cela sera utile aux amis dans le besoin ~
Traitement des noms de fichiers.
Le nom du fichier dépend des exigences de l'entreprise. S'il n'est pas nécessaire de conserver le nom d'origine, générez simplement le nom de manière aléatoire et ajoutez le suffixe vérifié par la liste blanche. [Apprentissage recommandé : Tutoriel vidéo PHP]
Au contraire, soyez prudent lors de la manipulation :
//允许上传的后缀白名单 $extension_white_list = ['jpg', 'pdf']; //原始文件的名字 $origin_file_name = 'xx/xxx/10月CPI同比上涨2.1%.php.pdf'; //提取文件后缀,并校验是否在白名单内 $extension = strtolower(pathinfo($origin_file_name, PATHINFO_EXTENSION)); if (!in_array($extension, $extension_white_list)) { die('错误的文件类型'); } //提取文件名 $new_file_name = pathinfo($origin_file_name, PATHINFO_BASENAME); //截取掉后缀部分 $new_file_name = mb_substr($new_file_name, 0, mb_strlen($new_file_name) - 1 - mb_strlen($extension)); //只保留有限长度的名字 $new_file_name = mb_substr($new_file_name, 0, 20); //替换掉所有的 . 避免攻击者构造多后缀的文件,缺点是文件名不能包含 . $new_file_name = str_replace('.', '_', $new_file_name); //把处理过的名字和后缀拼接起来构造成一个名字 $new_file_name = $new_file_name . '.' . $extension; print_r($new_file_name); //10月CPI同比上涨2_1%_php.pdf
Traitement du contenu du fichier
Le suffixe du fichier n'est que superficiel. Pour un fichier php, changer le suffixe en jpg. ne changera pas le fait qu'il contient du code php.
Pour les fichiers image, vous pouvez lire l'en-tête du fichier image pour déterminer le type d'image. Bien entendu, je n'ai pas testé cette méthode. Si vous êtes intéressé, vous pouvez la tester vous-même.
De plus, même si la méthode ci-dessus est réalisable, elle peut toujours être contournée. Écrivez simplement les octets des caractéristiques d'en-tête d'un certain type d'image dans l'en-tête du fichier php pour le dissimuler.
Pour le traitement du contenu d'un fichier image, la véritable astuce est de redessiner l'image.
Utilisez la commande copy sous le système Windows pour créer un fichier image contenant du code php. La commande est la suivante :
Copy 1.jpg/b + test.php/a 2.jpg
La commande ci-dessus signifie fusionner test.php à la fin de 1.jpg et le réexporter vers 2. .jpg. De cette façon, ce 2.jpg est un fichier image contenant du code PHP. Vous pouvez l'ouvrir avec le Bloc-notes et faire glisser la barre de défilement vers le bas pour voir le code PHP.
Pour les images impures comme celle-ci, vous pouvez supprimer les parties impures en redessinant l'image. Voici le code php pour redessiner l'image :
try { $jpg = '包含php代码的.jpg'; list($width, $height) = getimagesize($jpg); $im = imagecreatetruecolor($width, $height); $image = imagecreatefromjpeg($jpg); imagecopyresampled($im, $image, 0, 0, 0, 0, $width, $height, $width, $height); $target = '重绘后干净的图片.jpg'; imagejpeg($image, $target); } finally { isset($im) && is_resource($im) && imagedestroy($im); isset($image) && is_resource($image) && imagedestroy($image); }
Les inconvénients de cette méthode sont qu'elle consomme de la mémoire, l'image est déformée et elle ne peut traiter que des images.
Bien sûr, je ne sais pas si d'autres formats de fichiers peuvent être traités en utilisant la méthode de redessinage.
Traitement des autorisations de fichiers
Discutons uniquement des autorisations sous Linux. Présentons brièvement les autorisations sous Linux :
读取,字母 r 或数字 4 表示 写入,字母 w 或数字 2 表示 执行,字母 x 或数字 1 表示
Pour les fichiers, rwx a la signification suivante :
r:可打开读取此文件 w:可写入此文件 x:可执行此文件
Pour les répertoires, la signification de rwx est un peu différente. . :
r:可读取此目录的内容列表 w:可在此目录里面进行:增、删、改文件和子目录 x:可进入此目录
De plus, sous Linux, pour un fichier, les utilisateurs seront répartis en trois types, à savoir : l'utilisateur qui a créé le fichier, l'utilisateur qui est dans le même groupe d'utilisateurs que l'utilisateur qui a créé le fichier, et qui n'est ni le créateur ni le même utilisateur que les autres utilisateurs du groupe.
Avec la compréhension des autorisations Linux, 755 autorisations doivent être définies pour le répertoire où se trouve le fichier téléchargé, ce qui signifie :
L'utilisateur qui a créé le répertoire a les autorisations pour lire, écrire et accéder à ce répertoire
Les utilisateurs du même groupe d'utilisateurs que l'utilisateur qui a créé le répertoire ont l'autorisation de lire et d'accéder à ce répertoire
Les autres utilisateurs qui ne sont ni le créateur ni le même groupe ont l'autorisation de lire et d'accéder à ce répertoire
Le paramètre d'autorisation de 755 peut empêcher nginx de signaler des erreurs 403 lors du proxy de fichiers statiques.
Exemple de code :
mkdir($save_path, 0755, true);
Adoptez des paramètres d'autorisation plus stricts pour les fichiers téléchargés. 644 autorisations doivent être définies, ce qui signifie :
L'utilisateur qui a créé le fichier a l'autorisation de lire et d'écrire ce fichier et ne peut pas exécuter
Les utilisateurs du même groupe d'utilisateurs que l'utilisateur qui a créé le fichier ont uniquement des autorisations de lecture
Les autres utilisateurs qui ne sont ni le créateur ni le même groupe n'ont que des autorisations de lecture
644, ce qui peut garantir que même si un Un fichier illégal est téléchargé, le contenu ne peut pas être modifié ou exécuté.
Exemple de code :
chmod($file, 0644);
Traitement du serveur de fichiers
Achetez de l'argent pour acheter un service de stockage oss, n'y pensez même pas, jetez-le simplement.
Adresse originale : https://learnku.com/articles/73100
Blog de l'auteur : https://learnku.com/blog/buexplain
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!