在str_replace中使用SQL查询

时间:2018-10-27 18:04:12

标签: php mysql sql wordpress mysqli

我有一个用于获取帖子标题的代码,如下所示:

$content = str_replace('%title', $post->post_title, $content );

我想使用数据库中的标题。
我写了这段代码:

        global $wpdb;
        $mycontent = $wpdb->get_var(
            'SELECT `meta_value` FROM `wp_postmeta` WHERE `post_id` = '.$post->ID.' AND `meta_key` = \'my_seo_title\';'
        );
        $content = str_replace('%my_seo_title', $mycontent , $content);


是否会带来安全问题?

1 个答案:

答案 0 :(得分:1)

  

它有安全性问题吗?

在极少数情况下,您的$post对象被替换为其他东西(此时,我认为该网站的安全性已经受到损害),攻击者可以替换$post->ID返回的值带有恶意查询字符串(也称为SQL Injection)。

为避免这种情况,正如其他所有人已经指出的那样,您应该使用$wpdb对象中的prepare()方法对查询进行转义:

$mycontent = $wpdb->get_var(
    $wpdb->prepare(
        "SELECT `meta_value` FROM `wp_postmeta` WHERE `post_id` = %d AND `meta_key` = %s;",
        array( $post->ID, 'my_seo_title' )
    )
);

出于好奇,为什么在我们已经拥有get_post_meta()函数(为您自动安全地检查整个安全性)的情况下,从数据库中手动获取元值?我的意思是,您可以将代码替换为:

$mycontent = get_post_meta( $post->ID, 'my_seo_title', true );

...,而不必手动编写查询和/或确保查询的安全性(不必要时)。