メインコンテンツへスキップ
見出し画像

ファイルアップロードの脆弱性は「受け付ける形式」より「置き場所」で決まる──拡張子の許可リスト、名前の付け替え、公開領域の外への保存を社内標準にする設計の型

    この記事は、ファイルアップロードの脆弱性を防ぐための設計を、制作会社の社内標準として決める方法を扱います。

    「履歴書を添付できるようにしてください」という一言

    採用ページに履歴書の添付欄を。
    施工事例を、お客様の担当者が自分で画像付きで更新できるように。
    見積もり依頼に、図面のPDFを付けられるように。


    アップロード機能は、顧客からの小さな要望として入ってきます。
    けれど、外から来たファイルを自社のサーバーに置く機能は、サイトの中で特に慎重な設計が必要な場所です。


    小さな要望として受けると、小さな見積もりと、小さな確認で終わってしまいます。

    ファイルアップロードの安全設計とは、「誰が、どの種類の、どの大きさのファイルを、どこに置き、誰が取り出せるか」を、受ける前に決めておくことである

    黒字化の外科医です。アップロード機能の安全設計を、制作会社の判断の物差しとして解剖します。


    設計で決めるべき理由は、三つあります。


    第一に、利用者が申告するファイルの種類は、信用できないから。
    OWASPのファイルアップロードのチートシートは、ファイルの種類を確かめること、ブラウザから送られる種類の情報(Content-Type)は偽れるため信用しないことを求めています。


    第二に、置き場所を間違えると、被害が大きくなるから。
    OWASPは、アップロードされたファイルを別のサーバーに置くこと、難しければ公開領域(ウェブから直接見える場所)の外に置くことを勧めています。
    公開するなら、アプリが付けたIDとファイルを対応させて渡す形を示しています。


    第三に、アップロードは、個人情報の保管場所になるから。
    履歴書や身分証の画像は、受け取った瞬間から、制作会社と顧客が守る対象になります。保存の要否と期間は、機能ではなく判断です。

    今すぐ試せる:アップロード機能の「設計の前提」を整理するプロンプト

    私はWeb制作会社の経営者です。顧客から依頼されたファイルアップロード機能について、
    作る前に決めるべき設計の前提を整理してください。
    
    【前提】
    ・機能の目的(採用の応募、事例の更新、見積もり依頼 など):〔  〕
    ・アップロードする人(一般の利用者/ログインした会員/顧客の担当者):〔  〕
    ・必要なファイルの種類:〔  〕
    ・アップロードされたファイルを見る人:〔  〕
    ・ファイルに個人情報が含まれるか:〔  〕
    
    1. 許可するファイルの種類(拡張子)を、業務に必要な最小限で提案する。
    2. 大きさの上限と、1回あたりの件数の上限を提案する。
    3. 保存場所(公開領域の外か、外部のストレージか、保存せずメールで送るか)の選択肢と、それぞれの注意点を示す。
    4. 保存期間と削除の方法を提案する。
    5. 顧客に確認すべき質問を5つ挙げる。
    
    攻撃の手順や、悪用の例は書かないこと。

    アップロード安全設計工場:標準、レビュー、顧客への確認

    社内標準の型

    【ファイルアップロードの社内標準】第〇版
    
    1. 許可する拡張子を、業務に必要なものだけ一覧で決める(許可リスト方式)
    2. ファイルの種類は、拡張子とあわせて中身でも確かめる
       (利用者が申告する種類の情報だけで判断しない)
    3. 保存するときの名前は、サーバー側で付け直す(利用者の付けた名前を使わない)
    4. 大きさの上限を決める
    5. 保存先は、公開領域の外、または別のサーバー・ストレージにする
    6. 保存先のディレクトリで、プログラムが実行されない設定にする
    7. アップロードできる人を、必要な範囲に限る
    8. アップロードの画面にも、CSRF対策を入れる
    9. PHPで受ける場合は、move_uploaded_file で移動する
    10. 保存期間と削除の方法を、顧客と決めて記録する


    1〜5・7・8は、OWASPのチートシートが挙げる防御策にあたります。
    9について、php.netは、move_uploaded_file がPHPのPOSTのアップロードの仕組みで受け取ったファイルかを確かめてから移動すると説明しています。また、移動先に同名のファイルがあれば上書きされるとも注意しています。3の名前の付け直しは、上書きの事故も防ぎます。

    納品前レビューの確認項目

    □ 許可する拡張子の一覧が、仕様書に書かれているか
    □ 一覧にない種類のファイルが、受け付けられないことを確認したか
    □ 保存されるファイル名が、サーバー側で付け直されているか
    □ 保存先が、ウェブから直接開けない場所になっているか
    □ 保存先でプログラムが動かない設定を、確認したか
    □ 大きさの上限で、受付が止まることを確認したか
    □ アップロードされたファイルを見られる人が、限定されているか
    □ 保存期間と削除の手順が、運用マニュアルに書かれているか
    □ レビューした人・日付・結果を残したか


    確認は、正しい使い方で「止まるべきところで止まるか」を確かめる範囲で行います。脆弱性診断として本格的に試すなら、外部の診断と範囲を分けて発注します。

    ▶ 脆弱性診断の費用は「範囲・画面数・手法」で決まる──相見積もりの金額だけで選ばないための発注のしかたと、比べ方の表

    顧客への確認依頼文(例)

    ファイルの添付機能について、次の点をご確認ください。
    1. 受け付けるファイルの種類は〔PDF・JPEG・PNG〕に限ってよろしいですか
    2. 1ファイルの大きさの上限は〔〇MB〕でよろしいですか
    3. 添付されたファイルは、〔〇日〕で自動削除する設定を推奨します
    4. 添付ファイルを閲覧できる方を、教えてください
    種類と大きさを限ることは、サイトの安全性を保つための設計です。

    構造的なリスク

    逆説を指摘しておきます。


    安全に作るほど、「この形式も受け付けてほしい」「上限を上げてほしい」という要望が、運用の途中で必ず来ます。
    そのたびに設定だけを変えると、設計の前提が少しずつ崩れます。


    許可リストの変更は「仕様の変更」として扱い、レビューを通し、記録を残してください。変更の手数料を、保守の料金表に入れておくのも一つの方法です。

    ▶ 保守料金をセキュリティ込みで決め直す──「月1万円で全部」をやめ、工数の積み上げ・松竹梅・緊急対応の別料金で組む料金設計と計算例

    よくあるQ&A

    Q. WordPressのメディアの機能を使うなら、考えなくてよいか?


    標準の機能を使う場合も、受け付ける種類の設定は確認します。より注意が必要なのは、プラグインやテーマで、公開側に新しいアップロードの入口を足すときです。その入口を、この標準で確認してください。


    Q. 保存せず、メールに添付して送るのはどうか?


    サーバーに残らない点では有効です。ただし、メールボックスが保管場所になります。受け取る側の保存期間と、閲覧できる人を決めてください。


    Q. ウイルス対策は、制作会社の責任か?


    OWASPは、可能であればウイルス対策やサンドボックスでの確認を勧めています。導入するかどうかと費用の負担は、顧客と決めて記録します。

    最後に

    ファイルアップロードの安全は、受け付けたあとの「置き場所」と「取り出し方」で決まります。


    許可リスト、名前の付け直し、公開領域の外への保存を社内標準にし、要望の変更まで記録した会社だけが、小さな要望を、安全に、正しい値段で受けられるのです。

    ▶ セキュリティヘッダーを「診断ツールの点数」のために入れると、サイトが崩れる──主なヘッダーの意味、外部タグと表示崩れを避ける導入の順番、顧客への説明

    これまでの記事は、メンバーシップ「黒字化オペ室」でまとめて読めます。月額1,980円、記事2本分の金額です。詳しくはプロフィールから。


    #Web制作会社 #ファイルアップロード #脆弱性 #セキュリティ #安全設計 #社内標準 #制作会社経営 #中小企業 #個人情報保護 #品質管理

     
     
    Web制作・開発会社の「労働集約という病」をAIで冷徹に切除し、利益率を極限化する組織ハッキング術を公開。 人間の感情と作業を排除し、社長一人で莫大な富を搾取する「完全無人ファクトリー」を構築する覚悟を持つ経営者のみ、有料記事で圧倒的な暴利と勝利を手に入れてください。

    あなたへのおすすめ