Make WordPress Core

Changeset 41479 for branches/4.0


Ignore:
Timestamp:
09/19/2017 03:02:25 PM (8 years ago)
Author:
aaroncampbell
Message:

Database: Hardening for wpdb::prepare()

Previously if you passed an array of values for placeholders, additional values could be passed as well. Now additional values will be ignored.

Merges [41470] to 4.0 branch.

Location:
branches/4.0
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • branches/4.0

  • branches/4.0/src/wp-includes/wp-db.php

    r33994 r41479  
    12081208        $args = func_get_args();
    12091209        array_shift( $args );
     1210
    12101211        // If args were passed as an array (as in vsprintf), move them up
    1211         if ( isset( $args[0] ) && is_array($args[0]) )
     1212        if ( is_array( $args[0] ) && count( $args ) == 1 ) {
    12121213            $args = $args[0];
     1214        }
     1215
     1216        foreach ( $args as $arg ) {
     1217            if ( ! is_scalar( $arg ) ) {
     1218                _doing_it_wrong( 'wpdb::prepare', sprintf( 'Unsupported value type (%s).', gettype( $arg ) ), '4.0.19' );
     1219            }
     1220        }
     1221
    12131222        $query = str_replace( "'%s'", '%s', $query ); // in case someone mistakenly already singlequoted it
    12141223        $query = str_replace( '"%s"', '%s', $query ); // doublequote unquoting
  • branches/4.0/tests/phpunit/tests/db.php

    r33994 r41479  
    354354    }
    355355
     356    function test_prepare_sprintf() {
     357        global $wpdb;
     358
     359        $prepared = $wpdb->prepare( "SELECT * FROM $wpdb->users WHERE id = %d AND user_login = %s", 1, "admin" );
     360        $this->assertEquals( "SELECT * FROM $wpdb->users WHERE id = 1 AND user_login = 'admin'", $prepared );
     361    }
     362
     363    /**
     364     * @expectedIncorrectUsage wpdb::prepare
     365     */
     366    function test_prepare_sprintf_invalid_args() {
     367        global $wpdb;
     368
     369        $prepared = @$wpdb->prepare( "SELECT * FROM $wpdb->users WHERE id = %d AND user_login = %s", 1, array( "admin" ) );
     370        $this->assertEquals( "SELECT * FROM $wpdb->users WHERE id = 1 AND user_login = ''", $prepared );
     371
     372        $prepared = @$wpdb->prepare( "SELECT * FROM $wpdb->users WHERE id = %d AND user_login = %s", array( 1 ), "admin" );
     373        $this->assertEquals( "SELECT * FROM $wpdb->users WHERE id = 0 AND user_login = 'admin'", $prepared );
     374    }
     375
     376        function test_prepare_vsprintf() {
     377                global $wpdb;
     378
     379        $prepared = $wpdb->prepare( "SELECT * FROM $wpdb->users WHERE id = %d AND user_login = %s", array( 1, "admin" ) );
     380        $this->assertEquals( "SELECT * FROM $wpdb->users WHERE id = 1 AND user_login = 'admin'", $prepared );
     381    }
     382
     383    /**
     384     * @expectedIncorrectUsage wpdb::prepare
     385     */
     386    function test_prepare_vsprintf_invalid_args() {
     387        global $wpdb;
     388
     389        $prepared = @$wpdb->prepare( "SELECT * FROM $wpdb->users WHERE id = %d AND user_login = %s", array( 1, array( "admin" ) ) );
     390        $this->assertEquals( "SELECT * FROM $wpdb->users WHERE id = 1 AND user_login = ''", $prepared );
     391
     392        $prepared = @$wpdb->prepare( "SELECT * FROM $wpdb->users WHERE id = %d AND user_login = %s", array( array( 1 ), "admin" ) );
     393        $this->assertEquals( "SELECT * FROM $wpdb->users WHERE id = 0 AND user_login = 'admin'", $prepared );
     394        }
     395
    356396    function test_db_version() {
    357397        global $wpdb;
Note: See TracChangeset for help on using the changeset viewer.