Skip to:
Content

BuddyPress.org


Ignore:
Timestamp:
10/08/2014 02:14:29 PM (10 years ago)
Author:
boonebgorges
Message:

Better detection for false positives in meta SQL filters.

Our wrappers for WP's _metadata() functions require some filtering of the SQL
string (to change a column name and, in the case of xprofile, to add an
'object_type' clause). Our str_replace() logic is too generous, creating the
possibility of matching quoted text, as when the meta value contains the string
'WHERE'.

This changeset modifies the filters so that quoted content is swapped out with
placeholders before we run our search-and-replace.

See #5919.
Props tometzky for feedback.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/bp-xprofile/bp-xprofile-filters.php

    r8815 r9073  
    336336    global $wpdb;
    337337
     338    $raw_q = $q;
     339
     340    /*
     341     * Replace quoted content with __QUOTE__ to avoid false positives.
     342     * This regular expression will match nested quotes.
     343     */
     344    $quoted_regex = "/'[^'\\\\]*(?:\\\\.[^'\\\\]*)*'/s";
     345    preg_match_all( $quoted_regex, $q, $quoted_matches );
     346    $q = preg_replace( $quoted_regex, '__QUOTE__', $q );
     347
    338348    // Get the first word of the command
    339349    preg_match( '/^(\S+)/', $q, $first_word_matches );
    340350
    341351    if ( empty( $first_word_matches[0] ) ) {
    342         return $q;
     352        return $raw_q;
    343353    }
    344354
     
    347357
    348358    if ( empty( $matches[0] ) || empty( $matches[1] ) ) {
    349         return $q;
     359        return $raw_q;
    350360    }
    351361
     
    416426    }
    417427
     428    // Put quoted content back into the string.
     429    if ( ! empty( $quoted_matches[0] ) ) {
     430        for ( $i = 0; $i < count( $quoted_matches[0] ); $i++ ) {
     431            $quote_pos = strpos( $q, '__QUOTE__' );
     432            $q = substr_replace( $q, $quoted_matches[0][ $i ], $quote_pos, 9 );
     433        }
     434    }
     435
    418436    return $q;
    419437}
Note: See TracChangeset for help on using the changeset viewer.