在wordpress中使用stripslashes()不安全吗?

时间:2014-08-12 17:15:31

标签: wordpress security

当我创建输入

<input type="text" name="456" value="123">

并将该数据传递到另一个php站点,Wordpress会自动添加反斜杠,如:

\"my text\"

但我需要以下列方式提供文字:

"my text". 

这就是我在进一步处理数据之前使用该功能的原因:

stripslashes() 

这是否是针对黑客行为的不安全解决方案?至关重要的是要知道,因为我通过API发送密码。

3 个答案:

答案 0 :(得分:1)

应该是安全的。

根据http://fearlessflyer.com/getting-rid-of-unwanted-backslashes-in-wordpress-form-input/

  

根据PHP.net:Magic Quotes自版本5.3起已被弃用,不会成为未来版本的一部分。

请参阅:http://php.net/manual/en/security.magicquotes.disabling.php

快速回答 将其添加到您的PHP:

<?php 
if ( get_magic_quotes_gpc() ) {
    $_POST      = array_map( 'stripslashes_deep', $_POST );
    $_GET       = array_map( 'stripslashes_deep', $_GET );
    $_COOKIE    = array_map( 'stripslashes_deep', $_COOKIE );
    $_REQUEST   = array_map( 'stripslashes_deep', $_REQUEST );
}
?>

答案 1 :(得分:0)

我猜这不是WordPress,而是你的PHP安装启用了魔术引号。你应该修改你的php.ini来禁用魔术引号。魔术行情是邪恶的!

http://php.net/manual/en/security.magicquotes.disabling.php

从PHP 5.3开始,Magic Quotes已被弃用,并且已完全从PHP 5.4中删除。

<强>更新 我从来没有听说过striplashes受到损害。它是一个字符串,它将成为一个字符串,在出路时减少斜线。所以,如果你不能关闭魔术引号,那么我会使用stripslashes来删除$ _POST中的引号,等等。如果你担心其他插件受到你删除斜线的影响(虽然我会感到惊讶,然后你可以做这样的事情:

class Http {
    private $_instance;
    private $_post;
    private $_get;
    private $_cookie;
    private $_request;

    //singleton pattern to avoid parsing multiple times.
    public static function instance() {
        if( is_null($this->_instance) ) {
            $this->_instance = new self();
        }
        return $this->_instance;
    }
    private function __construct() {
        $isMagicQuotesOn    = get_magic_quotes_gpc();

        $this->_post        = $isMagicQuotesOn ? array_map( array($this,'removeMagic'), $_POST )    : $_POST;
        $this->_get         = $isMagicQuotesOn ? array_map( array($this,'removeMagic'), $_GET )     : $_GET);
        $this->_cookie      = $isMagicQuotesOn ? array_map( array($this,'removeMagic'), $_COOKIE )  : $_COOKIE;
        $this->_request     = $isMagicQuotesOn ? array_map( array($this,'removeMagic'), $_REQUEST ) : $_REQUEST;
    }
    public function removeMagic( $value ) {
        return is_array($value) ? array_map(array($this,'removeMagic'), $value) : stripslashes($value);
    }

    public function get( $var ) {
        return isset($this->_get[$var]) ? $this->_get[$var] : null;
    }
    public function post( $var ) {
        return isset($this->_post[$var]) ? $this->_post[$var] : null;
    }
    public function cookie( $var ) {
        return isset($this->_cookie[$var]) ? $this->_cookie[$var] : null;
    }
    public function request( $var ) {
        return isset($this->_request[$var]) ? $this->_request[$var] : null;
    }
}

然后,您可以访问您的vars:Http::instance()->get('myvar');。执行此操作后,您只需要在执行SQL操作,mail()标头等之前正确清理输入,这可能是进行注入的地方。对于DB,您应该使用类似mysql_real_escape_string(legacy)或Pdo :: quote()(当前)的内容。这些方法采用DB上下文并正确地清理THAT DB的数据,这比同样的东西更安全。

就个人而言,我宁愿禁用魔法引号。但是,如果你不能这样做,这种方法应该有效。

答案 2 :(得分:0)

对于将来的读者,以前的答案是直接的错误。根据{{​​3}}的评论,WordPress在内部强制执行等效的魔术引号,以确保一致的输入,向后兼容性,并保护新手以免损害WP安装。这是过去的糟糕时光的一个宿醉,当时人们很普遍地将数据直接插入数据库而无需任何清理/验证,然后仅针对他们所看到的问题而不是正确地编写骇人的解决方法。

在您的数据上使用stripslashes()stripslashes_deep()是安全的,只要您正确地将所有未转义的数据通过$wpdb->insert(),{{ 1}}等保存到数据库中。 从不取消转义(如$wpdb->prepare()之类有望被转义的超全局变量,请使用副本。人们通常希望您能逃脱现实,这就是为什么看到很多反斜杠会乱扔WP内容的原因。

这与转义html输出是完全分开的,应始终在不受信任的用户输入上完成html输出。