PHP はさまざまな Web 開発で広く使用されています。サーバー側のスクリプトが正しく構成されていない場合、さまざまな問題が発生する可能性があります。現在、ほとんどの Web サーバーは Linux (Ubuntu、Debian など) 上で実行されています。この記事では、PHP のセキュリティに関するベスト プラクティスのトップ 10 を例示し、PHP を簡単かつ安全に設定できるようにします。
PHP セキュリティ設定のヒント:
DocumentRoot: /var/www/ デフォルト Web サーバー: Apache
デフォルトの PHP 設定ファイル: /etc/php.ini
デフォルトの PHP 拡張機能設定ディレクトリ: /etc/php.d/
サンプル php セキュリティ構成ファイル: /etc/php.d/security.ini (このファイルはテキスト エディターを使用して作成する必要があります)
オペレーティング システム: Ubuntu (この手順は、RHEL / CentOS / Fedora などの他の Linux ディストリビューション、または OpenBSD/FreeBSD/HP-UX などの他の Unix 系オペレーティング システムでも動作する必要があります)。
1. PHP 組み込みモジュールを減らす
パフォーマンスとセキュリティを強化するために、PHP のモジュールの数を減らすことを強くお勧めします。以下のコマンドを実行してインストールされたモジュールを見てみましょう。
# php –m 同様の結果が得られます:
[PHP モジュール] apc bcmath bz2 カレンダー コア ctypecurl date dom ereg exif fileinfo filter ftp gd gettext gmp hash iconv imap json libxml mbstring memcache mysql mysqli openssl pcntl pcre PDO pdo_mysql pdo_sqlite Phar readlineion 反映セッション shmop SimpleXML ソケット SPL sqlite3 標準トークナイザーwddxml xmlreader xmlrpc xmlwriter xsl zip zlib [Zend モジュール] Suhosin モジュールを削除して、このコマンドを実行します。例: モジュール sqlite3
を削除します。# rm /etc/php.d/sqlite3.ini
または
# mv /etc/php.d/sqlite3.ini /etc/php.d/sqlite3.disableRestrict 2. PHP 情報漏洩を最小限に抑える
デフォルトでは、PHP は各応答間の HTTP ヘッダーに行を生成します (たとえば、X-Powered-By: PHP/5.2.10)。これにより、攻撃者にとって非常に貴重な情報がシステム情報に作成されます。
HTTP の例:
HTTP/1.1 200 OK X-Powered-By: PHP/5.2.10 Content-type: text/html; charset=UTF-8 Vary: Accept-Encoding、Cookie gzip、Cookie;string-contains=wikiToken;string-contains= wikiLoggedOut;string-contains=wiki_session Last-Modified: 木, 03 Nov 2011 22:32:55 GMT…
したがって、PHP 情報漏洩を禁止するには、/etc/php.d/secuity.ini を編集し、次の指示を設定する必要があります。
expose_php=オフ3. PHP ロードモジュールを最小化します
デフォルトでは、RHEL によってロードされるすべてのモジュールは /etc/php.d/ ディレクトリにあります。特定のモジュールを無効または有効にするには、構成ファイル /etc/php.d/ ディレクトリ内のモジュール名をコメントアウトするだけです。 PHP のパフォーマンスとセキュリティを最適化するために、アプリケーションで必要な場合は拡張機能を有効にすることを強くお勧めします。たとえば、GD 拡張機能を無効にする場合は、次のコマンドを入力します:
# cd /etc/php.d/
# mv gd.{ini, 無効化}
# /etc/init.d/apache2 restart PGP GD モジュールを拡張するには、次のコマンドを入力します:
# mv gd.{無効化、ini}
# /sbin/service httpd restart 4. PHP エラー メッセージを記録します
システムと Web アプリケーションのセキュリティを強化するため、PHP エラー メッセージは公開できません。これを行うには、/etc/php.d/security.ini ファイルを編集し、次のディレクティブを設定します:
display_errors=Off 開発者がバグを修正しやすくするために、すべての PHP エラー メッセージをログに記録する必要があります。
log_errors=オン
error_log=/var/log/httpd/php_scripts_error.log
5. リモートコード実行を無効にする
コードがリモートで実行される場合は、PHP コードが FTP や Web などのリモート機能からデータを取得して、PHP を通じてビルド機能を実行できるようにします。例: file_get_contents()。
多くのプログラマは、これらの関数を使用して、FTP または HTTP プロトコルを通じてリモートからデータを取得します。ただし、この方法では PHP ベースのアプリケーションに大きな脆弱性が生じます。ほとんどのプログラマは、ユーザーが提供したデータを渡すときに適切なサニタイズを実装していないため、コードの作成時にセキュリティ ホールが開き、脆弱性が注入されます。この問題を解決するには、/etc/php.d/security.ini で _url_fopen を無効にし、次のコマンドを設定します:
allow_url_fopen=Off これに加えて、システムのセキュリティを向上させるために _url_include を無効にすることもお勧めします。
allow_url_include=Off 6. PHP の危険な機能を無効にする
PHP には、誤って使用するとシステムをクラッシュさせる危険な組み込み関数が多数あります。 /etc/php.d/security.ini を編集することで、PHP 組み込み機能のリストを作成して無効にすることができます。
disable_functions =exec、passthru、shell_exec、system、proc_open、popen、curl_exec、curl_multi_exec、parse_ini_file、show_source 7. リソース制御
システムの安定性を向上させるために、各スクリプトがリクエスト データを解析するのに費やす時間と、スクリプトが消費するメモリの最大量を設定することを強くお勧めします。これらのパラメータを適切に構成すると、PHP スクリプトがリソースやメモリを過剰に消費するのを防ぐことができ、システムが安全でなくなったり、セキュリティ要素が低下したりするのを防ぐことができます。
# 秒単位で設定
最大実行時間 = 30
max_input_time = 30
memory_limit = 40M
8. ファイル システムへの PHP アクセスを制限します
open_basedir ディレクティブで指定されたディレクトリには、fopen() などの関数を使用して PHP からアクセスできます。スクリプトが open_basdir で定義されたパスを超えてファイルにアクセスしようとすると、PHP はそのファイルを開くことを拒否します。回避策としてシンボリック リンクを使用できないことに注意してください。
; /var/www/html/open_basedir="/var/www/html/" などの外部のファイルへの PHP プロセスのアクセスを制限します。 vhost/cyberciti.biz/html/:/home/httpd/vhost/nixcraft.com/html/:/home/httpd/vhost/theos.in/html/"; ——9. ファイル/ディレクトリへのアクセスを制限する
適切なセキュリティ設定を行います。Apache が非 root ユーザー (www-data または www など) として実行されていることを確認します。/var/www/ 下のファイルとディレクトリも非 root ユーザーに属します。所有者を変更するには、次のコマンドを実行します:
# chown -R apache: apache /var/www/ 10. Apache、PHP、MySQL の設定ファイルをコンパイルして保護します
charrt コマンドを使用して保護構成ファイルをコンパイルします
# chattr +i /etc/php.ini
# chattr +i /etc/php.d/*
# chattr +i /etc/my.ini
# chattr +i /etc/httpd/conf/httpd.conf
# chattr +i /etc/ charrt コマンドを使用して、PHP ファイルまたはファイル内の /var/www/html ディレクトリをコンパイルして保護します。
# chattr +i /var/www/html/file1.php
# chattr +i /var/www/html/