SonarQubeを試してみる

こちらの続きです。

takapi86.hatenablog.com

セキュリティの診断ができる静的解析ツールを探していましたが、前回絞り込みを行った結果以下、3つのツールが残りました。

2018-12-09 現在、それぞれ、以下のような状況でした。

Parse: A PHP Security Scanner

https://github.com/psecio/parse

  • Star: 229
  • 最終更新: 2018-08-02
  • contributors: 7
  • その他

Pixy

https://github.com/oliverklee/pixy

  • Star: 85
  • 最終更新: 2018-01-24
  • contributors: 1
  • その他
    • JUnit が必要らしい

SonarQube

https://github.com/SonarSource/sonarqube

  • Star: 3164
  • 最終更新: 2018-12-04
  • contributors: 75
  • その他
    • phpの他に20種類以上の言語に対応しているらしい
    • 管理サーバを立てる必要があるらしい

SonarQube を試す

パッと見で、3つの内だと SonarQube が良さそうなので試してみる。

以下の方法で試せる

1. webサービスから

https://sonarcloud.io/about/sq

2. HomeBrew から

brew install sonarqube

でいけるらしい。

参考: https://qiita.com/thankkingdom/items/8abb0b329dc575f5b281

3. docker から

Docker Hub に公式のリポジトリがあるので、それを使う

https://hub.docker.com/_/sonarqube/

4. サーバをちゃんと構築

サーバにちゃんと構築するなら、この方法でやる。 https://docs.sonarqube.org/latest/setup/overview/

参考: https://dev.classmethod.jp/ci/sonarqube-source-analytics-1/

dockerで立ち上げる

一番手軽そうな docker を選びました。

今回は docker-compose を使いました。

docker-compose.yml

version: '3'
services:
  sonarqube:
    image: sonarqube:lts
    ports:
      - 9000:9000

これだけ書いて、

docker-compose up

で、ピッとサービスが上がるはずです。

その他、設定などはこちらに書いてあります。 https://hub.docker.com/_/sonarqube/

初期設定

  • ログイン

http://localhost:9000/ へアクセス

id, password は、DockerHubのページに書いてあります。

tokenの生成 と 診断したいプロジェクトの言語を選択するウィザードがでるのでよしなに入力します。

f:id:takapi86:20181210005855p:plain

次の画面のリンク先から SonarQube Scanner というソースコードの解析を行い、サーバに結果を通知するツールをダウンロードします。そして、パスの通ったディレクトリから呼び出せるように設定します。

次に、Execute the SonarQube Scanner from your computer の欄にあるコマンドを、静的解析したいコードのあるディレクトリで実行します。(なければ、ウィザード画面上部にある Skip Tutorial を押します。)

f:id:takapi86:20181210005950p:plain

Administration -> Marketplace から、phpの解析プラグインSonarPHP)を更新します。

f:id:takapi86:20181210010059p:plain

Update to XXX の部分が Update Pending になったら、画面上部に出てくる Restart ボタンを押し再起動します。

静的解析してみる

手元に静的解析したい良い感じのPHPのコードが無かったので、GETのパラメータの値を直接 shell_exec コマンドに入れてみたり、SQL文に入れてみたり(PreparedStatementなし)ないかにもヤバそうなコードを書いてテストしてみました。

先程チュートリアルで実行したものと同じコマンドを実行しました。

結果

1件

Define a constant instead of duplicating this literal "hoge_id" 3 times.

コードの内部で $_GET['hoge_id'] を3回つかっていたのですが、そこだけ怒られました。 もう少し怒ってくれることを期待していたのですが。

rulesを確認する

セキュリティに関する rules は以下、合わせて28でした。

https://rules.sonarsource.com/php/type/Vulnerability https://rules.sonarsource.com/php/type/Security%20Hotspot

これは一般的にみて、多いのか少ないのか比較していないのでわかりませんが、とりあえず今日はここまで