昨日のnewbbの問題でも触れましたが、XOOPSでは、冗長な識別子がよく利用されています。
例えば、newbbでは以下のようなURLになります。
viewtopic.php?topic_id=3656&forum=18&post_id=48548#forumpost48548
実は、このうち、forum(フォーラム番号18)も、topic_id(トピック番号3656)も、冗長な識別子です。唯一有効な識別子は、post_id(投稿番号48548)だけです。
フォーラム番号18以外に、トピック番号3656や投稿番号48548があるわけもなく、
トピック番号3656以外に、投稿番号48548があるわけでもありません。
このような冗長な識別子は、以下の弊害をもたらします。
- URLの一意性を失う
無意味に識別子を増やすことで、識別子の順番がちがうだけのURLが級数的に増えていくことになります。
newbbはこのあたりの作りもきわめて雑で、あるリンクでは、viewmode指定が先に来たかと思えば、別のリンクでは、topic_id指定が先に来たりします。
これはSEOにとっても重大でしょう。
- 権限設定等のミスを招きやすい
まさに今回のnewbbの問題点です。
forum番号がGETで渡されようが、POSTで渡されようが、topic_idやpost_idを対象とする操作であれば、それは冗長情報です。権限がforum単位で設定してあるのなら、かならず、topic_idやpost_idから導き出したforum番号での権限を確認しなければなりません。
ではなぜ、XOOPSにおいては、このような冗長識別子を渡すモジュールが多いのでしょう?
その理由は、イベント通知機能などのXOOPSコア機能との連携のためでしょう。
その具体例として、同じ標準モジュールのmydownloadsを取り上げましょう。
mydownloadsも、singlefile.php において、冗長識別子cidを持っています。「シングルファイル」なのですから、ファイル番号lidだけが、有効な識別子であり、カテゴリー番号cidはまったくの冗長識別子です。
ところが、このサイトにログインして、以下のリンクで表示されるイベント通知オプションを見てください。
lid=65
cid=4&lid=65
両者は同じファイルを指しています。しかし、イベント通知はどうでしょう?
cid指定がある方には、このカテゴリーに関する通知オプションが表示されているのに、lid指定のみの方では、カテゴリーに関する通知オプションはありません。つまりコアのイベント通知機能は、このURLにおけるcid指定からカテゴリー番号が指定されていることを知り、そのカテゴリーについてのオプションも有効にされる、というわけです。逆にlidのみの指定でcid指定がなければ、コアのイベント通知機能はカテゴリー指定を知る術がないため、そのオプションは表示されません。だから、あえて冗長な識別子であるcidをURLに含めて出力するのです。
これは、一見うまい方法に見えますが、実は落とし穴もあります。URLのcidが本当にlidに所属している場合はそれで良いのですが、そうではないカテゴリ番号を指定していた場合でも、特に何の検証もなしに、カテゴリーに関数通知オプションが表示されます。
cid=1&lid=65
このURLで表示されるカテゴリー通知オプションをONにした場合、cid=1に対する登録となってしまうのです!
この不具合は、XOOPSのイベント通知機能の問題とも言えますが、もしあながたモジュール作者であるなら、行うべき対応はとても簡単です。
イベント通知機能などで冗長識別子が必要なケースでは、本来の識別子から冗長識別子を生成して、$_GETにセットすれば良いのです。
例えば、mydownloadsであれば、singlefile.phpの処理の最初の方で、lidからcidを生成して、
$_GET['cid'] = (lidから得られたカテゴリー番号) ;
とすれば、cidがURLに含まれていてもいなくても、イベント通知は完璧に機能します。
これに加えてもう一つだけ貴方がやらなくてはならないことは、冗長な識別子を含んだURLを生成しないようにすることです。実はこれ、とても重要なことです。
とりあえずxhnewbbにおいて、私は可能な限りその作業をしてみました。今度はあなたの番です。
irmtfan wrote:
dont think its can be possible in the latest versions of cbb
eg: cbb 3.0.4 RC2