Überprüfung der PHP-Datei-Upload-Verarbeitungslogik (umfassende Analyse)

藏色散人
Freigeben: 2023-04-11 08:38:02
nach vorne
3188 Leute haben es durchsucht

Dieser Artikel stellt Ihnen die logische Implementierungsanalyse des PHP-Datei-Uploads vor. Ich denke, dass diese Art der Implementierung in Projekten relativ häufig vorkommt. Ich hoffe, dass sie für Freunde in Not hilfreich sein wird

Der Dateiname richtet sich nach den Geschäftsanforderungen. Wenn es nicht erforderlich ist, den ursprünglichen Namen beizubehalten, generieren Sie einfach den Namen zufällig und fügen Sie das durch die Whitelist überprüfte Suffix hinzu. [Empfohlenes Lernen: PHP-Video-Tutorial

]

Im Gegenteil, seien Sie vorsichtig beim Umgang mit:

//允许上传的后缀白名单
$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
Nach dem Login kopieren

Dateiinhaltsverarbeitung

Bei einer PHP-Datei ist das Suffix nur oberflächlich wird nichts an der Tatsache ändern, dass es PHP-Code enthält.

Bei Bilddateien können Sie den Bilddatei-Header lesen, um den Bildtyp zu bestimmen. Natürlich habe ich diese Methode nicht getestet. Wenn Sie interessiert sind, können Sie sie selbst testen.

Auch wenn die obige Methode machbar ist, kann sie dennoch umgangen werden. Schreiben Sie einfach die Bytes der Header-Eigenschaften eines bestimmten Bildtyps in den Header der PHP-Datei, um sie zu verschleiern.

Bei der Inhaltsverarbeitung von Bilddateien besteht der eigentliche Trick darin, das Bild neu zu zeichnen.

Verwenden Sie den Kopierbefehl unter Windows, um eine Bilddatei mit PHP-Code zu erstellen. Der Befehl lautet wie folgt:

Copy 1.jpg/b + test.php/a 2.jpg
Nach dem Login kopieren

Der obige Befehl bedeutet, test.php am Ende von 1.jpg zusammenzuführen und in 2 erneut zu exportieren .jpg. Auf diese Weise handelt es sich bei dieser 2.jpg-Datei um eine Bilddatei mit PHP-Code. Sie können sie mit Notepad öffnen und die Bildlaufleiste nach unten ziehen, um den PHP-Code anzuzeigen.

Bei unsauberen Bildern wie diesem können Sie die unsauberen Teile entfernen, indem Sie das Bild neu zeichnen. Das Folgende ist der PHP-Code zum Neuzeichnen des Bildes:

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);
}
Nach dem Login kopieren

Die Nachteile dieser Methode bestehen darin, dass sie Speicher verbraucht, das Bild verzerrt ist und nur Bilder verarbeiten kann.

Ich weiß natürlich nicht, ob andere Dateiformate mit der Neuzeichnungsmethode verarbeitet werden können.

Verarbeitung von Dateiberechtigungen

Besprechen Sie nur die Berechtigungen unter Linux:

读取,字母 r 或数字 4 表示
写入,字母 w 或数字 2 表示
执行,字母 x 或数字 1 表示
Nach dem Login kopieren

Für Dateien hat rwx die folgende Bedeutung:

r:可打开读取此文件
w:可写入此文件
x:可执行此文件
Nach dem Login kopieren

Für Verzeichnisse ist die Bedeutung von rwx etwas anders :

r:可读取此目录的内容列表
w:可在此目录里面进行:增、删、改文件和子目录
x:可进入此目录
Nach dem Login kopieren

Darüber hinaus werden Benutzer in Linux für eine Datei in drei Typen unterteilt, nämlich: der Benutzer, der die Datei erstellt hat, der Benutzer, der derselben Benutzergruppe angehört wie der Benutzer, der die Datei erstellt hat, und Wer ist weder der Ersteller noch derselbe Benutzer wie die anderen Benutzer in der Gruppe?

Mit dem Verständnis der Linux-Berechtigungen sollten 755 Berechtigungen für das Verzeichnis festgelegt werden, in dem sich die hochgeladene Datei befindet, was bedeutet:

Der Benutzer, der das Verzeichnis erstellt hat, hat die Berechtigung zum Lesen, Schreiben und Betreten dieses Verzeichnisses
  • Benutzer in derselben Benutzergruppe wie der Benutzer, der das Verzeichnis erstellt hat, haben die Berechtigung, dieses Verzeichnis zu lesen und zu betreten.
  • Andere Benutzer, die weder der Ersteller noch derselben Gruppe angehören, haben die Berechtigung, dieses Verzeichnis zu lesen und zu betreten
  • Die Berechtigungseinstellung 755 kann verhindern, dass Nginx beim Proxyen statischer Dateien 403-Fehler meldet.

  • Codebeispiel:
mkdir($save_path, 0755, true);
Nach dem Login kopieren

Übernehmen Sie strengere Berechtigungseinstellungen für hochgeladene Dateien. Es sollten 644-Berechtigungen festgelegt werden, was bedeutet:

Der Benutzer, der die Datei erstellt hat, hat die Berechtigung, diese Datei zu lesen und zu schreiben und kann sie nicht ausführen

  • Benutzer in derselben Benutzergruppe wie der Benutzer, der die Datei erstellt hat, haben nur Leseberechtigungen Wenn eine illegale Datei hochgeladen wird, kann der Inhalt nicht geändert oder ausgeführt werden.

  • Codebeispiel:
  • chmod($file, 0644);
    Nach dem Login kopieren

    Dateiserververarbeitung
  • Kaufe Geld, um einen OSS-Speicherdienst zu kaufen, denke nicht einmal darüber nach, wirf es einfach hinein.

  • Originaladresse: https://learnku.com/articles/73100

    Autorenblog: https://learnku.com/blog/buexplain

    Das obige ist der detaillierte Inhalt vonÜberprüfung der PHP-Datei-Upload-Verarbeitungslogik (umfassende Analyse). Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:learnku.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!