PHPでFizzBuzzを書いてみました

なんとなくFizzBuzzが流行っている気がしたので、気のせいかも知れませんが、書いてみようと思いました。実は、FizzBuzzって書いたことないんですよね。

FizzBuzz問題とは?

1、2、3、…という数字の入力に対して

  • 3で割り切れる場合は「Fizz」
  • 5で割り切れる場合は「Buzz」
  • 3でも5でも割り切れる場合は「FizzBuzz」
  • それ以外の場合は数字をそのまま

出力するプログラムを書くことです。

ということで、出力は以下のようになります。

1
2
Fizz
4
Buzz
Fizz
7
8
Fizz
Buzz
11
Fizz
13
14
FizzBuzz
16
17
Fizz
19
Buzz
…

はじめてのFizzBuzz

後藤さんの影響か、なんかやたらしっかりとモデリングしてオブジェクト指向で書かないといけないような風潮が私の周りでは感じられますが、まあ、再利用することもないでしょうから軽く行くことにします。

で、こんな感じになりました。

<?php

function fizz_buzz_spec($num)
{
    if (($num % 15) === 0) {
        return 'FizzBuzz';
    } elseif (($num % 3) === 0) {
        return 'Fizz';
    } elseif (($num % 5) === 0) {
        return 'Buzz';
    } else {
        return $num;
    }
}

function fizz_buzz_echo($carry, $num)
{
    echo fizz_buzz_spec($num), PHP_EOL;
}

array_reduce(range(1, 100), 'fizz_buzz_echo');

おっと、私も後藤さんの影響を受けていたようでarray_reduce()を使ってしまいました。

最短のFizzBuzz

それから、FizzBuzzはなんか最短のコードを競う競技でもあるようなので、短いものも考えてみました。

<?while($i++<100)echo[Fizz][$i%3].[Buzz][$i%5]?:$i,"
";

これで55バイトでした。PHP 5.4 5.5以上で、error_reporting(0)にする必要がありますが。

(2015-04-17 追記) arrayリテラルのデリファレンスはPHP 5.5以降でした。

それから、上記のコードの解説記事を書きました。

関連

Tags: php

『PHPポケットリファレンス』の改訂第3版が発売

『PHPポケットリファレンス』の改訂第3版が発売されています。PHPのリファレンス辞書的な『PHPポケットリファレンス』、ご存知の方も多いことでしょう。その改訂版です。

技術評論社の細谷さんより献本いただきました。ありがとうございます。

著者はPHP本体の開発にも多大な貢献をされている大垣さんです。

目次

Chapter 1 演算子と制御構造
Chapter 2 ステートメント
Chapter 3 数値演算
Chapter 4 変数/定数
Chapter 5 関数/クラスとオブジェクト
Chapter 6 ファイル
Chapter 7 ストリーム
Chapter 8 配列
Chapter 9 文字列処理と日本語処理
Chapter 10 正規表現
Chapter 11 変換とエスケープ
Chapter 12 日付と時刻
Chapter 13 データベース
Chapter 14 ネットワーク
Chapter 15 XML
Chapter 16 出力制御
Chapter 17 エラー処理
Chapter 18 設定/その他

特徴

PHPでよく使う機能をできるだけ網羅的に、簡潔なサンプルプログラムと共に解説する辞書的な書籍です。

昨今の出版事情からあまりにページ数の多い書籍は出版が難しいこともあり、648ページになっています(1つ前の改訂版は616ページ)。

なので、網羅的と言ってもPHPの機能は多すぎるため、すべてを含むことは不可能です。また、最近はPHPの機能追加が多いこともあり、新機能についての解説が追加されたため、前の版ではあった項目もそれなりに削られているようです。

PHP 5.6および4対応

今回の改訂で、PHP 5.6に対応されました。PHP 5.3~5.6が対象ですが、なんとPHP 4でも使える機能には「PHP4」のマークが入っています。

今さらPHP4とも思いますが、極まれにPHP4の案件もまだ存在するようですので、そういう現場ではうれしいのかも知れません。

割と詳しい?

本書は辞書的な書籍であり、網羅的な内容ですが、それでも「Chapter 7 ストリーム」や「Chapter 13 データベース」は比較的詳しいように思いました。

ストリームは、そもそも記載されている書籍が少ないように思います。

また、データベースでは、

  • pgsql
  • mysql
  • mysqli
  • PDO
  • mongo
  • DBA
  • sqlite3
  • Memcached

を取り扱っています。

とはいえ、1つ1つの項目の解説は簡潔なものであり、掘り下げて詳細に解説されているわけではありません。あくまで辞書的なリファレンスとして機能を引きたい、確認したいという用途のためのものです。

誰にお薦め?

最新のPHPの簡潔なリファレンス(辞書)を欲しいという人、特に紙で欲しいという人は購入を検討するとよいでしょう。特にPHP 5.6に対応しているこの種の書籍は現在これしかないです。

本屋で実物を見てから購入することをお薦めします。割と紙面のレイアウトの好みなどが大きく影響するものですから。

辞書なので頻繁に引いて使うという使い方と、全体を見て自分の知識の網羅性を確認するという2つ使い方があると思います。

各項目には、関連する項目への参照(見出しおよびページ数)が記載されており、関連する知識を学ぶことが可能です。

なお、電子版もありますが、Kindle版、Kobo版は固定型EPUBと呼ばれるフォーマットのため検索できないそうなので注意してください。電子版が欲しい人は、GDPからPDF版を購入するのがよいでしょう。

正誤表

また、このようなページ数の多い書籍では誤りがないということは現実的にはありえません。そこで、正誤表がきちんと出てくるかというのが1つのポイントでもあります。本書では、以下のサポートページに正誤表が掲載されています。

関連

著者による解説記事が以下にあります。

Tags: php, book

継続的WebセキュリティテストサービスVAddyを使ってみる

VAddyとは?

「VAddyはCIツールと連携し、継続的なセキュリティテストを実現するクラウド型Web脆弱性検査ツール」とのこと。

今回、このVAddyのワークショップ/雑談会がありましたので、参加しました。

VAddyを一言で言うと、Web脆弱性検査をCI(継続的インテグレーション)に組み込むツールと言った感じです。VAddyは完全にWeb開発者向けのサービスです。

もう少し知りたいという方は、以下の公式の説明資料をご覧ください。

使い方

さっそく使ってみましょう。

1. サインアップ

https://console.vaddy.net/ja/signup-pre からアカウントを作成し、メールに届いたURLにアクセスしアクティベートします。

2. ログイン

https://console.vaddy.net/login からログインし、VAddyの管理ページにアクセスします。

3. サーバの追加

前提として、テスト対象サーバをインターネット上に用意する必要があります。本番サーバをテスト対象にしてはいけません。

今回私はherokuのサーバを利用しました。

それでは、テスト対象サーバを登録しましょう。

▼Server List 「Add Server」ボタンを押します。

▼Add Server サーバのFQDNまたはIPアドレスを入力します。Basic認証が必要な場合は、ID/Passwordを入力します。そして「Add」ボタンを押します。

▼Unverified サーバが追加されましたが、まだVerifyされていませんので、「Status」が「Unverified」になっています。

4. Verification

追加されたサーバの所有者を確認するための検証作業です。

まず、Verificationファイルをサーバに設置します。ファイル名とコンテンツはVAddyの管理ページに説明されていますが、以下のようなファイルになります。

ファイル名:vaddy-24e0b10408.html
コンテンツ:24e0b10408

(11:09 追記) このファイル名およびコンテンツは秘密情報です。漏洩した場合、誰でもクロールデータを更新できてしまいます。なお、クロールデータを勝手に更新されることを防ぐために、VAddyには自分のサーバに(VAddyのプロキシサーバ経由で)クロールできるIPアドレスを制限する機能があります。

サーバのドキュメントルートにファイルをアップしたら、VAddyの管理ページの「Verify」ボタンを押します。

▼Verified 確認できると、上記のように「Status」が「Verified」に変わります。

これで、クロールできるようになりました。

5. プロキシ設定

ブラウザのプロキシ設定をVAddyのプロキシサーバに設定します。

VAddyのプロキシサーバを通しテスト対象サーバにアクセスすることで、そのアクセスを記録します。その記録を元に次回VAddyがサーバをスキャンして脆弱性の有無を診断します。

SSLサイトの場合は、VAddyのプロキシサーバがMITM攻撃の要領で通信を中継して処理します。そのためブラウザの警告が必ず出ます。

以下のページの説明に従って、ブラウザのプロキシ設定をします。

▼Proxy Status

▼Firefoxのプロキシ設定

6. クロール

クロールの準備ができましたので、いよいよクロールを開始します。

やることは、ブラウザで普通にテスト対象サーバにアクセスするだけです。

ここが、VAddyの1つの肝ですが、テストしたいページだけを開発者が選択してクロールします。手動クロールというわけです。サイトを詳しく知る開発者が必要なページだけをテスト対象にすることで、効率的なセキュリティテストができることになります。CIに載せるとなると、テストに時間がかかることは好ましくありませんからね。

クロールを開始するには、まず「クロール記録開始URL」にアクセスします。そして、テスト対象としたいページにアクセスし、終了したら「クロール記録終了URL」にアクセスします。

「クロール記録開始URL」「クロール記録終了URL」は、以下のページに記載されています。

▼No crawl data まだクロールをしていないため、「No crawl data」となっています。

記録されたクロールのアクセスデータを元にVAddyはスキャンを実行することになります。

クロールが完了したら、ブラウザのプロキシ設定を解除します。VAddyのプロキシサーバ経由では登録されたサーバ以外のサイトにはアクセスできず「Forbidden」が返るようになっています。

プロキシ設定を解除して、VAddy管理ページの「Proxy Status」にアクセスすると、「Proxy Crawling Results」の「Status」が「Recorded」に変わりました。

▼Recorded

これで準備完了です。スキャン可能になりました。

7. スキャン

VAddyの管理ページからスキャンを開始してみます。

▼Scan status 「Start Scan」ボタンを押します。

▼Start Scan 「Run VAddy Scan」ボタンを押すと、スキャンが開始されます。

▼スキャン実行中

▼スキャン完了 スキャンが完了すると結果が表示されます。脆弱性は発見されませんでした。

▼脆弱性があった場合 脆弱性があった場合は、「1 Problem」のように検出された脆弱性の数が表示されます。また、メールでの報告も届きます。

「Scan ID」をクリックすると詳細が表示されます。

▼脆弱性の詳細 クロスサイトスクリプティングが検出されています。「Show」ボタンを押すとVAddyが送信したHTTPリクエストデータが表示されます。

▼HTTPリクエストデータ

以上が、VAddyの一通りの使い方です。

他にもJenkinsプラグインを使い、Jenkinsからスキャンを開始することもできるようです。

VAddyの感想

VAddyの特徴としてはWeb開発者向けの開発ツールであるという点が際立っているように思いました。

対象者が非常に明確でCIに脆弱性検査を載せるというコンセプトもわかりやすいです。

また、誰に何を提供して何を提供しないかがはっきりしており好ましく感じました。

ただし、実際に導入するとなると、手動クロールをいつどうやって更新していくかが最大の問題です。手動クロールという仕様上、クロールを更新しない限りテスト対象は変わりません。

また、現状のVAddyの検査能力はまだ非常に限られたものです。現在提供されているのは、XSSとSQLインジェクションだけであり、XSSも永続的な(蓄積型の)XSSやDOMベースのXSSは検出できません。

今の検査能力だとレベルの高い開発者にはあまり役立たない気がします。逆に、SQLインジェクションやHTMLでのエスケープ漏れがどこにあるかわからないというような現場では、テストツールとして有用だと思います。

ただし、もともとセキュリティというのは継続的なプロセスですし、あるツール1つで完璧になるというものではありません。VAddyもセキュリティのための開発者の1ツールであり、現状でも一定の効果は期待できるでしょうし、今後の検査能力の向上により、さらに有用なツールとなることを期待したいです。

(10:52 追記) 現状でのVAddyの機能一覧、検査項目については、以下に記載されています。

VAddyの使いどころ

現在、VAddyは無料であり手軽に試すことができます。また、有料版の提供(今年夏頃?)以降も無料版は(制限がきつくなる可能性はありますが)継続されるそうです。

ということで、テスト対象サーバとテストのためのクロールが用意できる環境であれば、比較的簡単に使ってみることができます。

まあ、クロールは、ブラウザでテスト対象サーバにアクセスするだけなので、小さなサイトであれば手動でクロールしてもそれほど問題ではないと思われます。

ただし、現状VAddyは最後に記録したクロールしかスキャンできません。開発が進むにつれてテスト範囲も徐々に増えるでしょうから、やはり、Seleniumなどでクロール自体をコード化して維持していくのがいいのではないかと思います。

現状でも、単純なXSSやSQLインジェクションは検出可能ですので、無料の脆弱性検査ツールとして開発フローに導入すると1つの安心材料になると思います。

Waltiについて

似たようなサービスにWaltiというものがあります。これも日本製です。

サーバサイドのセキュリティスキャンということで広い意味では同じジャンルになりそうですが、方向性はかなり違うようです。

Waltiはオートスキャン(自動クロール)であり、また、オープンソースのセキュリティスキャナ(niktoやskipfishなど)を利用するというアプローチのようです(VAddyは自社開発)。

対象者もWeb開発者向けというよりももう少し広い感じです。

おまけのTips

VAddyの管理ページにログインすると、右下に緑色の「Feedback / Question?」というタブがあります。これをクリックするとVAddyのサポートの担当者とチャットすることができます(不在の場合はメッセージを残せる)。

現在は、cakephperさんがこのサポートを担当されています。なので、日本語でOKです!

関連

Tags: security