【问题标题】:Use sql query in str_replace在 str_replace 中使用 sql 查询
【发布时间】:2019-04-01 03:56:55
【问题描述】:

我有一个获取这样的帖子标题的代码:

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


这会造成安全问题吗?

【问题讨论】:

  • 你正在尝试做的事情真的很危险:很容易被破解。请参阅我链接的“重复”,了解如何在没有安全风险的情况下使用 SQL
  • 这不是您使用 SQL 的方式。您可能需要更多帮助
  • 你正在使用哪个 mysql 驱动程序 PDO .. mysqli ?.. 你可以使用 bining 参数做你需要的事情
  • @norbert-van-nobelen 我已使用您的链接来编辑我的问题。 我的编码是否会造成安全问题?$wpdb 用于 wordpress sql 连接)

标签: php mysql sql wordpress mysqli


【解决方案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 );

...忘记手动编写查询和/或确保它们安全(在不需要时)。

【讨论】:

  • 感谢一百万 @cabrerahector 。我走错路了(当数据在另一个表中时,考虑检索是必要的);您的代码运行良好。
猜你喜欢
  • 2021-04-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-08
  • 2022-01-17
  • 2021-07-11
  • 2013-10-01
  • 1970-01-01
相关资源
最近更新 更多