SQLiteとSiteGuard WP Pluginのエラー対策

この記事は約4分で読めます。

一応、セキュリティーの確保のためSiteGuard WP Pluginを導入している。
さくらインターネットの標準インストールでは「All In One WP Security & Firewall」が入っているようだ。何となくこちらの方が相性が良さそうな気がしたが、スタンダードプラン以上のブルジョアどもが使用しているのが腹立たしい。そんな理由で純国産のSiteGuardにしてみた。

プラグインの導入は特にトラブル無く、表向きは正常に動作しているように見えた。
ただ記事投稿をしようとWordPressのログインを試みると、途端にこんな感じのエラーログが出まくりなのである。

DELETE FROM wp_siteguard_login WHERE status <> 0 AND last_login_time < SYSDATE() – INTERVAL 1 HOUR;

なんとなく問題なく動いてはいるけど、おそらくまともに動いていない。
どこからどう見てもSQLのエラーである。原因はSQLiteで間違いない。

早速プラグインのソースを解析してみる。データベースのテーブルは
wp_siteguard_history
wp_siteguard_login
の2つができるようだ。
CREATE TABLEを確認したが、プラグインインストール時に問題なくテーブルはできていたようだ。
それぞれのテーブルにもいくつかデータが入っていた。変なデータも無く特に異常はなさそう。

ということで、原因は簡単だった。
単にMySQLとSQLiteの時間に関する方言が違うだけのようだ。
どうやらログイン時に一定時間を超えた古いデータを削除しているだけらしい。
ただ時間関連のSQL修正は3カ所必要のようだ。

Ver.1.7.7限定での修正箇所の紹介(※Ver.1.7.8も大丈夫そうでした)

[siteguard-login-lock.php] 40行目
× $wpdb->query( $wpdb->prepare( "DELETE FROM $table_name WHERE status <> %d AND last_login_time < SYSDATE() - INTERVAL 1 HOUR;", SITEGUARD_LOGIN_SUCCESS ) );
○ $wpdb->query( $wpdb->prepare( "DELETE FROM $table_name WHERE status <> %d AND last_login_time < datetime(CURRENT_TIMESTAMP,'localtime','-1 hours');", SITEGUARD_LOGIN_SUCCESS ) );
[siteguard-admin-filter.php] 61行目
× $wpdb->query( $wpdb->prepare( "DELETE FROM $table_name WHERE status = %d AND last_login_time < SYSDATE() - INTERVAL 1 DAY;", SITEGUARD_LOGIN_SUCCESS ) );
○ $wpdb->query( $wpdb->prepare( "DELETE FROM $table_name WHERE status = %d AND last_login_time < datetime(CURRENT_TIMESTAMP,'localtime','-1 days');", SITEGUARD_LOGIN_SUCCESS ) );
[siteguard-login-history.php] 84行目
× $id = $wpdb->get_var( $wpdb->prepare( "SELECT id FROM $table_name WHERE ip_address = %s AND login_name = %s AND operation = %d AND time BETWEEN %s - INTERVAL %d SECOND AND %s - INTERVAL %d SECOND; ", $ip_address, $user, $operation, $now, $less_sec, $now, $after_sec ) );
○ $id = $wpdb->get_var( $wpdb->prepare( "SELECT id FROM $table_name WHERE ip_address = %s AND login_name = %s AND operation = %d AND time BETWEEN datetime('%s','-%d seconds') AND datetime('%s','-%d seconds');", $ip_address, $user, $operation, $now, $less_sec, $now, $after_sec ) );

場所が分かってしまえばどうと言うことはない。
ただバージョンアップがある度に、PHPプログラムの修正とアップロードをしなくてはならない。超めんどくさい。。。

とりあえず、SiteGuard WP Pluginに関するエラーログは消えた。
ただ、まだまだエラーログは続く。。。

コメント