[翻訳] PHP イメージ アップロード 保安: まともに 夏至 ない 方法 PHP Image Upload Security: How Not to Do It
[これ 文の 題目を 直訳すれば ‘PHP イメージ アップロード 保安: まともに 夏至 ない 方法’載せる. 本文で 保安を まともに 夏至 ない 方法たちを 批判して 自分の ノーハウを 提示するのに, そのため 題目を 風刺的に 付けた みたいだ. 原文は PHP Image Upload Security: How Not to Do It 載せる.- ヒョングウ]
ゲーム 話を しながら ちょっと 休んでから 行こう. ウェブ 開発 世界へ 行く 短い 旅行に 関する ゲームだ. [イメージが アップロードされる 過程を ウェブ 開発 世界へ 行く 短い 旅行だと 比喩した の ようだ - ヒョングウ] (Let’s take a break from talking about games for a brief journey into the world of web development.)
私は PHP路 仕事を まどろみ 日 来た. そして 私は ファイル アップロード 保安に 大海 言って 報告 たい.
ファイル アップロードは ウェブ 開発者に まどろみ 怖じける 仕事だ. 誰だかも 分からない これらが 誰 ファイルや 願い次第に あなたの 大事な ウェップサーバーに あげるように 許容する ことの だからだ.これ 文で 私は 汚職 イメージ アップロードと, 使用者が あなたに 伝達する のが 実際 イメージなのか 確実に する 方法に 大海だけ 扱う のだ.
Part I: The Evil $_FILES["file"]["type"]
何 番(回)も, (私が 青年期 時 作成した コードを 含んで) 私は こういう 似ている コードを 見た.
$valid_mime_types = array( "image/gif", "image/png", "image/jpeg", "image/pjpeg", ); // アップロードされた ファイルが 実際 イメージなのか チェックする. // イメージが 当たれば 正しい フォルダで 移す. if (in_array($_FILES["file"]["type"], $valid_mime_types)) { $destination = "uploads/" . $_FILES["file"]["name"]; move_uploaded_file($_FILES["file"]["tmp_name"], $destination); }
上 コード切れは イメージなのか 検査すること ため アップロードされた ファイルの パントマイム タイプを 検査する. そして 出て 通過されれば 相応しい 位置に ファイルを 移す. それでは 何が 問題だろう? 勿論,ファイル アップロード 制御に 関する 文書を 読んだら,$_FILES["file"]["type"]
に 大韓 注意事項を 気を使って 紫.(pay attention to what it has to say about $_FILES["file"]["type"]
)
これ 価格は 完全に, クライアントが 制御 可能だ. PHP 方で 検証する 数 ある 値段が ない.
ウェブ 保安で 始めて 番目 規則は 使用者が 送った データを 絶対に 信じるの ないでねと言う のだ. クライアントが イメージと 言うと 真書 ファイルを サーバーに 許容する のは, 何も 盗むの ないと 言うと 真書 見知らぬ 人に 家 鍵を 任せる のと ような 仕業だ. ここ そんな 弱みを 利用した 簡単な スクリプト 例題が ある.
// 攻撃 目標 $host = "127.0.0.1"; $port = 8887; $page = "/server.php"; // 私たちが アップロードする ファイル (content-typeに 注目しなさい) : $payload = "------ThisIsABoundary Content-Disposition: form-data; name="file"; filename="evil.php" Content-Type: image/jpeg
上 スクリプトは evil.php ファイルを アップロードするように する 標準 HTTP 要請だ. もし サーバーが アップロード 検証を のために $_FILES["file"]["type"]
に 寄り掛かったら 私たちが イメージを 送信受けたという 錯覚を するように なる のだ.
Part II: アパッチ mod_mime モジュールと 多重 ファイル 拡張子 機能 (The mod_mime Apache Module and Multiple File Extensions)
そう, それでは 解決策は なにか? どうな 人々は 拡張子を チェックする. サーバーが ファイル 拡張子を 基盤で 相応しい ハンドラーと コンテンツ 種類は 決める ことの だからだ.こういう コードは 大部分の 場合 寝る 作動する.
$valid_file_extensions = array(".jpg", ".jpeg", ".gif", ".png"); $file_extension = strrchr($_FILES["file"]["name"], "."); // 上って来た ファイルが 実際で イメージなのか チェックする. // もし イメージなら 保存 フォルダで 移す. if (in_array($file_extension, $valid_file_extensions)) { $destination = "uploads/" . $_FILES["file"]["name"]; move_uploaded_file($_FILES["file"]["tmp_name"], $destination); }
こんなに すれば サーバー 設定に よっては 安全な 首都 ある. これを 分かると するのに, 痛がるのは ような ファイルに 大海 多重 ファイル 拡張子を 設定するように 割 数 ある.[これ 機能が 何やらを 分かると 寝る 解釈する 数 ある の ようなのに, 多分 拡張子を 二 犬 付けて 二 犬の ファイル 形式で 痛がら 理解する 数 あるように する 機能なのか 見る. - ヒョングウ] これ ギヌングウンオンオと 内容 形式を たいてい 番(回)に 判断するように する ファイル 名前を 許容する やけどする 有用な 首都 あるが, これ 機能を 認知するの できない 開発者に 保安 弱みが なる.(Apache can be configured to interpretmultiple file extensions for the same file.While it might be useful for allowing a filename to determine both language and content type at once, it also presents a security vulnerability to developers who are unaware of this feature.)
多重 ファイル 拡張子 弱みを 利用する やけどする 星 技術が 必要な 蟹 ない. 誰 PHP ファイルや 選んで 名前 終りに 終りに .jpgを 追加した 次 脆弱な サーバーに アップロードして 見なさい. そして ブラウザーで 彼 ファイルを 開いて 見る ことだ. こういえば 痛がら スクリプトを 回して 彼 結果が 現われる. 冷えた おかゆ 墨期だ.
Part III: イメージで 偽装した スクリプト
操作された パントマイムタイプと 追加 ファイル 拡張子に 注意を 傾ける 人々は たびたび getimagesize() ような のを 使って アップロードされた ファイルが 実際で イメージ ファイルなのか 確認する.
if (@getimagesize($_FILES["file"]["tmp_name"]) !== false) { $destination = "uploads/" . $_FILES["file"]["name"]; move_uploaded_file($_FILES["file"]["tmp_name"], $destination); }
まさか, イメージは 危ないでしょう ない ことと 思うが? 内 言葉は, これ 子 猫を 見なさいという ことだ :
私 子猫は 誰も 害する 数 ない. 勿論だ. 増える 白 子猫だけ 会う 数 あるように 望む. (Surely, an image can’t be harmful? I mean, look at this kitten: That kitten could never hurt anyone, right? Just count yourself lucky that it’s a white hat kitten.)
今 絵を クリックして 何か 仕事が 起るのか 見よう. (鳥 窓で 開かれる.) まったく同じな 子猫が 出ると 割 ことだ. するが 今度には, 私が それを PHP スクリプトで 回して ある. これを 夏期 のために 私は 素敵な jhead toolを 使った. そして 私は 原本 子 猫 絵 中に メッセージを 内蔵した. 内 メッセージは こんなに 見える ことだ :
<?php blahblahblah(); __halt_compiler();
__halt_compiler()
関数を 私 位置で 呼び出すことで, PHP街 イメージ データを 解釈して パッシング エラーを 出力する 事故が 発生するの ないように する. 載せるように 実際 イメージ データが 出力されること 前に 出力が 止める 理由だ. 私が 実際で 使った ガール 報告 たければ, 子 猫 イメージを ダウンロード(マウス ウクルリック 後, 違う 名前で 保存を 選択)真書, 走路 使う テキスト エディタで 開いて 見れば なる.
Part IV: 終り
上に ある 保安 検事は 確実に 益体もない 件 ない. アップロードされた 蟹 確実に イメージになるように 望んだら, それが 確実に イメージなのか 検査する 件 良い 仕事だ. 保安を のために 色々 段階を 置く 件 増える 良い 仕事だ. するが 私たち バングオマックを くぐって こっそりと 入って来る 数 ある PHP スクリプトは どうに すると しようか?
私たち 目標は 団地 アップロードされた ファイルが イメージなのか 確認する のだけが ない. サーバーが どうな スクリプト ハンドラーも 行うの ないように する のだ. 私が 楽しんで 使う 方法は アパッチのForceType
directive だ.
ForceType application/octet-stream <FilesMatch "(?i).jpe?g$"> ForceType image/jpeg </FilesMatch> <FilesMatch "(?i).gif$"> ForceType image/gif </FilesMatch> <FilesMatch "(?i).png$"> ForceType image/png </FilesMatch>
これ コードを アップロード ディレクトリの.htaccess
ファイル 中に 入れなさい. それでは イメージを 自分の 基本 ハンドラーすることだけして 連関されるように 割 のだ. [イメージ 拡張子が 付いた 奴は イメージにだけ 認識するという 意味だ. - ヒョングウ] 違う あらゆる ものなどが バイト ストリームだけで 解釈されて, ハンドラーは 実行されるの ない のだ. (Everything else will be served as a plain byte stream and no handlers will be run.)
私は もっと 進んで “turn PHP off” 解法(php_flag engine off
)を 使う. サーバーに perl, python などを 回して ある 場合に そうに すれば あらゆる スクリプト ハンドラーを たいてい 部屋に 鑿 数 ある. 勿論, 安全を のために 二 方法を だ 使う 首都 ある.
もっと ましな 解法は ファイルを ウェブ ディレクトリ 外に 置いて ファイルが 全然 解釈されるの ないように する のだ. それでは ファイルを 要請 受けて, 連関された ファイルを ファイルシステムで 捜して, 正しい ヘッダーと 一緒に 出力して 竝び 数 ある スクリプトを 組むと する. 勿論 使用者 入力[要請]を 基盤で ファイルを 出す のは それ 自らの 保安 弱みが 存在するが, それは また 違う 話だ. [ファイル ダウンロード スクリプトで ファイルを ダウンするように する 件 URL 操作 などの 攻撃を あう 数 ある. - ヒョングウ]
最後に 重要な こと 一つだけ もっと 言わば, 常に アップロードされた ファイルの 名前を 変更すると するという のだ. 攻撃者が 私たち 弄ぶこと 大変になるように 名前を 無作為で 選ぶと する. そして.htaccess
私.user.ini
ファイルを 誰も 被る 数 ないように すると する. (neither of which be a good thing これ 後に 付いて あるのに 何 言葉なのか 分からなさ – ヒョングウ)
ウェブには 保安に 関して 多い 資料たちが ある. もし 資料を もっと 報告 たければOWASPを 察して 見なさい.OWASP Cheat Sheet ページを まっすぐに 察して 見る ゴッドゾッダ.
- コメント機能はありません。コメントの代わりに[email protected]
にメールを送ってください。