当magic_quotes_gpc设置为off时,引用被转义

时间:2011-08-09 02:16:16

标签: magento magic-quotes-gpc

magic_quotes_gpc设置为off时,Magento正在转义撇号。当我将magic_quotes_gpc设置为on时,Magento会停止插入斜杠。它完全倒退了。

我不能让Magento逃避我的撇号,但我也不希望magic_quotes_gpc设置为on,因为我担心它可能对我网站的其他部分产生的影响( vBulletin论坛,Wordpress博客等。)。

请注意 - Magento并不总是这样,只是从今天开始。

编辑:将以下代码添加到我的某个CMS页面的布局更新XML后,行为开始了:

<!--<reference name="content">
<block type="catalog/product_new" name="home.catalog.product.new" alias="product_new" template="catalog/product/new.phtml" after="cms_page"><action method="addPriceBlockType"><type>bundle</type><block>bundle/catalog_product_price</block><template>bundle/catalog/product/price.phtml</template></action></block>
<block type="reports/product_viewed" name="home.reports.product.viewed" alias="product_viewed" template="reports/home_product_viewed.phtml" after="product_new"><action method="addPriceBlockType"><type>bundle</type><block>bundle/catalog_product_price</block><template>bundle/catalog/product/price.phtml</template></action></block>
<block type="reports/product_compared" name="home.reports.product.compared" template="reports/home_product_compared.phtml" after="product_viewed"><action method="addPriceBlockType"><type>bundle</type><block>bundle/catalog_product_price</block><template>bundle/catalog/product/price.phtml</template></action></block>
</reference>
<reference name="right">
<action method="unsetChild"><alias>right.reports.product.viewed</alias></action>
<action method="unsetChild"><alias>right.reports.product.compared</alias></action>
</reference>-->

在奇怪的行为开始后,我删除了该代码,但它没有解决问题。

2 个答案:

答案 0 :(得分:4)

编辑:我发现了问题所在。事实证明,Wordpress有自己的功能来添加斜杠。从Wordpress版本3.2.1开始,您可以在/wp-includes/load.php的第530行找到函数wp_magic_quotes()

为了解决这个问题,我注释掉了函数中的所有内容(而不是函数本身,以防止调用未定义的函数)。它删除了转义引号的问题。我没有做过大量的测试,但据我所知,这可能会破坏旧的Wordpress插件,所以要小心。

它将来自:

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 );
}

到此:

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 );*/
}

答案 1 :(得分:0)

app / code / core / Mage / Core / functions.php 的顶部有这样的:

if (get_magic_quotes_gpc()) {
    function mageUndoMagicQuotes($array, $topLevel=true) {
        $newArray = array();
        foreach($array as $key => $value) {
            if (!$topLevel) {
                $newKey = stripslashes($key);
                if ($newKey!==$key) {
                    unset($array[$key]);
                }
                $key = $newKey;
            }
            $newArray[$key] = is_array($value) ? mageUndoMagicQuotes($value, false) : stripslashes($value);
        }
        return $newArray;
    }
    $_GET = mageUndoMagicQuotes($_GET);
    $_POST = mageUndoMagicQuotes($_POST);
    $_COOKIE = mageUndoMagicQuotes($_COOKIE);
    $_REQUEST = mageUndoMagicQuotes($_REQUEST);
}

只需将此文件复制到本地( app / code / local / Mage / Core / functions.php )并注释掉if语句,以便它始终运行。

// if (get_magic_quotes_gpc()) {
    function mageUndoMagicQuotes($array, $topLevel=true) {
        $newArray = array();
        foreach($array as $key => $value) {
            if (!$topLevel) {
                $newKey = stripslashes($key);
                if ($newKey!==$key) {
                    unset($array[$key]);
                }
                $key = $newKey;
            }
            $newArray[$key] = is_array($value) ? mageUndoMagicQuotes($value, false) : stripslashes($value);
        }
        return $newArray;
    }
    $_GET = mageUndoMagicQuotes($_GET);
    $_POST = mageUndoMagicQuotes($_POST);
    $_COOKIE = mageUndoMagicQuotes($_COOKIE);
    $_REQUEST = mageUndoMagicQuotes($_REQUEST);
// }

这是必需的,因为WordPress会检查魔术引号是否被禁用,如果是,它仍会运行魔术引号。关于这是否应该发生的问题有很长的讨论,但是共识是删除该功能可能会打开旧版插件中的安全漏洞或不能解决它的主题,所以不要期望WordPress很快就会删除该功能。