塚原 大祐

2017.11.07

phpにおけるswitch文の闇

おひさしぶりです。塚原です。
朝夕は肌寒くなってきましたね。気づけばもう11月突入ということで
「今年もあと2ヶ月か~1年早いな」
と思いつつお問い合わせ対応など運用業務に勤しむ毎日です。

今回は、知ってはいたけど実際に遭遇すると嵌まる事例を紹介したいと思います。

少し前の問い合わせの話ですが、
社内での対応漏れを防ぐためのアラートメールの頻度を増やしてほしいという要望があり
対応したときの話です。

バッチがスケジューリングされており、引数の値によって送信内容が変わる仕組みだったのですが、
テストしてみると毎回同じパターンでしか送られていない、しかも稼働中のものも同じ動きで、
みんなそういうものだと思っていたため違和感なく運用されていた状態でした。

追っていくと意図しないパラメータのparserが噛まされており、
本来、渡ってくるはずのものが空になっていました。

パターンの分岐はswitch文で行われていたのですが、
空であれば該当するものがなくスルーされてエラーになるはずなのに動いている。。。

空文字が渡ってきていてswitch文、
「これは…俺が過去に書いたやつ!」ということで以下の通り

空文字とかNULLとか0とか

switch文において空文字が入ってきたときはcase 0:に入っちゃうということで
見事に同じパターンで送信されていたわけです。

「隙を生じぬ二段構え」ならぬ『隙だらけの二段構え』な感じの残念具合…

必ず入力値が入ってくる想定で作られていたものの、
隙を生じさせないための事前のチェックは必要だなと思った次第です。

この場合では、社内のアラートメールだったのでよくないですけど、よかったです。
調べて知ってはいたものの、入力値を見るまでは気づけなかったので、まだまだ研鑽が足りないです。
もし、これがユーザ向けの大量メールマガジンとかだったら…と考えただけで脇汗モノですね。

そしてこのswitch文、判定は比較演算子の==と同じ動きなのですが、
phpにおいては

文字列と数値0の比較は=となる
http://techblog.ecstudio.jp/tech-tips/php-string-compare.html (引用)

という仕様のようでして、入力値の設計をちゃんとするか、事前チェックを入れないと
不具合の原因となる要素があるってことですね。
比較対象にもよりますが、どんな値が入ってくるかわからないパラメータの値を
そのまま入れちゃうとかはNGなわけです。

phpは型をあまり意識しなくても書けるイメージでしたが、
意外と割と使いそうなものに意識しないといけないものがあって身の引き締まる思いです。

嵌まってるときはそれどころではないですが、冷静になって調べてみるとなかなか深いですよね。
それではまた!

塚原 大祐

名の由来は「天祐」。 そのままではおこがましいので 天の字から1本棒をとればと叔父がつけてくれたもの。 名に恥じぬよう世の中の助けとなるものを創り出していきたいです。 for Facebookのサポート・運用開発の部隊に所属しています。

RELATION ENTRY

塚原 大祐の記事一覧へ

▶︎