$wpdb->update 或 $wpdb->insert 导致在引号前添加斜杠

Posted

技术标签:

【中文标题】$wpdb->update 或 $wpdb->insert 导致在引号前添加斜杠【英文标题】:$wpdb->update or $wpdb->insert results in slashes being added in front of quotes 【发布时间】:2011-11-12 14:31:52 【问题描述】:

这个问题已经在各个地方提出了几次,但我还没有找到一个明确而明确的答案。大多数解决方案都涉及到人们说要禁用 php.ini 文件上的 Magic Quotes(我这样做了)或修改核心 WP 文件。

无论如何,问题是这样的:为什么每次我使用 $wpdb->insert 或 $wpdb->update 时都会在任何单引号之前添加一个斜杠。比如:

我吃过草莓变成我吃过草莓

这是我使用的示例代码:

$id = $_POST['id'];
$title = $_POST['title'];
$message = $_POST['message'];

$wpdb->update('table_name', array('id'=>$id, 'title'=>$title, 'message'=>$message), array('id'=>$id))

同样的问题在这里:Wordpress Database Output - Remove SQL Injection Escapes 但除了“禁用魔术引号”之外从未解决过

【问题讨论】:

你确定你禁用了魔术引号吗?你检查过phpinfo() 是的,这是 phpinfo 的摘录 --> magic_quotes_gpc Off Off magic_quotes_runtime Off Off magic_quotes_sybase Off Off update() 调用中的那些额外/缺失的引号是拼写错误还是实际上在您的代码中? @phil 正在添加额外的引号,这里没有错别字。看一下草莓的例子,看看它做了什么。这与 wpdb->insert 和 wpdb->update 实际上在前面放一个斜杠有关,但我不知道如何禁用它 @fewpeople 也许你误解了。您问题中的最后一行代码是一堆放错位置的单引号。那是它实际上的样子吗?另外,您在哪里看到添加的斜线(即,在 echo'd 标记、phpMyAdmin、mysql 控制台等中)? 【参考方案1】:

花了一天的时间,答案如下:

Wordpress 在 $_POST 声明处转义,而不是在实际插入处,这很奇怪。

$id = stripslashes_deep($_POST['id']); //added stripslashes_deep which removes WP escaping.
$title = stripslashes_deep($_POST['title']);
$message = stripslashes_deep($_POST['message']);

$wpdb->update('table_name', array('id'=>$id, 'title'=>$title, 'message'=>$message), array('id'=>$id));

这样做意味着 WP 不会在任何引号前添加斜杠。

【讨论】:

救命稻草。谢谢@J李。如果不在这里,这肯定需要一些时间来调试。 也可以使用wp_unslash()整个$_POST数组【参考方案2】:

更多信息——WordPress 决定通过添加“魔术引号”让人们觉得他们快疯了,即使您从 3.0 版开始就已将其关闭。对 $_REQUEST、$_GET、$_POST、$_COOKIE 或 $_SERVER 的任何访问都会受到影响。见wp-includes/load.php

 /* Add magic quotes to $_GET, $_POST, $_COOKIE, and $_SERVER.
 * @since 3.0.0
 */
function wp_magic_quotes() 
        // If already slashed, strip.
        if ( get_magic_quotes_gpc() ) 
                $_GET    = stripslashes_deep( $_GET    );
                $_POST   = stripslashes_deep( $_POST   );
                $_COOKIE = stripslashes_deep( $_COOKIE );
        

        // Escape with wpdb.
        $_GET    = add_magic_quotes( $_GET    );
        $_POST   = add_magic_quotes( $_POST   );
        $_COOKIE = add_magic_quotes( $_COOKIE );
        $_SERVER = add_magic_quotes( $_SERVER );

        // Force REQUEST to be GET + POST.
        $_REQUEST = array_merge( $_GET, $_POST );

【讨论】:

【参考方案3】:

WordPress 忽略内置的 php 魔术引号设置和值 get_magic_quotes_gpc() 并且将始终添加魔术引号(即使在 该功能在 5.4 中从 PHP 中删除)。

你可以改用这个

//replace $_POST with $POST
$POST      = array_map( 'stripslashes_deep', $_POST);
$wpdb->insert( 
        'wp_mytable', 
        array( 
            'field_name'        => $POST['field_name'], 
            'type'              => $POST['type'],
            'values'            => serialize($POST['values']),
            'unanswered_link'   => $POST['unanswered_link'], 
        ), 
        array( 
            '%s','%s','%s','%s'
        ) 
    );

WordPress 这样做是因为有太多的核心和插件代码 依靠那里的引号,所以禁用超级引号 全局变量(正如“基本示例”和“良好编码”中所做的那样 上面的实践”示例)可能会导致安全漏洞。

http://codex.wordpress.org/Function_Reference/stripslashes_deep

【讨论】:

有趣的是,您还可以替换整个 $_POST 变量本身(而不是创建不带下划线的新变量)。不知道这是多么可取...

以上是关于$wpdb->update 或 $wpdb->insert 导致在引号前添加斜杠的主要内容,如果未能解决你的问题,请参考以下文章

从 wordpress $wpdb 获取最后插入的 id

Wordpress:wpdb->插入与 wpdb->prepare(wpdb->query("INSERT

Wordpress - $wpdb->插入 - MySQL NOW()

$wpdb->插入不工作。没有错误信息

哪个是 wordpress 插件最好的 mysql 或 mysqli 或 $wpdb

wpdb 查询返回错误结果