画像掲示板の新着表示が壊れる
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($filename,”r+”)に変更して解決
fopen()のモードをr+として、連投対策を付けたところ、無事に正常稼働をするようになりました。
おわりに
画像掲示板の泉はこちらからどうぞ。