ApacheでPHPのファイルアップロードサイズを制限する方法【図解あり】

ApacheサーバーでPHPを使用する際、デフォルトのファイルアップロードサイズでは十分でない場合があります。たとえば、大きな画像ファイルや動画ファイルをアップロードする必要がある場合、アップロードサイズの制限を緩和する必要があります。逆に、セキュリティ対策として意図的にアップロードサイズを制限することで、不正な大容量ファイルのアップロードを防ぐことができます。

本記事では、ApacheとPHPの設定を変更してファイルアップロードサイズを制限または拡張する方法について詳しく解説します。php.iniや.htaccess、httpd.confの編集方法、反映の確認方法まで、初心者でもわかりやすいようにステップごとに説明します。

この記事を読むことで、安全かつ効率的にファイルアップロードサイズを管理するスキルが身につきます。

目次

PHPのデフォルトアップロードサイズの確認方法


PHPでファイルアップロードを行う際、アップロードサイズの上限はデフォルトで設定されています。このサイズは、php.iniという設定ファイルで管理されており、アップロードサイズがこの値を超えるとファイルの送信が拒否されます。

php.iniファイルの場所を特定する


まず、php.iniの場所を特定する必要があります。以下のコマンドを実行して、PHPの設定ファイルの場所を確認しましょう。

php --ini

もしくは、PHPが動作しているサーバー内で以下のコードを記述したPHPファイルを実行します。

<?php
phpinfo();
?>


ブラウザでこのファイルにアクセスすると、Loaded Configuration Fileという項目にphp.iniのパスが表示されます。

デフォルト値の確認


php.iniが見つかったら、エディタで開き、以下のパラメータを探します。

upload_max_filesize = 2M
post_max_size = 8M
  • upload_max_filesize はアップロードされる1つのファイルの最大サイズです。
  • post_max_sizePOSTデータ全体の最大サイズです。

デフォルトでは、upload_max_filesizeは2MB、post_max_sizeは8MBに設定されています。この値を必要に応じて変更することで、アップロード可能なファイルサイズを制御できます。

php.iniでのアップロードサイズ変更手順


php.iniファイルを編集して、PHPのファイルアップロードサイズの上限を変更する方法を解説します。これにより、アップロード可能なファイルサイズを制御できます。

php.iniファイルの編集

  1. php.iniの場所を確認
    前のセクションで特定したphp.iniファイルをエディタで開きます。
sudo nano /etc/php/8.1/apache2/php.ini

バージョンによりパスは異なる可能性があります。環境に合わせて読み替えてください。

  1. アップロードサイズ関連のパラメータを変更
    以下のパラメータを探して、それぞれ必要なサイズに変更します。
upload_max_filesize = 10M
post_max_size = 20M
memory_limit = 128M
  • upload_max_filesize:1つのファイルの最大サイズ。
  • post_max_size:POSTデータ全体の最大サイズ。ファイルアップロード時にはこれがupload_max_filesizeより大きく設定されている必要があります。
  • memory_limit:PHPスクリプトが使用できる最大メモリ量。ファイルサイズが大きい場合はこれも増やしておきます。

設定変更の例


例えば、50MBのファイルをアップロードしたい場合は以下のように設定します。

upload_max_filesize = 50M
post_max_size = 60M
memory_limit = 256M

php.iniの保存とApacheの再起動


変更を保存し、Apacheを再起動して設定を反映させます。

sudo systemctl restart apache2

これで、php.iniの変更が反映され、アップロードサイズが指定したサイズに拡張されます。次はApache側での設定変更について説明します。

Apacheでの設定変更と反映方法


PHPのphp.iniでアップロードサイズを変更しただけでは、Apache側の設定が原因で制限がかかる場合があります。Apacheの設定ファイルであるhttpd.conf.htaccessを編集して、PHP設定が適用されるように調整します。

httpd.confでの設定変更

  1. Apacheの設定ファイルを開く
    httpd.confまたはapache2.confをエディタで開きます。
sudo nano /etc/apache2/apache2.conf

もしくは以下のパスにあることもあります。

sudo nano /etc/httpd/conf/httpd.conf
  1. アップロードサイズの制限を追加または変更
    ファイル内に以下のように記述します。
<Directory "/var/www/html">
    php_value upload_max_filesize 50M
    php_value post_max_size 60M
</Directory>

<Directory>ディレクティブを使い、特定のディレクトリに対して設定を適用します。これにより、php.iniで設定したアップロードサイズがApache経由でも反映されます。

.htaccessでの設定変更


Apacheのメイン設定ファイルを編集できない場合や、特定のディレクトリだけに適用したい場合は、.htaccessファイルを使います。

  1. .htaccessを作成または編集
    対象のディレクトリ(例:/var/www/html)に.htaccessファイルを作成または編集します。
sudo nano /var/www/html/.htaccess
  1. アップロードサイズを設定
    以下を追加します。
php_value upload_max_filesize 50M
php_value post_max_size 60M

これにより、該当ディレクトリ内のPHPスクリプトだけがこの設定を使用します。

設定を反映させる


Apacheの設定を反映させるために、サーバーを再起動します。

sudo systemctl restart apache2

これでApacheの設定が反映され、PHPのアップロードサイズが制限または拡張されます。

.htaccessを使ったアップロードサイズの制限方法


.htaccessファイルは、Apacheサーバーのディレクトリ単位で設定を上書きできる便利なファイルです。特定のディレクトリに対してのみ、ファイルアップロードサイズを制限したい場合に役立ちます。php.inihttpd.confの全体設定を変更する必要がないため、柔軟に調整できます。

.htaccessの作成・編集

  1. 対象ディレクトリに移動
    アップロードサイズを制限したいディレクトリに移動します。例として、/var/www/htmlを対象とします。
cd /var/www/html
  1. .htaccessファイルを作成または編集
    以下のコマンドで.htaccessファイルを作成します(すでに存在する場合は編集します)。
sudo nano .htaccess

アップロードサイズ制限の記述


.htaccessファイルに以下の記述を追加します。

php_value upload_max_filesize 20M
php_value post_max_size 25M
php_value memory_limit 128M
  • upload_max_filesize:1つのファイルの最大サイズ
  • post_max_size:POSTデータ全体の最大サイズ
  • memory_limit:PHPが使用できる最大メモリ量

たとえば、20MBのファイルアップロードを許可し、POST全体のサイズを25MBに設定します。memory_limitは、アップロード時の処理で十分なメモリが確保されるように調整します。

.htaccessの反映確認


.htaccessファイルの設定を反映させるために、Apacheを再起動します。

sudo systemctl restart apache2

設定が反映されたか確認


PHPスクリプトを使って反映状況を確認します。以下のようなファイルを作成して確認します。

<?php
phpinfo();
?>

ブラウザでアクセスし、upload_max_filesizepost_max_sizeの値が変更されていることを確認してください。

これで、.htaccessを使ったアップロードサイズ制限が完了します。Apacheの全体設定に影響を与えずに、特定ディレクトリでのみ適用できるため、安全かつ効率的です。

Apacheの再起動と反映確認手順


PHPやApacheの設定を変更した後は、Apacheを再起動して変更を反映させる必要があります。再起動を行わないと、新しい設定が適用されません。ここでは、再起動方法と設定が正しく反映されたかを確認する手順を解説します。

Apacheの再起動方法

  1. Apacheを再起動
    以下のコマンドでApacheを再起動します。
sudo systemctl restart apache2

または、httpdが使われている場合は次のコマンドになります。

sudo systemctl restart httpd
  1. Apacheの再起動が成功したか確認
    Apacheのステータスを確認して、エラーがないかをチェックします。
sudo systemctl status apache2


「active (running)」と表示されていれば、正常に起動しています。エラーが表示された場合は、設定ファイルに問題がないか確認しましょう。

設定が反映されたか確認する方法

  1. phpinfo()で確認
    PHPが反映されているか確認するため、テスト用のPHPファイルを作成します。
sudo nano /var/www/html/info.php

以下のコードを記述します。

<?php
phpinfo();
?>
  1. ブラウザでアクセス
    作成したPHPファイルにブラウザでアクセスします。
    http://サーバーのIPアドレス/info.php

表示されたページで、upload_max_filesizepost_max_sizeの値が変更されていることを確認します。

反映されていない場合の対処法


もし変更が反映されていない場合は、以下を確認してください。

  • php.iniが正しく編集されているか
  • .htaccessに記述ミスがないか
  • Apacheの再起動が正しく行われたか

必要に応じて、以下のコマンドで設定を強制的にリロードします。

sudo systemctl reload apache2

これで、Apacheの再起動と反映確認が完了です。正しく設定が反映されていることを確認して、アップロードサイズの変更が適用された状態で運用を開始しましょう。

アップロードサイズが反映されない場合のトラブルシューティング


PHPやApacheの設定を変更しても、アップロードサイズが反映されない場合があります。これは設定ファイルの記述ミスや、反映が正しく行われていないことが原因です。ここでは、よくある原因とその対処法を解説します。

1. php.iniの場所が間違っている


複数のphp.iniが存在し、間違ったファイルを編集している可能性があります。

対処法
PHPが使用しているphp.iniの場所を再確認します。

php --ini


または、phpinfo()を使用して確認します。

<?php
phpinfo();
?>


「Loaded Configuration File」の項目に表示されたパスが正しいphp.iniです。このファイルを編集して再度試してください。

2. .htaccessの記述ミス


.htaccessファイルでアップロードサイズを変更する場合、記述ミスがあると反映されません。

対処法
.htaccessに正しく記述されているか確認します。

php_value upload_max_filesize 50M
php_value post_max_size 60M
php_value memory_limit 128M


ミスがない場合でも、.htaccessがApacheで有効になっていない可能性があるため、以下を確認します。

sudo nano /etc/apache2/apache2.conf

以下のディレクティブがあることを確認します。

<Directory /var/www/>
    AllowOverride All
</Directory>


AllowOverrideNoneの場合は.htaccessが無効になっています。Allに変更し、Apacheを再起動してください。

3. post_max_sizeがupload_max_filesizeより小さい


post_max_sizeの値がupload_max_filesizeより小さい場合、アップロードが制限されます。

対処法
post_max_sizeupload_max_filesizeより大きく設定します。

upload_max_filesize = 50M
post_max_size = 60M
memory_limit = 128M

4. Apacheの再起動が行われていない


設定変更後、Apacheを再起動していないと反映されません。

対処法
以下のコマンドでApacheを再起動します。

sudo systemctl restart apache2

5. ファイルのパーミッションが原因


php.ini.htaccessのパーミッションが不適切であると、設定が読み込まれない可能性があります。

対処法
ファイルのパーミッションを確認し、必要に応じて変更します。

sudo chmod 644 /etc/php/8.1/apache2/php.ini
sudo chmod 644 /var/www/html/.htaccess

6. サーバーキャッシュの問題


一部のサーバーではキャッシュが原因で設定が即座に反映されないことがあります。

対処法
Apacheのキャッシュをクリアします。

sudo systemctl reload apache2

これらの対処法を試しても解決しない場合は、Apacheのエラーログを確認し、詳細な原因を特定してください。

sudo tail -f /var/log/apache2/error.log

これで、アップロードサイズが反映されない場合のトラブルシューティングは完了です。

セキュリティ面でのアップロードサイズ制限の重要性


ファイルアップロードは便利な機能ですが、不適切な設定のまま運用するとサーバーのセキュリティリスクが高まります。攻撃者は、極端に大きなファイルをアップロードしてサーバーの負荷を増やしたり、リソースを枯渇させたりすることでサービスを停止させる可能性があります。アップロードサイズを制限することは、これらの攻撃を防ぐ重要な手段です。

1. 大量のファイルアップロード攻撃(DoS攻撃)


攻撃者は意図的に巨大なファイルを大量にアップロードし、サーバーのストレージやメモリを圧迫します。これにより、サーバーがダウンし、正常なサービスが提供できなくなる可能性があります。

対策

  • upload_max_filesizepost_max_size の値を適切に設定して、大容量ファイルのアップロードを制限します。
  • 必要な場合だけ大きなファイルサイズを許可し、不要なディレクトリでは.htaccessを使用して制限します。
php_value upload_max_filesize 10M
php_value post_max_size 15M

2. ディスクスペースの枯渇


大容量のファイルがアップロードされると、サーバーのディスクスペースが不足し、他の重要なファイルの保存ができなくなります。これにより、サーバーのパフォーマンスが低下し、アプリケーションが停止するリスクがあります。

対策

  • アップロードディレクトリの容量を定期的に監視し、不要なファイルは自動で削除するスクリプトを実装します。
  • アップロード可能なファイルサイズに制限を設けることで、ディスクスペースの枯渇を防ぎます。

3. メモリ消費の増加


アップロードされたファイルは一時的にメモリに保存されることがあります。post_max_sizeが大きすぎると、一度に大量のメモリを消費し、サーバーが停止する可能性があります。

対策

  • memory_limitを適切に設定し、スクリプトが過剰にメモリを消費しないようにします。
  • 必要な場合にのみ大容量ファイルを処理し、通常は小さめの値を設定しておきます。
memory_limit = 128M

4. セキュリティホールの防止


大きなファイルにはマルウェアや悪意のあるスクリプトが含まれている可能性があります。サイズ制限を設けることで、悪意のあるファイルのアップロードを抑制します。

対策

  • アップロードされたファイルは、サイズだけでなく拡張子やMIMEタイプも検査し、不正なファイルをブロックします。
  • ファイルアップロード後、ウイルススキャンを実施して不正なファイルを検出します。

5. 適切なサイズの設定例

  • 画像アップロードupload_max_filesize = 5M / post_max_size = 8M
  • PDFなどのドキュメントupload_max_filesize = 10M / post_max_size = 15M
  • 動画ファイル(特定用途)upload_max_filesize = 50M / post_max_size = 60M

過剰に大きな値は設定せず、必要最低限のサイズを設定することが推奨されます。

アップロードサイズの制限はサーバーの安定性を守り、不正アクセスを防ぐ重要なセキュリティ対策です。運用に応じて適切な値を設定し、常にサーバーの安全性を保ちましょう。

アップロードサイズ制限の実践例


アップロードサイズの制限は、システムの用途やユーザーのニーズに応じて異なります。ここでは、実際の運用環境でのアップロードサイズ設定例をいくつか紹介します。これらを参考に、自身の環境に最適な設定を見つけてください。

1. 小規模な画像アップロードサイト


写真やロゴなど、比較的小さなファイルをアップロードするサイトでは、大容量のファイルを許可する必要はありません。
設定例

upload_max_filesize = 5M
post_max_size = 8M
memory_limit = 128M
  • 用途:プロフィール画像や商品写真など
  • 理由:通常の画像ファイルは2〜4MB程度で十分です。アップロードサイズを5MBに制限することで、不正な大容量ファイルのアップロードを防ぎます。

2. 文書管理システム(PDFやWordファイルなど)


契約書や技術資料などの文書ファイルはサイズが大きくなりがちです。そのため、少し大きめに設定します。
設定例

upload_max_filesize = 20M
post_max_size = 25M
memory_limit = 256M
  • 用途:PDF、Excel、Wordなどのビジネス文書
  • 理由:20MB程度あれば、大抵の文書ファイルを扱うことができます。余裕を持たせるためにpost_max_sizeを25MBに設定します。

3. 動画アップロードサイト


動画をアップロードするサービスでは、より大容量のファイルを扱う必要があります。ただし、サーバーの負荷を考慮し、無制限にしないことが重要です。
設定例

upload_max_filesize = 100M
post_max_size = 120M
memory_limit = 512M
  • 用途:短時間の動画やプロモーションビデオなど
  • 理由:一般的なHD動画ファイルは100MB前後です。ストレージや帯域幅を考慮し、100MBに制限します。
  • 注意:動画サイズが大きい場合は、アップロード後に圧縮処理を行うなどの対策も必要です。

4. メディア共有プラットフォーム(画像・音声・動画)


様々なメディアファイルを扱うプラットフォームでは、用途に応じてアップロードサイズを段階的に設定します。
設定例

upload_max_filesize = 50M
post_max_size = 60M
memory_limit = 256M
  • 用途:音声ファイルや中サイズの動画、画像
  • 理由:音声ファイルは10〜30MB程度、画像は数MB〜50MBまでが多いため、余裕を持った設定にします。

5. アップロードサイズをディレクトリごとに設定する


特定のディレクトリでのみアップロードサイズを制限する場合は、.htaccessを使用して以下のように設定します。

php_value upload_max_filesize 10M
php_value post_max_size 12M
  • /var/www/html/uploadsディレクトリ内でのみ有効になります。
  • 動的にアップロードサイズを変更できるため、プロジェクトごとに柔軟に対応可能です。

環境ごとの最適なアップロードサイズ設定

  • 開発環境:10MB程度で十分。テスト用なので過度な制限は不要。
  • 本番環境:セキュリティを重視し、最小限のサイズ設定を行う。必要な場合のみ拡張。
  • ストレージ制限が厳しい場合:ファイルサイズを10MB以下に制限し、大容量ファイルは外部ストレージを利用する。

アップロードサイズの設定は、用途とセキュリティのバランスが重要です。必要以上に大きくしすぎないよう注意しつつ、運用状況に合わせて調整していきましょう。

まとめ


本記事では、ApacheサーバーでPHPのファイルアップロードサイズを制限する方法について解説しました。

アップロードサイズの変更は、php.ini.htaccesshttpd.confを編集することで実現できます。これにより、不正な大容量ファイルのアップロードを防ぎ、サーバーの負荷やストレージの消費を抑えることが可能です。

また、セキュリティ対策として、DoS攻撃の防止ディスクスペースの保護など、アップロードサイズを制限することの重要性についても触れました。

適切なアップロードサイズの設定は、サーバーの安定性セキュリティ向上に直結します。運用するシステムの目的や利用状況に合わせて柔軟に設定を変更し、安全で効率的なアップロード環境を整えましょう。

コメント

コメントする

目次