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

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

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

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

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

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

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

目次

静的解析について

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

静的解析とは

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

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

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

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

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

解析を行う目的

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

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

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

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

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

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

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

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

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

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

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

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

<?php
echo "samurai"

[su_spacer size=”20″]

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

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

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

php -l error_test.php

[su_spacer size=”20″]

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

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

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

<?php
echo "samurai";

[su_spacer size=”20″]

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

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

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

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

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

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

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

特徴としては、

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

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

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

1.インストール

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

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

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

[su_spacer size=”20″]

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

2.エラーをチェック

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

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

<?php
echo $samurai;

[su_spacer size=”20″]

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

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

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

[su_spacer size=”20″]

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

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

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

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

[su_spacer size=”20″]

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

Undefined variable: $samurai

[su_spacer size=”20″]
とありますので、やはり存在していない変数の表示部分がエラーとなりました。

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

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

[su_spacer size=”20″]

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

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

[su_spacer size=”20″]

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

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

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

まとめ

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

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

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

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

それでは、また。

この記事を書いた人

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

目次