check_admin_referer でエラー。もうもうもうもう一度お試しくださいくださいください

以下の内容は嘘偽りであり本当の原因はコチラであった。
ファーイーストリサーチ社では調査を打ち切る事にした。


BuddyPress1.5.1でのお話し。

現象

BuddyPressを使っていて、以下の操作をするとエラーが起きました。

  • トピックの削除
  • 注目トピックにする
  • 投稿できないようにする
  • アバターを消す(ユーザ・グループ共)

エラー画面は以下。

もう一度お試しさせて頂いても、結果は同じ。

エラーの理由がわからない
どこで出たかもわからない
ニャンニャンニャニャーーンwwwwwニャンニャンニャニャーンwwwwwww

調べてみた

わからなかった…。検索力たったの5か。ゴミめ。
このメッセージってマイナーなの?
キャッシュを消せばいけるでとかあったけど
キャッシュ消してもダメだった。

追ってみた

とりあえずどこでエラーが出てるのか知りたかったので、
BuddyPressの奥底に潜っていきました。バディだけに。←


そしたらエラーが出ている箇所を発見。
wp-content\plugins\buddypress\bp-groups\bp-groups-screens.php

トピックを注目させる(159行目〜)

// Sticky a topic
else if ( bp_is_action_variable( 'stick', 2 ) && ( isset( $bp->is_item_admin ) || isset( $bp->is_item_mod ) ) ) {
	// Check the nonce
	check_admin_referer( 'bp_forums_stick_topic' );

	if ( !bp_forums_sticky_topic( array( 'topic_id' => $topic_id ) ) )
		bp_core_add_message( __( 'There was an error when making that topic a sticky', 'buddypress' ), 'error' );
	else
		bp_core_add_message( __( 'The topic was made sticky successfully', 'buddypress' ) );

	do_action( 'groups_stick_forum_topic', $topic_id );
	bp_core_redirect( wp_get_referer() );
}

check_admin_referer( 'bp_forums_stick_topic' );
こいつや!!! こいつがエラーを吐いてたんや!!!!!11


注目を解除させる(173行目〜)

// Un-Sticky a topic
else if ( bp_is_action_variable( 'unstick', 2 ) && ( isset( $bp->is_item_admin ) || isset( $bp->is_item_mod ) ) ) {
	// Check the nonce
	check_admin_referer( 'bp_forums_unstick_topic' );

	if ( !bp_forums_sticky_topic( array( 'topic_id' => $topic_id, 'mode' => 'unstick' ) ) )
		bp_core_add_message( __( 'There was an error when unsticking that topic', 'buddypress'), 'error' );
	else
		bp_core_add_message( __( 'The topic was unstuck successfully', 'buddypress') );

	do_action( 'groups_unstick_forum_topic', $topic_id );
	bp_core_redirect( wp_get_referer() );
}

check_admin_referer( 'bp_forums_unstick_topic' );
こいつや!!! こいつがエラーを吐いてたんや!!!!!11

他のエラー発生個所も、全部check_admin_referer関数が原因だった模様。

こいつなんなの? 動かないくせに居座るとか…。

check_admin_referer(action)って何だよ

正直WordPress始めたてのボクチンにはわからんチンであった。
でもどうやらセキュリティ上大切らしい。
正常なURLからそのアクションが実行されたかをチェックする為だそう…。

使い方は、まずアクションを許可するページに

<?php wp_nonce_field(action); ?>

と記述しておく。
そうするとハッシュが格納されたhiddenフィールドが生成される。
そいつをPOSTする事で、check_admin_referer(action)によって、
「ちゃんとwp_nonce_fieldを置いたページから実行しただろうな?」
というチェックを行う。

これを使えば管理画面からしか呼び出せないような安全なプラグインが開発できるね!

みたいなイメージ? この理解あってる?

なぜエラーが出ていたか?

対応したwp_nonce_fieldが無い。 どこにもない。なのにチェックしている。
と理解した。何故なら実際にないし、コメントアウトしたら動いたからだ。

ていうか動いたとしてもエラーが出た箇所はPOSTじゃなくアンカータグのリンクになってる。
hiddenを置いたとしてもハッシュはPOSTされないのでは無いか?
ていうかチェックいるの? グループ消すとこではこの処理入ってないよ?

わからんチン

わからんけどコメントアウトしたら動いた。
しかしログインした状態でURL直叩きしてもトピックが消せるので怖い。

  • ファーイーストリサーチ社では今後もこの件については継続調査する。たぶん

そういえばWebクリエイターボックス+では動いてるっぽくない?
と思って確認しにいこうと思ったら、







ワロタwwwwwwwwww






ワロタ………昨日登録したばかりだというのに…


コメントアウトしたところ

wp-content\plugins\buddypress\bp-groups\bp-group-screens.php

  • check_admin_referer( 'bp_forums_stick_topic' );
  • check_admin_referer( 'bp_forums_unstick_topic' );
  • check_admin_referer( 'bp_forums_close_topic' );
  • check_admin_referer( 'bp_forums_open_topic' );
  • check_admin_referer( 'bp_forums_delete_topic' );
  • check_admin_referer( 'bp_forums_delete_post' );
  • check_admin_referer( 'bp_group_avatar_delete' );

wp-content\plugins\buddypress\bp-xprofile\bp-xprofile-actions.php


以上の内容は嘘偽りであり本当の原因はコチラであった。
ファーイーストリサーチ社では調査を打ち切る事にした。