web-dev-qa-db-fra.com

Les requêtes de base de données créées à l'aide de filtres WordPress sont-elles protégées contre l'injection SQL?

J'utilise le filtre 'posts_where' de WordPress ( https://codex.wordpress.org/Plugin_API/Filter_Reference/posts_where ) pour modifier mes requêtes en tant que au dessous de:

        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');

Donc, une requête est en cours d'exécution, et j'intercepte la clause where et ajoute une condition supplémentaire. Ce code serait-il sujet à l'injection SQL?

2
gray

Non! WordPress ne ( ne protégera pas contre l'injection SQL dans ce cas. Vous devez le faire vous-même, en utilisant $wpdb->esc_like et $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
    );
}
4
TheDeadMedic