我有一个用于获取帖子标题的代码,如下所示:
$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);
是否会带来安全问题?
答案 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 );
...,而不必手动编写查询和/或确保查询的安全性(不必要时)。