Examen de la logique de traitement du téléchargement de fichiers PHP (analyse complète)

藏色散人
Libérer: 2023-04-11 08:38:02
avant
3212 Les gens l'ont consulté

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
Copier après la connexion

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
Copier après la connexion

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);
}
Copier après la connexion

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 表示
Copier après la connexion

Pour les fichiers, rwx a la signification suivante :

r:可打开读取此文件
w:可写入此文件
x:可执行此文件
Copier après la connexion

Pour les répertoires, la signification de rwx est un peu différente. . :

r:可读取此目录的内容列表
w:可在此目录里面进行:增、删、改文件和子目录
x:可进入此目录
Copier après la connexion

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);
Copier après la connexion

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);
Copier après la connexion

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!

Étiquettes associées:
source:learnku.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal