Ver. 3.2.20 で差し替え予約エントリーの公開時に別エントリーのバージョンを誤って公開してしまう場合がある問題が発見されました


このたびは、a-blog cms をご利用のお客様に多大なご迷惑をおかけする可能性がある不具合が判明しましたので、ご報告いたします。深くお詫び申し上げます。

現象

以下の条件の場合、差し替え予約エントリーの公開時に別エントリーのバージョンを誤って公開してしまう場合がある問題が確認されました。

差し替え予約バージョン取得処理で、予約バージョンと公開対象を結合する SQL に不備がありました。

entry_rev テーブルは主キーが (entry_id, entry_rev_id) の複合主キーで、entry_rev_idエントリーごとに振り直される連番 です(リビジョン 1 は作業領域として entry テーブル側で扱われ、entry_rev には 2 以上の値が積まれていきます)。

しかし結合条件では entry_rev_id の一致しか見ておらず、entry_id の一致条件が抜けていました。そのため 同じバージョンIDを持つ別エントリーのバージョンまで結合結果に含まれ、自動公開処理が動作する際に、予約していないエントリーの過去バージョンが意図せず即時公開されてしまう 可能性があります。

再現する条件

  • a-blog cms Ver. 3.2.20

  • 「差し替え予約中」のエントリー(= entry_reserve_rev_id が 1 以上のエントリー)が 1 件でも存在する

  • 別のエントリーに「差し替え予約中」のエントリー同じバージョンIDかつ、公開日時が現在時刻より過去のバージョンが存在する

予約公開機能を一度も利用したことがなく、現時点でも公開予約しているエントリーが存在しない環境は本不具合の影響を受けません。

対応方法

この問題が修正された、Ver. 3.2.21 がリリースされています。Ver. 3.2.20 をお使いの場合は、お手数ですがアップデートをお願いいたします

影響を受けたかの確認方法

いま発火する状態にあるかを判定する SQL

データベースに直接接続できる環境では、以下のクエリで現在発火条件を満たすリビジョンがあるかを確認できます。acms_ の部分はテーブル接頭辞に合わせて読み替えてください。

SELECT
  reserving.entry_id   AS reserving_entry_id,
  leaking.entry_id     AS leaking_entry_id,
  leaking.entry_rev_id AS leaking_revision_id,
  leaking.entry_start_datetime
FROM acms_entry AS reserving
INNER JOIN acms_entry_rev AS leaking
  ON reserving.entry_reserve_rev_id = leaking.entry_rev_id
  AND reserving.entry_id <> leaking.entry_id
WHERE reserving.entry_reserve_rev_id >= 1
  AND leaking.entry_start_datetime < NOW();

このクエリの結果に行が出てきた場合、通常の Web アクセスが発生したタイミングで leaking_entry_id のエントリーが誤って leaking_revision_id の内容に書き換わる可能性があります。修正版を適用する前にこの状態を把握しておきたい場合は、対象の予約を一旦キャンセルするなどの対処をご検討ください。

復旧手順

意図せず別バージョンに切り替わってしまったエントリーは、管理画面のバージョン管理から本来の公開バージョンに切り替え直すことで復旧できます。

  • 該当エントリーのバージョン管理を開く

  • 本来公開していたバージョンを選び、「このバージョンを公開」で現行バージョンに戻す

お問い合わせ

本件に関するご質問・ご相談は、a-blog cms のサポート窓口またはサポートフォーラムまでお寄せください。

改めまして、ご利用のお客様にはご迷惑をおかけし、誠に申し訳ありません。