Skip to main content

2024年版 PHP静的解析の始め方

著者
blog feature playwright tests

2024年3月21日

0 分で読めます

PHPは、Web開発で広く使われている人気のサーバーサイドスクリプト言語です。静的解析ツールを活用すれば、PHPコードのエラーやセキュリティ上の脆弱性など、開発サイクルの早い段階で対処しなければアプリケーションの品質やセキュリティに影響を及ぼす問題を軽減できます。PHP開発者は、こうしたツールを活用することで、より高品質なソフトウェア製品をリリースし、デプロイできます。

静的解析とは何ですか?

静的解析は、静的コード解析やソースコード解析とも呼ばれ、プログラムを実行する前にソースコードを調べてデバッグする手法です。プログラムのソースコードに一連のコーディングルールを適用して実施します。静的解析の主な目的は、コード開発の早い段階でエラーを検出し、修正することです。

PHPの静的解析とは、コードを実行せずに調べ、問題の検出やコーディング規約への準拠確認、アーキテクチャの把握などを行うことです。

静的解析ツールがPHPコードの問題をどのように指摘するか、例を見てみましょう。

<?php
function add(int $left, int $right): int {
    return $left + $right;
}

echo add("one", "two");
?>

この例では、静的解析ツールは引数の「one」と「two」が整数ではないことを検出し、関数のパラメーター型宣言に違反していると判断します。

PHP開発における静的解析の重要性

静的解析は、さまざまな理由からPHP開発で重要な役割を果たします。まず、コードが本番環境にプッシュされる前に、PHPコードのエラーや潜在的な問題を検出できます。動的型付け言語であるPHPでは、型に関するエラーが発生しやすいため、特に重要です。

次に、PHPの静的解析によって、コードがあらかじめ定められたコーディング規約に準拠しているかを確認できます。一貫したコーディングスタイルを保つことが、コードの可読性と保守性に不可欠となる大規模プロジェクトやチーム開発では、特に重要です。

さらに、静的解析は、リファクタリングが必要な複雑なコードや「臭い」のあるコードを特定するのにも役立ちます。コードの複雑さに関する指標を提供することで、コード全体の品質向上を後押しします。

静的解析のメリット

静的解析は、特にPHP開発において、開発者やセキュリティチームに次のメリットをもたらします。

  • コード品質の向上:静的解析ツールは、エラーやセキュリティ上の脆弱性、コーディング規約違反を検出し、開発者によるコード品質の向上を支援します。開発サイクルの早い段階で問題を修正すれば、将来より大きな問題に発展するのを防げます。

  • セキュリティの強化:静的解析ツールは、コードベースに潜むセキュリティ上の脆弱性を特定するのに役立ちます。PHPのコードインジェクションやクロスサイトスクリプティング(XSS)、オープンリダイレクトの脆弱性など、よくあるセキュリティ上の問題を検出できます。

  • コードエラーの早期検出:問題を早期に検出することで、静的解析は開発者の時間とリソースを節約できます。デバッグや手作業でのコードレビューにかかる時間を大幅に削減し、開発者がより複雑なタスクに集中できるようにします。Snykによる無料のセキュリティ静的解析スキャンを始めましょう。

  • 標準への準拠:静的解析は、コードベースがコード品質、セキュリティ、保守性に関する業界標準に準拠しているかを確認するのに役立ちます。特定の標準への準拠が求められることの多い規制対象業界では、特に重要です。

PERCS 2.0について

PERCS 2.0(PHP Enhanced Review Coding Standard)は、初期バージョンのPERCSを大幅にアップグレードしたものです。PHPコードの静的解析を行う高度なツールで、開発者が特定のコーディング規約に準拠し、コード品質を高め、コーディング規約を強化できるようにします。

このバージョンのPERCSには、構文チェック、コードスタイルのチェック、潜在的なセキュリティ上の抜け穴の検出など、さまざまな機能が備わっています。コード品質の向上と標準的なコーディング規約への準拠を目指すPHP開発者にとって、価値あるツールです。

// Sample PHP code
<?php
$a = 1;
$b = 2;

// PERCS 2.0 can identify if this code adheres to the defined coding standards
$result = $a + $b;

// PERCS 2.0 will provide feedback on potential issues in this code
$result = add('1', 2);
?>

コーディング規約への準拠は、ソフトウェア開発に欠かせません。コードの可読性、保守性、一貫性が保たれるため、チームでの共同作業や新しい開発者によるコードベースの理解が容易になります。また、コーディング規約は、よくあるコーディングエラーや潜在的なセキュリティ上の脆弱性を防ぐのにも役立ちます。標準化されたコーディングスタイルを徹底することで、開発者は問題をより効率的かつ効果的に特定し、修正できます。

// A non-standard code
<?php
function ADD($a,$b){return $a+$b;}
?>

// A standard code
<?php
function addNumbers($firstNumber, $secondNumber) {
    return $firstNumber + $secondNumber;
}
?>

PERCS 2.0は、コード品質とコーディング規約への準拠を大幅に強化します。コードに関する即時フィードバックを開発者に提供し、コーディング規約に準拠していない箇所や潜在的なセキュリティ上の脆弱性を指摘します。

PERCS 2.0を使うことで、開発者はより高いコード品質を徹底し、PHPアプリケーションの信頼性、保守性、安全性を確保できます。

PHP静的解析ツールのおすすめ3選

コードセキュリティとソフトウェア開発において、静的解析は高いコード品質を維持し、問題になる前に潜在的なセキュリティ上の脆弱性を特定するための重要な要素です。PHPStan、Psalm、Snykという3つの強力なPHP静的解析ツールを見ていきましょう。これらのツールを使えば、PHPコードのバグやセキュリティ上の欠陥を見つけ、アプリケーションのセキュリティ基準への準拠を確保できます。

1. PHPStan

PHPStanは、最も広く使われているPHPコード向け静的解析ツールの1つです。コードを実行せずにバグを見つけることに特化しています。PHPStanの主なメリットは、コードのテストを書く前でも、さまざまな種類のバグを検出できることです。

PHPStanのインストールには、PHPの依存関係管理ツールであるComposerを使えます。手順は次のとおりです。

composer require --dev phpstan/phpstan

PHPコードに対してPHPStanを実行するには、次のコマンドを実行するだけです。

vendor/bin/phpstan analyse src

ここで、srcはPHPコードを含むディレクトリを表します。PHPStanは、コード内で見つかった潜在的な問題の一覧を出力します。出力には通常、ファイル名、行番号、問題の説明が含まれます。たとえば、次のような内容が検出・報告されます。

------ ----------------------------------------------------------------
  Line   src/Example.php
------ ----------------------------------------------------------------
  10     Parameter #1 $a of method Example::add() expects int, string given.
------ ----------------------------------------------------------------

2. Psalm

Psalmも、PHP向けの強力な静的解析ツールです。コードの構文エラーと論理エラーの両方を特定できるように設計されています。Psalmの大きなメリットの1つは、PHPコードの型を推論できることで、型に関連するバグを未然に検出できます。

PsalmはComposerを使ってインストールできます。

composer require --dev vimeo/psalm

PHPコードに対してPsalmを実行するには、次のコマンドを使います。

vendor/bin/psalm

PsalmはPHPStanと同様に、コード内の問題の一覧を出力します。ただしPsalmは、それぞれの問題に重大度も示すため、修正の優先順位付けに役立ちます。

Psalmの出力例を見てみましょう。

ERROR: InvalidArgument - src/Example.php:10:10 - Argument 1 of Example::add expects int, string provided

3. PHP開発のコードセキュリティを支えるSnyk

Snykは、開発者を第一に考えたセキュリティツールです。コードやオープンソースの依存関係、コンテナイメージなどに含まれる脆弱性やセキュリティ上の問題を見つけ、理解し、修正できるよう支援します。既存のワークフローにスムーズに組み込めるよう設計されており、さまざまなIDEやビルドツールとシームレスに連携します。SnykのPHPStormプラグインやVS Code拡張機能を無料で簡単にインストールし、コードのセキュリティスキャンを始められます。

Snykは、豊富な脆弱性データベースと高度なコード解析機能を活用して、安全でないコードの問題を特定します。これにより、SuiteCRMプロジェクトに影響を与えたコード実行や、dompdfのリモートコード実行など、幅広い潜在的なセキュリティ脅威を検出できます。

Snykが検出できるSQLインジェクションの例を見てみましょう。

// Example of SQL Injection Vulnerability
<?php

$conn = new mysqli("127.0.0.1", "user", "MySecretPassword", "db");

function doSqlQuery() {
  $query = "SELECT * FROM users WHERE login = '" . $_POST["login"];

  return mysqli_query($conn, $query);
}

$target = $_GET["target"];

header("Location: " . $target);

echo $_GET["user"];

上記のPHPコードでは、ユーザー入力がSQLクエリに直接連結されているため、SQLインジェクション攻撃を受けるおそれがあります。SnykのPHP静的コード解析は、これを重大なセキュリティリスクとして指摘します。上記のコードが安全でない理由と、この脆弱性を防ぐ方法を理解するために、SQLインジェクションに関するSnyk Learnのレッスンをぜひご覧ください。

Snyk CodeがPHPコードのSQLインジェクションの脆弱性を検出します。

Snykは、セキュリティ上の問題につながる可能性がある、PHPコードのよくあるバグの特定にも役立ちます。たとえば、非推奨またはサポート対象外のPHP関数を使うと、アプリケーションに脆弱性が生じることがあります。

SnykをPHPStormとVS Code IDEに統合する

SnykはPHPStormやVisual Studio Codeなどの主要なIDEに簡単に統合でき、コーディング中にリアルタイムのフィードバックと脆弱性スキャンを提供します。

PHPStorm用のSnykプラグインをインストールすると、IDEから直接Snykスキャンを実行できます。プロジェクトのProject Explorerで右クリックし、Snyk Scanを選択すると、下部パネルのSnykタブにスキャン結果が表示されます。

SnykとVS Codeの連携

SnykをVS Codeに統合するには、VS CodeマーケットプレイスからSnyk Vulnerability Scanner拡張機能をインストールします。インストールすると、Snykがプロジェクトを自動的にスキャンし、安全でないPHPコードのパターンやcomposerファイル内の脆弱な依存関係を検出します。Command Palette(Ctrl+Shift+P)を開いてSnykと入力し、Snyk: Rescanを選択すれば、プロジェクトを再スキャンすることもできます。スキャン結果はサイドバーの新しいSnykタブに表示されます。

CI/CDパイプラインへのPHP静的解析の統合

ソフトウェア開発の複雑化と安全なアプリケーションへのニーズの高まりを受け、静的解析ツールやコードスタイルツールをPHP開発ワークフローに統合することが、これまで以上に重要になっています。継続的インテグレーション(CI)と継続的デプロイメント(CD)のパイプラインは、これらのプロセスを自動化するのに最適な環境です。開発ライフサイクル全体を通じて、コード品質とセキュリティを維持できます。

これらのツールは、コード品質と一貫性の維持に役立つだけでなく、潜在的なセキュリティ脅威に対する第一の防衛線にもなります。ソフトウェア開発の早い段階で潜在的な脆弱性を特定して修正できるため、長期的に時間、労力、リソースを節約できます。

# An example of integrating PHPStan into a CI/CD pipeline using GitHub Actions

name: PHPStan

on: [push, pull_request]

jobs:
  analysis
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      - uses: shivammathur/setup-php@v2
        with:
          php-version: '7.4'
          tools: phpstan
      - run: composer install --no-progress
      - run: phpstan analyse

上記の例では、GitHub Actionsを使ってPHPStanをCI/CDパイプラインに統合しています。これにより、プッシュやプルリクエストのたびに静的解析が自動で実行され、潜在的な問題を早期に検出して、コードレビューを効率化できます。

CI自動化に静的解析を統合するメリット

静的解析をCIパイプラインに統合すると、次のような多くのメリットが得られます。

  • バグの早期検出:静的解析は、開発プロセスの早い段階で潜在的な問題や脆弱性を検出し、修正にかかるコストと時間を削減します。

  • コード品質の向上:コーディング規約とベストプラクティスを徹底することで、静的解析はよりクリーンで保守しやすいコードの実現につながります。

  • セキュリティの強化:静的解析は、コード内のセキュリティ上の脆弱性を特定し、より安全なアプリケーションの開発に役立ちます。

コードスタイルツールについて

次に取り上げるのは、一貫したコードスタイルの維持です。コードスタイルツールは、コードベース全体で統一されたスタイルを徹底し、コードの可読性と保守性を高めるうえで重要な役割を果たします。また、優れたコーディング慣行を徹底することで、エラーやセキュリティ上の脆弱性が発生する可能性も低減できます。PHPCS、StyleCI、PHP-CS-FixerといったPHP専用のコードスタイルツールを使えば実現できます。

コードスタイルツールを導入する理由

コーディング規約とは、コードを書くためのガイドラインとベストプラクティスです。開発者がクリーンでプロフェッショナルな、エラーのないコードを書けるようにします。一貫したコードスタイルに従うことで、コードの可読性が高まり、複雑さが軽減され、コードの再利用が促進されます。そこで活躍するのがコードスタイルツールです。こうしたツールはコードのスタイル上の問題を自動でチェックし、場合によっては修正もできます。

PHP開発では、こうしたツールが欠かせません。一貫したコードスタイルを維持できるだけでなく、潜在的なセキュリティ上の脆弱性の検出にも重要な役割を果たします。わずかなコーディングミスが深刻なセキュリティ侵害につながりかねない今日のサイバー脅威の状況において、これは不可欠です。

PHP_CodeSniffer(PHPCS)

PHP_CodeSniffer(PHPCS)は、2つのPHPスクリプトで構成されています。メインのphpcsスクリプトはPHP、JavaScript、CSSファイルをトークン化し、定義されたコーディング規約への違反を検出します。もう一方のphpcbfスクリプトは、コーディング規約違反を自動的に修正します。

Composerを使ってPHPCSをインストールできます。

composer global require "squizlabs/php_codesniffer=*"

インストール後、プロジェクトディレクトリでphpcsコマンドを実行します。

phpcs /path/to/your/php/files

PHPCSは、検出したコーディング規約違反を出力します。例:

FILE: /path/to/your/php/files/example.php
--------------------------------------------------------------------------------
FOUND 1 ERROR AFFECTING 1 LINE
--------------------------------------------------------------------------------
 20 | ERROR | [x] Line indented incorrectly; expected 4 spaces, found 2
--------------------------------------------------------------------------------
PHPCBF CAN FIX THE 1 MARKED SNIFF VIOLATIONS AUTOMATICALLY
--------------------------------------------------------------------------------

phpcbfコマンドを使うと、これらの問題を自動的に修正できます。

phpcbf /path/to/your/php/files

StyleCI

StyleCIは、PHPのコーディングスタイルに対応した継続的インテグレーションサービスです。GitHub、GitLab、Bitbucketのリポジトリと連携するWebベースのツールです。プッシュやプルリクエストのたびにコードをチェックし、設定したコーディングスタイルに準拠しているかを確認します。

StyleCIを使うには、Webサイトで登録し、リポジトリを連携する必要があります。

PHP-CS-Fixer

FriendsOfPHPが提供するPHP-CS-Fixerも、PHPコードのコーディング規約違反を検出するだけでなく、修正もできるツールです。

Composerを使ってPHP-CS-Fixerをインストールできます。

composer global require friendsofphp/php-cs-fixer

PHP-CS-Fixerのインストール後、php-cs-fixerコマンドを使ってコードを修正できます。

php-cs-fixer fix /path/to/your/php/files

PHP-CS-Fixerは、修正したファイルを出力します。

Fixed all files in 0.123 seconds, 12.000 MB memory used

まとめ

この記事では、PHP開発における静的解析ツールとコードスタイルツールの重要性について解説しました。こうしたツールが、コードベースの品質だけでなく、アプリケーション全体のセキュリティも向上させることを見てきました。

PHPStan、Psalm、Snykなどの静的解析ツールは、バグやセキュリティ上の脆弱性につながる可能性のあるPHPコード内の問題を特定するうえで重要な役割を果たします。これらのツールはコードを実行せずに詳細に解析するため、早い段階でエラーを検出できます。

コンテナを使ってPHPアプリケーションを構築している方は、次のリソースもぜひご覧ください。

CTFを始めよう

オンデマンドのバーチャル入門ワークショップを視聴して、CTFの課題の解き方を学びましょう。

続きを読む

blog feature snyk container custom base recommendations
Blog

Evo Agentic AppSecのご紹介:AI開発のスピードに対応するセキュリティ

AI駆動型開発のスピードに、従来のセキュリティワークフローは追いついていません。SnykのAgentic AppSecは、セキュリティエージェントが脆弱性を継続的に検出、修正、検証し、人が基準を定められるようにします。

feature insights context
Blog

自律型攻撃はすでに始まっている。防御もそのスピードに追いつかなければならない。

自律型攻撃者によって、防御に使える時間は短くなっています。継続的な検出、修復、検証、予防で、セキュリティチームが攻撃に歩調を合わせる方法をご紹介します。

illustration hero ai
Blog

AIハリケーンが到来

AIはソフトウェア開発とサイバー攻撃の双方を加速させています。リーダーは、エージェントとコードを開発の初期段階から保護し、実行時に制御を徹底するとともに、防御策を独立して検証しなければなりません。