web-dev-qa-db-ja.com

$ wpdb-> updateまたは$ wpdb-> insertを実行すると、引用符の前にスラッシュが追加されます

この質問はさまざまな場所で何度か出されましたが、明確で明確な答えは見つかりませんでした。ほとんどの解決策は、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データベース出力-SQLインジェクションエスケープの削除 しかし、「マジッククオートを無効にする」以外は解決されませんでした

24
J Lee

これに一日を費やした後、答えは次のとおりです:

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は引用符の前にスラッシュを追加しません。

55
J Lee

もう少し詳しい情報-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 );
}
6

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

3
keithics