php - MATCH AGAINST SQL 注入(inject)预防和 wpdb->prepare

标签 php mysql sql-injection wordpress

我正在尝试使用 $wpdb->prepare(); 优化来自 sql 注入(inject)的 SQL;

此查询不返回任何内容。任何人都可以明白为什么或者有一个更优雅的选择。另外是否有必要转义 MATCH AGAINST 语句中的搜索词。

$search_terms = "example search" // input post
// remove single quotes from search terms
$search_terms = str_replace("'","",$search_terms);

$sql = "SELECT
    post.ID,
    post.post_author,
    post.post_date,
    post.post_title,
    LEFT(post.post_content, 240) As post_content,
    post.post_name,
    post.post_type,
    post.comment_count,
    post.comment_status,
    MATCH (post_search.post_content,post_search.post_title) AGAINST (%s IN BOOLEAN MODE) AS score
FROM wp_posts post
LEFT JOIN wp_term_relationships term_rel
    ON post.ID = term_rel.object_id
LEFT JOIN wp_term_taxonomy term_tax
    ON term_rel.term_taxonomy_id = term_tax.term_taxonomy_id
LEFT JOIN wp_terms terms
    ON term_tax.term_id = terms.term_id
LEFT JOIN wp_posts_fulltext_search post_search 
    ON post.ID=post_search.post_id
WHERE MATCH(post_search.post_content,post_search.post_title) AGAINST (%s IN BOOLEAN MODE) && 
    post.post_status = 'publish' && 
    post.post_type = 'post' && 
    (term_tax.description != '' && 
    term_tax.description NOT LIKE '%sample%') 
GROUP BY post.ID
ORDER BY score DESC
LIMIT 0,20";

$results = $wpdb->get_results( $wpdb->prepare( $sql, $search_terms ) );

“As 分数”用于将更相关的结果返回到顶部。只是重申一下,我更关心 SQL 注入(inject)、MATCH AGAINST 和 wordpress 准备功能。

最佳答案

切勿永远使用此代码:

// remove single quotes from search terms 
$search_terms = str_replace("'","",$search_terms); 

它已损坏,因为它没有考虑 MySQL 的编码。

如果你想逃避,请使用这个:

$search_terms = mysql_real_escape_string($search_terms);

但要小心!,这只会转义值,不会转义表名称和字段名称。
如果您想操作查询中的字段或表名称,规则是:

  1. 不要这样做,因为您会遇到 SQL 注入(inject)问题。
  2. 也不要使用 PDO 来执行此操作,您仍然会遇到 SQL 注入(inject)问题。
  3. 阅读 Pekka 对我的问题的回答:How to prevent SQL injection with dynamic tablenames?

但是
不需要转义,因为您使用的是准备好的语句。

关于php - MATCH AGAINST SQL 注入(inject)预防和 wpdb->prepare,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5820447/

相关文章:

php - 专辑编码错误,简单的PHP

yii - Yii Web 应用程序中是否可能存在 SQL 注入(inject)或黑客攻击?

php - 如何验证或限制用户的直接 SQL 输入?

stored-procedures - CallableStatement 真的不受 SQL 注入(inject)的影响吗?

javascript - 如何使用提供的参数将 ajax 调用限制在范围内?

php - Magento 上无法连接到本地 MySQL 服务器错误

php - WordPress 永久链接在 godaddy 中显示 "You should update your web.config now."

mysql - 如何选择没有空记录的数据?

mysql - 在 R 中组合多个 MySQL 表的最佳方法

mysql - 在 sql 查询中应用 if 条件