ワードプレスと魔法の引用


12

私はいくつかのWordpressプラグインを作成しており、WordpressがPOSTおよびGETデータに魔法の引用符を付けることに問題を抱えています。

具体的には、wp-settings.phpで(おそらくすべての応答で)呼び出される\ wp-includes \ load.phpの「wp_magic_quotes」関数。この関数は、PHP設定でマジッククオートをオフにした場合でも、データにマジッククオートを追加します。

/**
 * Add magic quotes to $_GET, $_POST, $_COOKIE, and $_SERVER.
 *
 * Also forces $_REQUEST to be $_GET + $_POST. If $_SERVER, $_COOKIE,
 * or $_ENV are needed, use those superglobals directly.
 *
 * @access private
 * @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 );
}

wp-settings.phpのwp_magic_quotes()呼び出しをコメント化するだけで安全ですか?つまり、通常のWordpressコードに悪影響を及ぼしたり、悪用ベクトルを開いたりしますか?もしそうなら、WPコードを変更する以外にそれを行う他の方法はありますか(更新があるたびにこれに対処する必要はありません)?


誰がどこで/いつ関数wp_magic_quotes()が実行されるか教えてもらえますか?wp-coreで実行を見つけることができませんでした。
T.Todua 2018


この問題は、8年以上経過した2019年にも存在します(例:PHP 7.1.33(2019-10-23)およびWordPress 5.2.4(2019-10-14))。
Peter Mortensen

回答:


8

単純にWPターンが不確定な状況(サーバーの構成でマジッククオートが有効になっているかどうかに関係なく)を確定します(マジッククオートは常に存在し、サーバーの構成は重要ではありません)。

すべてのWPコアでこれをいじるのではなく、必要に応じて、コード内のスラッシュを独自の変数から削除するほうがはるかに理にかなっています。


7
もしそうなら、これは非常識です。マジッククオートは正気なコーダーによって悪いと考えられており、これはWordpressによる本当に無責任な選択です。びっくりするわけではありません。
o0 '。

5
@Lohorisは、WPが今ここに存在するだけではないことに注意してください。それは何年にもわたって存在しています。マジッククオートが本質的に悪いアイデアだった場合、そもそも存在しなかったでしょう。時代は変わり、ではそれがいかに悪い考えであるかを叫ぶのは簡単ですが、コードベースの既存の動作を変更すると、大規模なセキュリティと下位互換性の影響が伴います。
Rarst、

3

WordPressの現在の動作は、すべてのPHPシステムと構成の互換性に基づくベストプラクティスです。WordPressは常に$ _GET、$ _ POST、$ _ COOKIE、および$ _SERVERをスラッシュ化するように正規化しており、スラッシュ化が継続されることを期待しています。

したがって、POSTまたはGETパラメータを抽出するには、次のように記述する必要があります。

$value = stripslashes_deep($_POST['name']); または

$value = stripslashes_deep($_GET['name']);


0

Stack Overflowの同様の質問で、これらのスーパーグローバル配列を処理するためのソリューションを書きました。

これは、スーパーグローバルごとに1つの「アクセサメソッド」(get / set)を記述し、スラッシングとストリッピングを透過的に行うことで構成されます。たとえば、次のように使用します。

echo _get('username');    // echo stripslashes_deep($_GET['username']);
_cookie('name', 'value'); // $_COOKIE['name'] = addslashes_deep('value');

このようにして、スーパーグローバルをさらにいじることを控え、副作用なしにコードに対して「ローカル」で機能するソリューションを楽しむことができます。私にとって、それは究極の解決策でした。


-3

最近この問題が発生し、ようやく解決しました。私は基本的にWordPressのマジッククオートでほぼすべてのWebサイトを検索していましたが、どれも役に立ちませんでした。

これはそれを修正する方法です:

  1. wp-settings.phpに移動します

  2. wp_magic_quotes();を検索します

  3. コメントアウトするだけで動作するはずです

これが機能するのは、そのコードの前を見ると、次のように見えるからです。

// Disable magic quotes at runtime. Magic quotes are added using wpdb later in //wp-settings.php.

@ini_set( 'magic_quotes_runtime', 0 );
@ini_set( 'magic_quotes_sybase',  0 );

wpdbを使用して後で追加されるMagicの引用は、ほとんどの人を台無しにしているものであり、たまたまwp_magic_quotes()です。コメントアウトするだけで、魔法の引用があなたを台無しにするのを防ぎます。


6
悪い考え:次のアップグレード後、この変更は失われます。
fuxia

これは悪いアイデアですが、コンテンツを保存するときにMagentoの問題を発生させることなくWordPressとMagentoを同時に実行できる唯一のソリューションです。
forsvunnet 2015

1
多くのプラグインは正しく記述されておらず、SQLを正しくエスケープしないため、サイトがSQLインジェクション攻撃に対して脆弱になる可能性があるため、これも悪い考えです。また、$ _ GET / $ _ POSTでstripslashes / stripslashes_deepを実行してプラグインを正しく実行すると、バックスラッシュが削除されてユーザー入力が破損します。
tomdxw
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.