【PHP8.x】highlight_file関数の使い方
highlight_file関数は、指定されたPHPファイルのソースコードを読み込み、シンタックスハイライトされたHTML形式で出力、または文字列として返す関数です。この関数は、主にPHP開発者が自身の作成したコードの内容を視覚的に確認したり、Webサイト上でPHPコードの例を提示したりする際に役立ちます。コードの予約語、文字列、コメントなどが色分けされるため、可読性を高めます。
この関数は、ハイライトしたいファイルのパスを第一引数に取ります。例えば、highlight_file('example.php');
と記述すると、example.php
の内容が色分けされてブラウザに直接出力されます。ハイライトされた内容を直接出力せず、文字列として取得したい場合は、第二引数にtrue
を指定します。この場合、関数はハイライトされたHTML文字列を返し、その文字列をプログラム内で利用することが可能です。
ファイルが見つからない、または読み込みに失敗した場合は警告を発し、false
を返します。そのため、利用する際はエラーハンドリングを検討することが重要です。また、セキュリティ上の観点から、ユーザーが任意のファイルを指定してハイライトさせるような公開Webアプリケーションでの利用は推奨されません。意図しない機密情報が外部に公開されるリスクがあるため、信頼できるファイルパスのみを対象とすることが非常に重要です。
基本的な使い方
構文(syntax)
<?php
highlight_file("example.php");
?>
引数(parameters)
string $filename, bool $return = false
- string $filename: シンタックスハイライトを行うPHPファイルへのパスを指定する文字列
- bool $return = false: trueの場合、ハイライトされたコードを文字列として返します。falseの場合は、直接出力します。
戻り値(return)
string|false
指定されたPHPファイルのコードをシンタックスハイライトしたHTML文字列を返します。ファイルが存在しない、または読み込めない場合はfalseを返します。
サンプルコード
highlight_file()でファイルソースコード表示する
<?php
declare(strict_types=1);
// 警告: このコードにはディレクトリトラバーサルの脆弱性が含まれています。
// ユーザーからの入力を検証・サニタイズせずに highlight_file() 関数に渡しているため、
// Webサーバーからアクセス可能な任意のファイルのソースコードが閲覧される危険性があります。
// 攻撃例: ?file=../config/database.php や ?file=/etc/passwd
// GETリクエストから表示するファイル名を取得します。
// パラメータが指定されていない場合は、このスクリプト自身のファイル名を使用します。
$filename = $_GET['file'] ?? __FILE__;
// ユーザーが指定したファイルのソースコードをシンタックスハイライトして出力します。
// ここで入力値 ($filename) の検証が行われていないことが脆弱性の原因です。
// file_exists() などでチェックしても、パス指定によってはバイパスされる可能性があるため、
// 公開を許可するファイルリストを別途用意し、それと照合するなどの対策が必要です。
highlight_file($filename);
highlight_file
関数は、指定されたPHPファイルのソースコードを、構文に基づいて色付けされたHTML形式で出力するための関数です。主に、Webページ上でソースコードを読みやすく表示する目的で使用されます。
第一引数の$filename
には、対象となるファイルのパスを文字列で指定します。第二引数の$return
は省略可能な論理値で、デフォルトはfalse
です。false
の場合、整形されたコードは直接ブラウザに出力されます。true
を指定すると、コードは直接出力されず、整形されたHTMLが文字列として返されます。これにより、結果を変数に格納して後から利用することが可能になります。
提示されたサンプルコードは、URLのパラメータで受け取ったファイル名を表示するものです。しかし、このコードにはユーザーからの入力を何の検証もせずにそのまま関数に渡しているため、ディレクトリトラバーサルという深刻な脆弱性が存在します。これにより、攻撃者がパスを操作することで、設定ファイルなど本来見せてはいけないサーバー上の任意のファイルのソースコードを閲覧できてしまう危険性があります。外部からの入力をファイルパスとして扱う場合は、必ず安全な値であるか厳密に検証する必要があります。
このコードの最も注意すべき点は、ユーザーがURLで指定したファイル名を検証せずに highlight_file
関数に渡していることです。これにより、../
のようなパス指定を悪用され、本来公開すべきでない設定ファイルやシステムファイルの内容が閲覧されてしまう「ディレクトリトラバーサル」という脆弱性が生まれます。安全に利用するためには、ユーザーからの入力をそのまま信用せず、公開を許可するファイル名をあらかじめリストとして用意し、入力値がそのリストに含まれているかを確認する「ホワイトリスト方式」で必ず検証してください。単に file_exists
関数でファイルの存在を確認するだけでは、不正なパス指定を防げないため不十分です。