$ wpdb-> update或$ wpdb->在引号前添加斜杠的结果

时间:2011-09-08 00:29:11

标签: php mysql wordpress

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

无论如何,问题是:为什么每次我使用$ wpdb-> insert或$ wpdb->更新斜杠都会在任何单引号之前添加。例如:

  

我吃过草莓变得我吃了草莓

以下是我使用的示例代码:

$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但除了“禁用魔法引号”之外它从未得到解决

3 个答案:

答案 0 :(得分:48)

在这一天过后,答案如下:

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不会在任何引号之前添加斜杠。

答案 1 :(得分:6)

更多信息 - 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 );
}

答案 2 :(得分: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