使用WordPress筛选器创建的数据库查询是否受到SQL注入的保护?

时间:2015-04-22 作者:gray

我正在使用WordPress“posts\\u where”过滤器(https://codex.wordpress.org/Plugin_API/Filter_Reference/posts_where) 要更改我的查询,请执行以下操作:

        function filter_my_search($where=\'\'){
            global $wpdb;

        if(isset($_GET[\'q\'])) {

            $where .= \'AND (((\' . $wpdb->posts . \'.post_title LIKE "%\'.$_GET["q"].\'%") OR (\' . $wpdb->posts . \'.post_content LIKE "%\'.$_GET["q"].\'%")))\';
        }
        return $where;
    }
add_filter(\'posts_where\', \'filter_my_search\');
因此,正在运行一个查询,我截取where子句,并添加一个额外的条件。该代码是否容易受到SQL注入的影响?

1 个回复
最合适的回答,由SO网友:TheDeadMedic 整理而成

不WordPress将not 在这种情况下,防止SQL注入。您需要自己这样做,使用$wpdb->esc_like$wpdb->prepare:

if ( isset( $_GET[\'q\'] ) ) {    
    // WordPress forces magic quotes (god knows why), unslash it
    $value = wp_unslash( ( string ) $_GET[\'q\'] );

    // Escape like wildcards so that MySQL interprets them as literals
    $value = $wpdb->esc_like( $value );

    // Create our "true" like query
    $value = "%$value%";

    // Now inject it safely
    $where .= $wpdb->prepare(
        " AND ( ( $wpdb->posts.post_title LIKE %s ) OR ( $wpdb->posts.post_content LIKE %s ) )",
        $value,
        $value
    );
}

结束