Tech & Tips WordPress

ACF version5.11.1のセキュリティアップデート内容を調べてみた

投稿日:

この記事は2年以上前ですので、内容が古い可能性があります

ACF version5.11.1にセキュリティアップデートが含まれる

ACFのversion5.11.1がリリースされました。
その中にはセキュリティアップデートがありました。

修正対象の脆弱性の内容としては、the_fieldget_fieldではACFでフィールド定義したフィールド以外の項目も取得できてしまうので
ACFのショートコードでフィールド定義されていない項目が取得できてしまうというということでした。

これはショートコードを記載可能なユーザーであればACFのショートコードを使用することでpostmetausermetameta_valueが取得できてしまうので
構築されているシステムによってはクリティカルな情報が出力されてしまうことが懸念されます。

その対処として、ショートコードではACFで定義されていない項目は取得できないようになりました。

この対処を行うための実装を確認し、影響範囲を考えていきたいと思います。

ACFの実装内容を確認

get_fieldの処理内で実行されるacf_get_valueという関数があります。
この関数内でセキュリティアップデートによる対応が行われていました。
以下がセキュリティアップデートによる追加されたコードです。
    // If we still don't have a proper field array, the field doesn't exist currently.
    if ( empty( $field['type'] ) && empty( $field['key'] ) ) {
        //  Get field ID & type.
        $decoded = acf_decode_post_id( $post_id );

        if ( apply_filters( 'acf/prevent_access_to_unknown_fields', false ) || ( 'option' === $decoded['type'] && 'options' !== $decoded['id'] ) ) {
            return null;
        }

        do_action( 'acf/get_invalid_field_value', $field, __FUNCTION__ );
    }
まず$field内に値が存在するかどうか確認し、存在しない場合はACFのフィールド定義が行われていないという扱いになります。

その後、filter acf/prevent_access_to_unknown_fieldsにて最終的に取得できる値がtrueの時
データベースに値は取得せず、nullが返却されます。

この部分のコードではapply_filtersの第2引数はfalseのため、nullは返さずそのまま処理を続けるように思います。

ではここでACFのショートコード側のロジックを見てみます。
function acf_shortcode( $atts ) {
        ・・・省略

    $access_already_prevented = apply_filters( 'acf/prevent_access_to_unknown_fields', false );
    $filter_applied           = false;

    if ( ! $access_already_prevented ) {
        $filter_applied = true;
        add_filter( 'acf/prevent_access_to_unknown_fields', '__return_true' );
    }
        ・・・省略
}
add_shortcode( 'acf', 'acf_shortcode' );
ショートコードを実施する時にfilter acf/prevent_access_to_unknown_fieldsに引っ掛けて必ずtrueが返却されるようになっていました。
そのため、ショートコードからACFを使用して値を取得する際にはフィールド定義されているデータしか取得できないことがわかります。

逆に、オリジナルのthemeやplugin内でget_fieldを直接記載して値を取得する場合には
今まで通り、フィールド定義されていない項目でも取得できました。
ただし、ACFの公式の見解では非推奨の使い方であり、フィールド定義されていない項目についてはget_post_meta等のWordPressが提供している関数を使用して取得することが推奨されています。
そのため、action acf/get_invalid_field_value の先で_doing_it_wrongが実行されているのでWP_DEBUGtrue の時はエラーメッセージが表示されちゃいます。

影響まとめ

もしACFのショートコードでフィールド定義されていない項目を表示していた場合、表示されなくなります。
これは冒頭に記載した通り、セキュリティ的に納得する修正だと思いました。

個人的にはフィールド定義されていない項目を作成したplugin内でget_fieldで取得する実装をした記憶が薄っすらと有り
アップデートの影響で該当箇所が動かなかったらどうしようかと思っていたのですが、一先ず動くのようなので良かったです。(ただし_doing_it_wrongが実行されるため、WP_DEBUGを要確認)
ただし、あくまで非推奨な使い方であるので見つけ次第修正は進めていこうと思います。
この記事をシェアする:
◇ ◇ ◇ ◇ ◇ ◇ ◇ ◇ ◇ ◇ ◇ ◇ ◇ ◇ ◇ ◇ ◇ ◇ ◇

私たちと一緒に働きませんか?

「ACF version5.11.1のセキュリティアップデート内容を調べてみた」はいかがでしたか?
株式会社プレスマンでは、 WordPressが大好きな方、仕事を通してさらにスキルを磨きたい方を募集しています。 まずは募集職種をご覧の上、お気軽にお問い合わせください。 あなたとお会いできるのを楽しみにしています。

採用情報を見る

-Tech & Tips, WordPress

© 2024 PRESSMAN*Tech Powered by STINGER