画像掲示板の新着表示が壊れる

dtn.jpのトップページでは「画像掲示板の泉」新着投稿を表示するようしておりましたが、掲示板新着投稿データの取得がうまくできておらず、トップページのDIVレイアウトが壊れてしまっていることに気が付きました。

画像掲示板の板が真っ白に

急ぎ、女優画像掲示板を見てみると画面が真っ白になってしまっておりました。ログファイルを確認しても0Byteとなっており、ログが消失してしまったようです。

残念ながら直近のバックアップを取っておらず、取り急ぎ一カ月前のデータで復旧させました。投稿が消失してしまった方申し訳ありませんでした。

復旧させても再度真っ白に

データ復旧させたものの、不思議なことに見る間にまたログが欠損していき、一分も経つとまたログが0Byteになってしまいました。

しかも、再度復旧をさせてもまた同じような現象が発生しており、攻撃か!とも思いましたが、どうやら単にスパム連投をくらっていたようですが、投稿プログラムではログ更新時のファイルロックはかけていたので原因がよくわかりません。

PHPのfopen()でwモードの危険性

原因を調べてみたのですが、fopen($filename,”w”)のwモードだとデータが飛ぶ可能性が高いとの記載がphpspotさんで書かれているのを発見しました。

ここで注意点ですが、fopen($filename,”w”); のようにファイルを開くと、ロックをしたとしてもデータが飛ぶ可能性が高いです。
というのは “w” モードで書き込みを行おうとすると、最初にファイルサイズを0バイトにするため、flock でファイルロックを行っても、データが飛んでしまいます。

flock する場合は r+ の読み書きモードで開きましょう。

phpspot.net

fopen()のファイルアクセス形式のモード

mode説明
r読み込みのみでファイルを開く。ファイルポインタはファイルの先頭に置かれる。
r+読み込み/書き出し用にファイルを開く。 ファイルポインタはファイルの先頭に置かれる。
w書き出しのみでファイルを開く。ファイルポインタはファイルの先頭に置き、ファイルサイズをゼロにする。ファイルが存在しない場合には作成を試みる。
w+読み込み/書き出し用でファイルを開く。ファイルポインタはファイルの先頭に置き、ファイルサイズをゼロにする。ファイルが存在しない場合には作成を試みる。
a+読み込み/書き出し用でファイルを開く。ファイルポインタはファイルの終端に置き、ファイルが存在しない場合には、作成を試みる。書き込みは、常に追記となる。
fopen()のファイルオープン時の操作モード

fopen($filename,”r+”)に変更して解決

fopen()のモードをr+として、連投対策を付けたところ、無事に正常稼働をするようになりました。

dtn_top_imgbbs.png
dtn.jpトップページの画像掲示板新着投稿表示も復旧

おわりに

画像掲示板の泉はこちらからどうぞ。

img_bbs_img.png
猫の掲示板画像も復旧