PHPは知らんのです

ライセンスの問題さえなければ、無償のツールを会社で使用するのは特に問題ないのだけれど、もちろんデメリットもあって
・問題があっても社内リソースで解決しなければならない(サポートが受けられない)
・プラットフォームの更新に追随できるとは限らない
という感じだ。

無償ツールは簡単に使えるが、使い続けることが難しい。OS、ウェブサーバ、DBが変わっただけで動作しなくなるなんてザラで、動作しなくなったら自分で動かすか代替手段を考えなければならない。

社内イントラで無償のwikiであるpukiwikiを使用している。非常によくできたツールであり、有志の作ったプラグイン機能も豊富で非常に便利だ。しかし、OSのアップデート、Apacheのアップデート、PHPのアップデートなどプラットフォームの更新によって動かなくなることが多い。
まあ、動かなくなってもPHPが読めれば動かせるのだが、当社にはPHPが読める社員がいないのだ(笑)

というわけで、Pukiwikiを使用している環境で、OSを更新したり、PukiWikiを更新したり、Apacheを更新したり、PHPを更新したりしたところ、PukiWikiプラグイン「checkbox2.inc.php」が一部動かなくなった。どうも、pukiwikiで日本語名のページを作成すると、その日本語名ページではcheckbox2が動作しない。

PHPなんて書いたことも読んだこともないが、なんとなく眺めているとなんとなく意味がわかってきた。ページ名称を入れてそうな変数を調べるとhtmlspecialcharsという関数で変換しているようだった。この関数を外してみるだけで正しく動作した。関数名から推定するに、XSSを発生させないようにエスケープする関数だろう。ちゃんとコードが読めれば、htmlspecialcharsをはずしてもXSSを起こさないか判断できそうだが、まあイントラなので、とりあえず外しただけで良しとした。ページ名に日本語がある場合、そもそもページ名はhtmlspecialcharsを通す前からエスケープされていそうだったので、おそらくは2重エスケープが問題だったと思われる。

ということで、
教訓1 知らないプログラミング言語でもほかの言語を知ってれば、なんとなく読めることはある
教訓2 知らないプログラミング言語のツールは使うな、どうしても使うなら有償サポートつけるか、その言語を知れ

6/13追記
htmlspecialchars関数はPHP5.4あたりから第3引数に文字コード指定をしないと日本語処理がうまくいかないという話があるようで、それが原因かもしれません。