ホームページ  >  記事  >  バックエンド開発  >  PHPファイルアップロード処理ロジックの検討(総合分析)

PHPファイルアップロード処理ロジックの検討(総合分析)

藏色散人
藏色散人転載
2022-11-10 16:32:353205ブラウズ

この記事では、PHP ファイルアップロードのロジック実装分析を紹介します。この種の実装は、プロジェクトでは比較的一般的であるはずです。見てみましょう~困っている友人に役立つことを願っています~

ファイル名の処理

ファイル名はビジネス要件によって異なります。元の名前を保持する必要がない場合は、名前をランダムに生成し、ホワイトリストで検証されたサフィックスを追加します。 [推奨される学習: PHP ビデオ チュートリアル ]

逆に、慎重に扱ってください:

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

ファイル コンテンツの処理

# #ファイルの拡張子は表面上だけです。PHP ファイルの拡張子を jpg に変更しても、ファイルが PHP コードを保持しているという事実は変わりません。

画像ファイルの場合は、画像ファイルのヘッダーを読んで画像の種類を判断できます。もちろん、私はこの方法をテストしていません。興味があれば、自分でテストしてください。

また、上記の方法が実行可能であっても、特定の画像タイプのヘッダー特性のバイトを PHP ファイルのヘッダーに書き込むだけで、それを偽装することができます。

画像ファイルのコンテンツ処理の本当のコツは、画像を再描画することです。

Windows システムで copy コマンドを使用して、php コードを含むイメージ ファイルを作成します。コマンドは次のとおりです:

Copy 1.jpg/b + test.php/a 2.jpg

上記のコマンドは、test.php を 1 の末尾にマージすることを意味します。 .jpg. そして、それを 2.jpg に再エクスポートします。このように、この 2.jpg は PHP コードを含む画像ファイルです。メモ帳で開き、スクロール バーを下にドラッグすると、PHP コードが表示されます。

このような汚い絵の場合は、絵を描き直すことで汚い部分を取り除くことができます。以下は画像を再描画する php コードです:

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);
}

この方法の欠点は、メモリを消費すること、画像が歪むこと、画像しか処理できないことです。

もちろん、他のファイル形式を再描画方法で処理できるかどうかはわかりません。

ファイル アクセス許可の処理

Linux でのアクセス許可についてのみ説明し、最初に Linux でのアクセス許可について簡単に紹介します。

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

ファイルの場合、rwx は次のとおりです。意味:

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

ディレクトリの場合、rwx の意味は少し異なります:

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

さらに、Linux では、ユーザーはファイルに対して 3 つのタイプに分類されます。ファイルを作成したユーザーと同じグループに属しており、作成者でも同じグループ内の別のユーザーでもないユーザー。

Linux 権限を理解した上で、アップロードされたファイルが配置されているディレクトリには 755 の権限を設定する必要があります。これは、次のことを意味します。

  • ディレクトリを作成したユーザーは、次のことを意味します。このディレクトリへの読み取りアクセス、書き込み、および入力のアクセス許可

  • #ディレクトリを作成したユーザーと同じユーザー グループ内のユーザーには、このディレクトリの読み取りと入力のアクセス許可が与えられます
  • ##作成者も同じグループ内の他のユーザーも、このディレクトリを読み取って入る権限を持っていません。
  • 755 権限設定により、nginx が静的ファイルをプロキシできるようになります。403 エラーは発生しません。報告される。
コード例:

mkdir($save_path, 0755, true);

アップロードされたファイルには、より厳密なアクセス許可設定を使用します。644 のアクセス許可を設定する必要があります。これは、次のことを意味します:

Create のユーザーこのファイルには、このファイルの読み取りと書き込みの権限がありますが、実行することはできません
  • #ファイルを作成したユーザーと同じユーザー グループ内のユーザーには、読み取り権限のみが与えられます

  • 作成者でも同じグループでもない他のユーザーは読み取り権限のみを持ちます

  • 644 権限設定により、たとえ違法なファイルがアップロードされた場合でも確実にアクセスできますまた、内容を変更して実行することもできません。

  • コード例:
chmod($file, 0644);

ファイル サーバー処理

OSS ストレージ サービスを購入するためにお金を購入します。何も考えずに、ただ投げてください。それは。

元のアドレス: https://learnku.com/articles/73100

著者のブログ: https://learnku.com/blog/buexplain

以上がPHPファイルアップロード処理ロジックの検討(総合分析)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はlearnku.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。