Make WordPress Core

Changeset 53327


Ignore:
Timestamp:
05/02/2022 12:11:48 AM (3 years ago)
Author:
peterwilsoncc
Message:

Users: Validate WP_User_Query's fields argument.

Improve validation of WP_User_Query's fields argument when passed as an array to ensure it only accepts permitted values. This prevents the invalid values being included in the generated database query.

Expand unit tests to include passing invalid values as part of an array, the lower case value id. Correct earlier unit tests to limit database query to one result.

Follow up to [53255].

Props felipeelia.
Fixes #53177.

Location:
trunk
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/wp-includes/class-wp-user-query.php

    r53280 r53327  
    286286
    287287        if ( is_array( $qv['fields'] ) ) {
    288             $qv['fields'] = array_unique( $qv['fields'] );
     288            $qv['fields'] = array_intersect( array_unique( $qv['fields'] ), $allowed_fields );
     289
     290            if ( empty( $qv['fields'] ) ) {
     291                $qv['fields'] = array( 'ID' );
     292            }
    289293
    290294            $this->query_fields = array();
     
    294298            }
    295299            $this->query_fields = implode( ',', $this->query_fields );
     300        } elseif ( 'all' === $qv['fields'] ) {
     301            $this->query_fields = "$wpdb->users.*";
    296302        } elseif ( ! in_array( $qv['fields'], $allowed_fields, true ) ) {
    297             $this->query_fields = "$wpdb->users.*";
     303            $this->query_fields = "$wpdb->users.ID";
    298304        } else {
    299305            $field              = 'ID' === $qv['fields'] ? 'ID' : sanitize_key( $qv['fields'] );
  • trunk/tests/phpunit/tests/user/query.php

    r53255 r53327  
    19831983        $q       = new WP_User_Query(
    19841984            array(
    1985                 'fields'   => $field,
    1986                 'include ' => array( self::$admin_ids[0] ),
     1985                'fields'  => $field,
     1986                'include' => array( '1' ),
    19871987            )
    19881988        );
     
    20082008    public function data_returning_fields() {
    20092009        return array(
    2010             'all'           => array(
     2010            'all'             => array(
    20112011                'field'    => 'all',
    20122012                'expected' => array(
     
    20142014                    'user_login'          => 'admin',
    20152015                    'user_nicename'       => 'admin',
    2016                     'user_email'          => 'admin@example.org',
    2017                     'user_url'            => 'http://example.org',
     2016                    'user_email'          => WP_TESTS_EMAIL,
     2017                    'user_url'            => wp_guess_url(),
    20182018                    'user_activation_key' => '',
    20192019                    'user_status'         => '0',
     
    20212021                ),
    20222022            ),
    2023             'all_with_meta' => array(
     2023            'all_with_meta'   => array(
    20242024                'field'    => 'all_with_meta',
    20252025                'expected' => array(
     
    20272027                    'user_login'          => 'admin',
    20282028                    'user_nicename'       => 'admin',
    2029                     'user_email'          => 'admin@example.org',
    2030                     'user_url'            => 'http://example.org',
     2029                    'user_email'          => WP_TESTS_EMAIL,
     2030                    'user_url'            => wp_guess_url(),
    20312031                    'user_activation_key' => '',
    20322032                    'user_status'         => '0',
     
    20342034                ),
    20352035            ),
    2036             'ID'            => array(
     2036            'ID'              => array(
    20372037                'field'    => 'ID',
    20382038                'expected' => array(
     
    20402040                ),
    20412041            ),
    2042             'display_name'  => array(
     2042            'id'              => array(
     2043                'field'    => 'id',
     2044                'expected' => array(
     2045                    'ID' => '1',
     2046                ),
     2047            ),
     2048            'display_name'    => array(
    20432049                'field'    => 'display_name',
    20442050                'expected' => array(
     
    20462052                ),
    20472053            ),
    2048             'user_login'    => array(
     2054            'user_login'      => array(
    20492055                'field'    => 'user_login',
    20502056                'expected' => array(
     
    20522058                ),
    20532059            ),
    2054             'user_nicename' => array(
     2060            'user_nicename'   => array(
    20552061                'field'    => 'user_nicename',
    20562062                'expected' => array(
     
    20582064                ),
    20592065            ),
    2060             'user_email'    => array(
     2066            'user_email'      => array(
    20612067                'field'    => 'user_email',
    20622068                'expected' => array(
    2063                     'user_email' => 'admin@example.org',
     2069                    'user_email' => WP_TESTS_EMAIL,
    20642070                ),
    20652071            ),
    2066             'invalid_field' => array(
     2072            'invalid_field'   => array(
    20672073                'field'    => 'invalid_field',
    20682074                'expected' => array(
    20692075                    '0' => '1',
     2076                ),
     2077            ),
     2078            'valid_array'     => array(
     2079                'field'    => array( 'ID', 'display_name' ),
     2080                'expected' => array(
     2081                    'ID'           => '1',
     2082                    'display_name' => 'admin',
     2083                ),
     2084            ),
     2085            'semivalid_array' => array(
     2086                'field'    => array( 'ID', 'display_name', 'invalid_field' ),
     2087                'expected' => array(
     2088                    'ID'           => '1',
     2089                    'display_name' => 'admin',
     2090                ),
     2091            ),
     2092            'invalid_array'   => array(
     2093                'field'    => array( 'invalid_field' ),
     2094                'expected' => array(
     2095                    'ID' => '1',
    20702096                ),
    20712097            ),
Note: See TracChangeset for help on using the changeset viewer.