WordPress.org

Make WordPress Core


Ignore:
Timestamp:
02/14/2013 10:51:06 PM (6 years ago)
Author:
ryan
Message:

Change all core API to expect unslashed rather than slashed arguments.

The exceptions to this are update_post_meta() and add_post_meta() which are often used by plugins in POST handlers and will continue accepting slashed data for now.

Introduce wp_upate_post_meta() and wp_add_post_meta() as unslashed alternatives to update_post_meta() and add_post_meta(). These functions could become methods in WP_Post so don't use them too heavily yet.

Remove all escape() calls from wp_xmlrpc_server. Now that core expects unslashed data this is no longer needed.

Remove addslashes(), addslashes_gpc(), add_magic_quotes() calls on data being prepared for handoff to core functions that until now expected slashed data. Adding slashes in no longer necessary.

Introduce wp_unslash() and use to it remove slashes from GPCS data before using it in core API. Almost every instance of stripslashes() in core should now be wp_unslash(). In the future (a release or three) when GPCS is no longer slashed, wp_unslash() will stop stripping slashes and simply return what is passed. At this point wp_unslash() calls can be removed from core.

Introduce wp_slash() for slashing GPCS data. This will also turn into a noop once GPCS is no longer slashed. wp_slash() should almost never be used. It is mainly of use in unit tests.

Plugins should use wp_unslash() on data being passed to core API.

Plugins should no longer slash data being passed to core. So when you get_post() and then wp_insert_post() the post data from get_post() no longer needs addslashes(). Most plugins were not bothering with this. They will magically start doing the right thing. Unfortunately, those few souls who did it properly will now have to avoid calling addslashes() for 3.6 and newer.

Use wp_kses_post() and wp_kses_data(), which expect unslashed data, instead of wp_filter_post_kses() and wp_filter_kses(), which expect slashed data. Filters are no longer passed slashed data.

Remove many no longer necessary calls to $wpdb->escape() and esc_sql().

In wp_get_referer() and wp_get_original_referer(), return unslashed data.

Remove old stripslashes() calls from WP_Widget::update() handlers. These haven't been necessary since WP_Widget.

Switch several queries over to prepare().

Expect something to break.

Props alexkingorg
see #21767

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/wp-includes/class-wp-xmlrpc-server.php

    r23363 r23416  
    281281                $pmeta = get_metadata_by_mid( 'post', $meta['id'] );
    282282                if ( isset($meta['key']) ) {
    283                     $meta['key'] = stripslashes( $meta['key'] );
    284283                    if ( $meta['key'] != $pmeta->meta_key )
    285284                        continue;
    286                     $meta['value'] = stripslashes_deep( $meta['value'] );
    287285                    if ( current_user_can( 'edit_post_meta', $post_id, $meta['key'] ) )
    288286                        update_metadata_by_mid( 'post', $meta['id'], $meta['value'] );
     
    290288                    delete_metadata_by_mid( 'post', $meta['id'] );
    291289                }
    292             } elseif ( current_user_can( 'add_post_meta', $post_id, stripslashes( $meta['key'] ) ) ) {
    293                 add_post_meta( $post_id, $meta['key'], $meta['value'] );
     290            } elseif ( current_user_can( 'add_post_meta', $post_id, $meta['key'] ) ) {
     291                wp_add_post_meta( $post_id, $meta['key'], $meta['value'] );
    294292            }
    295293        }
     
    463461        }
    464462
    465         $this->escape( $args );
    466 
    467463        $username = $args[0];
    468464        $password = $args[1];
     
    956952            return $this->error;
    957953
    958         $this->escape( $args );
    959 
    960954        $blog_id        = (int) $args[0];
    961955        $username       = $args[1];
     
    12401234            return $this->error;
    12411235
    1242         $this->escape( $args );
    1243 
    12441236        $blog_id        = (int) $args[0];
    12451237        $username       = $args[1];
     
    12751267            $post['post_date_gmt'] = $this->_convert_date( $post['post_date_gmt'] );
    12761268
    1277         $this->escape( $post );
    12781269        $merged_content_struct = array_merge( $post, $content_struct );
    12791270
     
    13011292        if ( ! $this->minimum_args( $args, 4 ) )
    13021293            return $this->error;
    1303 
    1304         $this->escape( $args );
    13051294
    13061295        $blog_id    = (int) $args[0];
     
    13781367            return $this->error;
    13791368
    1380         $this->escape( $args );
    1381 
    13821369        $blog_id            = (int) $args[0];
    13831370        $username           = $args[1];
     
    14341421        if ( ! $this->minimum_args( $args, 3 ) )
    14351422            return $this->error;
    1436 
    1437         $this->escape( $args );
    14381423
    14391424        $blog_id    = (int) $args[0];
     
    15291514        if ( ! $this->minimum_args( $args, 4 ) )
    15301515            return $this->error;
    1531 
    1532         $this->escape( $args );
    15331516
    15341517        $blog_id            = (int) $args[0];
     
    16171600            return $this->error;
    16181601
    1619         $this->escape( $args );
    1620 
    16211602        $blog_id            = (int) $args[0];
    16221603        $username           = $args[1];
     
    17081689        if ( ! $this->minimum_args( $args, 5 ) )
    17091690            return $this->error;
    1710 
    1711         $this->escape( $args );
    17121691
    17131692        $blog_id            = (int) $args[0];
     
    17761755            return $this->error;
    17771756
    1778         $this->escape( $args );
    1779 
    17801757        $blog_id            = (int) $args[0];
    17811758        $username           = $args[1];
     
    18291806            return $this->error;
    18301807
    1831         $this->escape( $args );
    1832 
    18331808        $blog_id        = (int) $args[0];
    18341809        $username       = $args[1];
     
    19041879            return $this->error;
    19051880
    1906         $this->escape( $args );
    1907 
    19081881        $blog_id        = (int) $args[0];
    19091882        $username       = $args[1];
     
    19471920        if ( ! $this->minimum_args( $args, 3 ) )
    19481921            return $this->error;
    1949 
    1950         $this->escape( $args );
    19511922
    19521923        $blog_id            = (int) $args[0];
     
    20171988            return $this->error;
    20181989
    2019         $this->escape( $args );
    2020 
    20211990        $blog_id    = (int) $args[0];
    20221991        $username   = $args[1];
     
    20702039            return $this->error;
    20712040
    2072         $this->escape( $args );
    2073 
    20742041        $blog_id    = (int) $args[0];
    20752042        $username   = $args[1];
     
    21372104        if ( ! $this->minimum_args( $args, 3 ) )
    21382105            return $this->error;
    2139 
    2140         $this->escape( $args );
    21412106
    21422107        $blog_id    = (int) $args[0];
     
    21852150            return $this->error;
    21862151
    2187         $this->escape( $args );
    2188 
    21892152        $blog_id        = (int) $args[0];
    21902153        $username       = $args[1];
     
    22502213     */
    22512214    function wp_getPage($args) {
    2252         $this->escape($args);
    2253 
    22542215        $blog_id    = (int) $args[0];
    22552216        $page_id    = (int) $args[1];
     
    22932254     */
    22942255    function wp_getPages($args) {
    2295         $this->escape($args);
    2296 
    22972256        $blog_id    = (int) $args[0];
    22982257        $username   = $args[1];
     
    23372296     */
    23382297    function wp_newPage($args) {
    2339         // Items not escaped here will be escaped in newPost.
    2340         $username   = $this->escape($args[1]);
    2341         $password   = $this->escape($args[2]);
     2298        $username   = $args[1];
     2299        $password   = $args[2];
    23422300        $page       = $args[3];
    23432301        $publish    = $args[4];
     
    23642322     */
    23652323    function wp_deletePage($args) {
    2366         $this->escape($args);
    2367 
    23682324        $blog_id    = (int) $args[0];
    23692325        $username   = $args[1];
     
    24052361     */
    24062362    function wp_editPage($args) {
    2407         // Items not escaped here will be escaped in editPost.
    24082363        $blog_id    = (int) $args[0];
    2409         $page_id    = (int) $this->escape($args[1]);
    2410         $username   = $this->escape($args[2]);
    2411         $password   = $this->escape($args[3]);
     2364        $page_id    = (int) $args[1];
     2365        $username   = $args[2];
     2366        $password   = $args[3];
    24122367        $content    = $args[4];
    24132368        $publish    = $args[5];
     
    24532408    function wp_getPageList($args) {
    24542409        global $wpdb;
    2455 
    2456         $this->escape($args);
    24572410
    24582411        $blog_id                = (int) $args[0];
     
    25042457     */
    25052458    function wp_getAuthors($args) {
    2506 
    2507         $this->escape($args);
    2508 
    25092459        $blog_id    = (int) $args[0];
    25102460        $username   = $args[1];
     
    25402490     */
    25412491    function wp_getTags( $args ) {
    2542         $this->escape( $args );
    2543 
    25442492        $blog_id        = (int) $args[0];
    25452493        $username       = $args[1];
     
    25812529     */
    25822530    function wp_newCategory($args) {
    2583         $this->escape($args);
    2584 
    25852531        $blog_id                = (int) $args[0];
    25862532        $username               = $args[1];
     
    26422588     */
    26432589    function wp_deleteCategory($args) {
    2644         $this->escape($args);
    2645 
    26462590        $blog_id        = (int) $args[0];
    26472591        $username       = $args[1];
     
    26742618     */
    26752619    function wp_suggestCategories($args) {
    2676         $this->escape($args);
    2677 
    26782620        $blog_id                = (int) $args[0];
    26792621        $username               = $args[1];
     
    27112653     */
    27122654    function wp_getComment($args) {
    2713         $this->escape($args);
    2714 
    27152655        $blog_id    = (int) $args[0];
    27162656        $username   = $args[1];
     
    27522692     */
    27532693    function wp_getComments($args) {
    2754         $this->escape($args);
    2755 
    27562694        $blog_id    = (int) $args[0];
    27572695        $username   = $args[1];
     
    28122750     */
    28132751    function wp_deleteComment($args) {
    2814         $this->escape($args);
    2815 
    28162752        $blog_id    = (int) $args[0];
    28172753        $username   = $args[1];
     
    28662802     */
    28672803    function wp_editComment($args) {
    2868         $this->escape($args);
    2869 
    28702804        $blog_id    = (int) $args[0];
    28712805        $username   = $args[1];
     
    29422876    function wp_newComment($args) {
    29432877        global $wpdb;
    2944 
    2945         $this->escape($args);
    29462878
    29472879        $blog_id    = (int) $args[0];
     
    29792911
    29802912        if ( $logged_in ) {
    2981             $comment['comment_author'] = $wpdb->escape( $user->display_name );
    2982             $comment['comment_author_email'] = $wpdb->escape( $user->user_email );
    2983             $comment['comment_author_url'] = $wpdb->escape( $user->user_url );
     2913            $comment['comment_author'] = $user->display_name;
     2914            $comment['comment_author_email'] = $user->user_email;
     2915            $comment['comment_author_url'] = $user->user_url;
    29842916            $comment['user_ID'] = $user->ID;
    29852917        } else {
     
    30282960     */
    30292961    function wp_getCommentStatusList($args) {
    3030         $this->escape( $args );
    3031 
    30322962        $blog_id    = (int) $args[0];
    30332963        $username   = $args[1];
     
    30542984     */
    30552985    function wp_getCommentCount( $args ) {
    3056         $this->escape($args);
    3057 
    30582986        $blog_id    = (int) $args[0];
    30592987        $username   = $args[1];
     
    30873015     */
    30883016    function wp_getPostStatusList( $args ) {
    3089         $this->escape( $args );
    3090 
    30913017        $blog_id    = (int) $args[0];
    30923018        $username   = $args[1];
     
    31133039     */
    31143040    function wp_getPageStatusList( $args ) {
    3115         $this->escape( $args );
    3116 
    31173041        $blog_id    = (int) $args[0];
    31183042        $username   = $args[1];
     
    31393063     */
    31403064    function wp_getPageTemplates( $args ) {
    3141         $this->escape( $args );
    3142 
    31433065        $blog_id    = (int) $args[0];
    31443066        $username   = $args[1];
     
    31663088     */
    31673089    function wp_getOptions( $args ) {
    3168         $this->escape( $args );
    3169 
    31703090        $blog_id    = (int) $args[0];
    31713091        $username   = $args[1];
     
    32163136     */
    32173137    function wp_setOptions( $args ) {
    3218         $this->escape( $args );
    3219 
    32203138        $blog_id    = (int) $args[0];
    32213139        $username   = $args[1];
     
    32653183     */
    32663184    function wp_getMediaItem($args) {
    3267         $this->escape($args);
    3268 
    32693185        $blog_id        = (int) $args[0];
    32703186        $username       = $args[1];
     
    33103226     */
    33113227    function wp_getMediaLibrary($args) {
    3312         $this->escape($args);
    3313 
    33143228        $blog_id    = (int) $args[0];
    33153229        $username   = $args[1];
     
    33523266      */
    33533267    function wp_getPostFormats( $args ) {
    3354         $this->escape( $args );
    3355 
    33563268        $blog_id = (int) $args[0];
    33573269        $username = $args[1];
     
    34123324            return $this->error;
    34133325
    3414         $this->escape( $args );
    3415 
    34163326        $blog_id        = (int) $args[0];
    34173327        $username       = $args[1];
     
    34583368            return $this->error;
    34593369
    3460         $this->escape( $args );
    3461 
    34623370        $blog_id            = (int) $args[0];
    34633371        $username           = $args[1];
     
    35123420            return $this->error;
    35133421
    3514         $this->escape( $args );
    3515 
    35163422        $blog_id    = (int) $args[0];
    35173423        $username   = $args[1];
     
    35783484            return $this->error;
    35793485
    3580         $this->escape( $args );
    3581 
    35823486        $blog_id     = (int) $args[0];
    35833487        $username    = $args[1];
     
    36283532        if ( is_multisite() )
    36293533            return $this->_multisite_getUsersBlogs($args);
    3630 
    3631         $this->escape($args);
    36323534
    36333535        $username = $args[1];
     
    36923594     */
    36933595    function blogger_getUserInfo($args) {
    3694 
    3695         $this->escape($args);
    3696 
    36973596        $username = $args[1];
    36983597        $password  = $args[2];
     
    37263625     */
    37273626    function blogger_getPost($args) {
    3728 
    3729         $this->escape($args);
    3730 
    37313627        $post_ID    = (int) $args[1];
    37323628        $username = $args[2];
     
    37473643        $categories = implode(',', wp_get_post_categories($post_ID));
    37483644
    3749         $content  = '<title>'.stripslashes($post_data['post_title']).'</title>';
     3645        $content  = '<title>'.$post_data['post_title'].'</title>';
    37503646        $content .= '<category>'.$categories.'</category>';
    3751         $content .= stripslashes($post_data['post_content']);
     3647        $content .= $post_data['post_content'];
    37523648
    37533649        $struct = array(
     
    37703666     */
    37713667    function blogger_getRecentPosts($args) {
    3772 
    3773         $this->escape($args);
    3774 
    37753668        // $args[0] = appkey - ignored
    37763669        $blog_ID    = (int) $args[1]; /* though we don't use it yet */
     
    38013694            $categories = implode(',', wp_get_post_categories($entry['ID']));
    38023695
    3803             $content  = '<title>'.stripslashes($entry['post_title']).'</title>';
     3696            $content  = '<title>'.$entry['post_title'].'</title>';
    38043697            $content .= '<category>'.$categories.'</category>';
    3805             $content .= stripslashes($entry['post_content']);
     3698            $content .= $entry['post_content'];
    38063699
    38073700            $struct[] = array(
     
    38513744     */
    38523745    function blogger_newPost($args) {
    3853 
    3854         $this->escape($args);
    3855 
    38563746        $blog_ID    = (int) $args[1]; /* though we don't use it yet */
    38573747        $username = $args[2];
     
    39053795     */
    39063796    function blogger_editPost($args) {
    3907 
    3908         $this->escape($args);
    3909 
    39103797        $post_ID     = (int) $args[1];
    39113798        $username  = $args[2];
     
    39243811            return new IXR_Error(404, __('Sorry, no such post.'));
    39253812
    3926         $this->escape($actual_post);
    3927 
    39283813        if ( !current_user_can('edit_post', $post_ID) )
    39293814            return new IXR_Error(401, __('Sorry, you do not have the right to edit this post.'));
     
    39613846     */
    39623847    function blogger_deletePost($args) {
    3963         $this->escape($args);
    3964 
    39653848        $post_ID     = (int) $args[1];
    39663849        $username  = $args[2];
     
    40313914     */
    40323915    function mw_newPost($args) {
    4033         $this->escape($args);
    4034 
    4035         $blog_ID     = (int) $args[0];
    4036         $username  = $args[1];
    4037         $password   = $args[2];
     3916        $blog_ID        = (int) $args[0];
     3917        $username       = $args[1];
     3918        $password       = $args[2];
    40383919        $content_struct = $args[3];
    4039         $publish     = isset( $args[4] ) ? $args[4] : 0;
     3920        $publish        = isset( $args[4] ) ? $args[4] : 0;
    40403921
    40413922        if ( !$user = $this->login($username, $password) )
     
    43174198            }
    43184199            if (!$found)
    4319                 add_post_meta( $post_ID, 'enclosure', $encstring );
     4200                wp_add_post_meta( $post_ID, 'enclosure', $encstring );
    43204201        }
    43214202    }
     
    43514232     */
    43524233    function mw_editPost($args) {
    4353 
    4354         $this->escape($args);
    4355 
    43564234        $post_ID        = (int) $args[0];
    43574235        $username       = $args[1];
     
    43924270        }
    43934271
    4394         $this->escape($postdata);
    43954272        extract($postdata, EXTR_SKIP);
    43964273
     
    46204497     */
    46214498    function mw_getPost($args) {
    4622 
    4623         $this->escape($args);
    4624 
    46254499        $post_ID     = (int) $args[0];
    46264500        $username  = $args[1];
     
    47444618     */
    47454619    function mw_getRecentPosts($args) {
    4746 
    4747         $this->escape($args);
    4748 
    47494620        $blog_ID     = (int) $args[0];
    47504621        $username  = $args[1];
     
    48594730     */
    48604731    function mw_getCategories($args) {
    4861 
    4862         $this->escape($args);
    4863 
    48644732        $blog_ID     = (int) $args[0];
    48654733        $username  = $args[1];
     
    49084776        global $wpdb;
    49094777
    4910         $blog_ID     = (int) $args[0];
    4911         $username  = $wpdb->escape($args[1]);
    4912         $password   = $wpdb->escape($args[2]);
    4913         $data        = $args[3];
     4778        $blog_ID   = (int) $args[0];
     4779        $username  = $args[1];
     4780        $password  = $args[2];
     4781        $data      = $args[3];
    49144782
    49154783        $name = sanitize_file_name( $data['name'] );
     
    49984866     */
    49994867    function mt_getRecentPostTitles($args) {
    5000 
    5001         $this->escape($args);
    5002 
    50034868        $blog_ID     = (int) $args[0];
    50044869        $username  = $args[1];
     
    50584923     */
    50594924    function mt_getCategoryList($args) {
    5060 
    5061         $this->escape($args);
    5062 
    50634925        $blog_ID     = (int) $args[0];
    50644926        $username  = $args[1];
     
    50964958     */
    50974959    function mt_getPostCategories($args) {
    5098 
    5099         $this->escape($args);
    5100 
    51014960        $post_ID     = (int) $args[0];
    51024961        $username  = $args[1];
     
    51394998     */
    51404999    function mt_setPostCategories($args) {
    5141 
    5142         $this->escape($args);
    5143 
    51445000        $post_ID     = (int) $args[0];
    51455001        $username  = $args[1];
     
    52515107     */
    52525108    function mt_publishPost($args) {
    5253 
    5254         $this->escape($args);
    5255 
    52565109        $post_ID     = (int) $args[0];
    52575110        $username  = $args[1];
     
    52755128        $cats = wp_get_post_categories($post_ID);
    52765129        $postdata['post_category'] = $cats;
    5277         $this->escape($postdata);
    52785130
    52795131        $result = wp_update_post($postdata);
     
    52985150
    52995151        do_action('xmlrpc_call', 'pingback.ping');
    5300 
    5301         $this->escape($args);
    53025152
    53035153        $pagelinkedfrom = $args[0];
     
    54365286
    54375287        $context = '[...] ' . esc_html( $excerpt ) . ' [...]';
    5438         $pagelinkedfrom = $wpdb->escape( $pagelinkedfrom );
     5288        $pagelinkedfrom = $pagelinkedfrom;
    54395289
    54405290        $comment_post_ID = (int) $post_ID;
    54415291        $comment_author = $title;
    54425292        $comment_author_email = '';
    5443         $this->escape($comment_author);
     5293        $comment_author;
    54445294        $comment_author_url = $pagelinkedfrom;
    54455295        $comment_content = $context;
    5446         $this->escape($comment_content);
     5296        $comment_content;
    54475297        $comment_type = 'pingback';
    54485298
     
    54665316     */
    54675317    function pingback_extensions_getPingbacks($args) {
    5468 
    54695318        global $wpdb;
    54705319
    54715320        do_action('xmlrpc_call', 'pingback.extensions.getPingbacks');
    5472 
    5473         $this->escape($args);
    54745321
    54755322        $url = $args;
Note: See TracChangeset for help on using the changeset viewer.