【PHP】静的解析で脆弱性に対応!簡単解説で速攻理解

PHPでプログラムを作った後、すぐにうまく動いてくれる場合もあれば、エラー等の発生で動かない場合も沢山あります。

その場合、目視でプログラムをチェックするという方法もありますが、大量のコードだった場合は困難です。

そんな時はPHPファイルを解析にかけましょう。

今回はプログラムを動作させない静的解析について以下の内容でお話していきます。

【解説】静的解析とは
【基本】簡単な解析
【応用】ツールで解析

わかりやすく解説していきますので最後まで読んで頂けると幸いです。

静的解析について

まず、静的解析について理解しましょう。

静的解析とは

静的解析では、プログラムを実行・動作させる事はありません。

そのため、【静的】と呼びます。

【解析】は、書かれたプログラムを分析してエラー箇所をみつけることを指します。

つまり、静的解析とは、プログラムを動かす事なくエラー箇所を見つけるテストのようなものです。

因みに静的解析の反対の動的解析は、プログラムを実行してエラー箇所を発見します。

解析を行う目的

なぜ解析を行う必要があるのでしょうか。

プログラムを実行して、動かなかったらその部分を修正すればいい!とお考えでしょうか。

自分のローカル環境のみで動かすテストプログラムでしたらそれでもよいのかもしれません。

しかし、大量のコードが書かれたプログラムだった場合、どこを修正するのか探すのも大変です。

また、無限ループを発生させるようなコードだった場合はサーバー環境に負荷を与えてしまうかもしれません。

構文に問題のあるプログラムは、脆弱性やセキュリティにも関与してくる場合もあります。

プログラムを書いたら動かす前に解析。

この癖は付けておいた方がよいと思います。


【何から学べばいいかわからない…そんな悩みを解決します!】

完全無料ですぐわかる「プログラミング学習プラン診断」

・適性にあわせて学習プランを診断
・完全無料で気軽に診断できる
・学習の悩みもまるっと解決

さっそく診断してみる

コマンドで解析を行う方法

では、実際に静的解析を行ってみましょう。

一番簡単なlintコマンドを使った確認方法です。

サンプルコードerror_test.phpを以下のように作成してみて下さい。

<?php
echo "samurai"

そして、PHPが実行できるローカル環境等に配置しましょう。

因みにこのコードは最後に【;】がないのでエラーになります。

そして以下のコマンドを発行しましょう。

php -l error_test.php

結果は以下の図のようになります。

エラー箇所の行も表示されるので便利です。

それてはerror_test.phpのエラー箇所を修正して再度コマンドを実行します。

<?php
echo "samurai";

結果は以下の表示となります。

これがエラーがない場合の結果です。

ツールで静的解析を行う方法

静的解析について何となくご理解頂けたでしょうか。

前章ではコマンドを使ってチェックする方法を解説しましたが、実は静的解析の方法は他にもあります。

それが、ツールを使った方法です。

今回紹介するツールはPHPStanです。

特徴としては、

  • 変数が存在しているか
  • 連想配列のキーチェック
  • プロパティの型

など、構文だけではなく細かい所までチェックを行ってくれます。

実際に使ってみましょう。

1.インストール

今回はローカルに作成したvagrant環境(CentOS)でインストールしました。

コマンドは以下の二つを順に発行しました。

composer require --dev phpstan/phpstan-shim
composer require --dev phpstan/phpstan

以下の画像のようにインストールが完了しました。

2.エラーをチェック

インストールが完了したので、PHPStanを使ってエラーをチェックしてみます。

以下のようなerror_test2.phpを作成してみます。

<?php
echo $samurai;

存在していない変数の表示なのでエラーが出るはずです。

エラーチェックのためのコマンドは以下です。

vendor/bin/phpstan analyse -l 【チェックレベル】 【チェックしたいPHPファイルのパスとファイル名】

チェックレベルとは、チェックの厳しさの事です。

0~7まで設定でき、7が一番厳しいチェックです。

では、以下のコマンドを実行します。

vendor/bin/phpstan analyse -l 3 error_test2.php

結果は以下の図のようになりました。

Undefined variable: $samurai
とありますので、やはり存在していない変数の表示部分がエラーとなりました。

では、error_test2.phpを修正してエラーがでないようにしましょう。

<?php
$samurai = '侍エンジニア';
echo $samurai;

再度以下のコマンドを実行します。

vendor/bin/phpstan analyse -l 3 error_test2.php

結果は以下のようになりました。

これが、エラーがない場合の表示結果です。

lintコマンドを使った解析ではチェックできない細かい部分までチェックできるのでお勧めです。


【なかなかエラーが解決できない…そんな悩みを解決します!】

登録無料で始められるプログラミングスクール「侍テラコヤ」

・回答率100%のQ&A掲示板でエラーを解決!
現役エンジニアとのオンライン相談で悩みを解決!
・50種類以上の教材で複数言語を習得!

侍テラコヤについて詳しく見る

まとめ

今回はPHPの静的解析について解説しました。

少量のコードだけならば目視の確認でも大丈夫ですが、コードの量が多くなればそれも難しくなります。

また、目視ではチェックレベルもまばらになると思います。

業務でコードを書く場合はツールを使うのがおすすめです。

それでは、また。

プログラミング学習中、
誰かへ相談したいことはありませんか?

SAMURAI TERAKOYA

プログラミングはエラーの連続。作業を進めるなかで誰かに教えてほしい場面は多いですよね。

そんな悩みを解決できるのが、侍テラコヤです。登録無料で始められて、現役エンジニアとオンラインで相談できるほか、回答率100%のQA掲示版でプログラミングに関する悩みを解決します!

気になる方はぜひ詳細をご覧ください。

→侍テラコヤの詳細をみる

独学PG&SE、東京在住30代女性。
誰でもプログラマーになれるがモットーで、わかりやすい記事を目指しています。

あなたの目的に合わせた
SAMURAI ENGINEERの運営サービス

SAMURAI ENGINEER Pro

未経験でも挫折しないプログラミングスクール

詳細はこちら

SAMURAI TERAKOYA

日本最大級のサブスク型オンラインITスクール

詳細はこちら

SAMURAI ENGINEER Freelance

「一人で稼げる」スキルを身につける

詳細はこちら
Close