Wordpress dan kutipan sihir

12

Saya telah menulis beberapa plugin Wordpress, dan saya mengalami masalah dengan Wordpress memberikan kutipan ajaib pada data POST dan GET.

Secara khusus, fungsi "wp_magic_quotes" di \ wp-include \ load.php, yang disebut (mungkin pada setiap respons) di wp-settings.php. Fungsi ini menambahkan kutipan ajaib ke data bahkan jika saya mematikan kutipan ajaib di pengaturan 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 );
}

Apakah aman bagi saya untuk hanya berkomentar panggilan wp_magic_quotes () di wp-settings.php? Yaitu, apakah akan berdampak negatif pada kode Wordpress normal dan / atau membuka beberapa vektor eksploitasi? Jika demikian, apakah ada cara lain untuk melakukannya selain memodifikasi kode WP (jadi saya tidak harus berurusan dengan ini setiap kali ada pembaruan)?

Matthew Groves
sumber
Adakah yang bisa memberitahu saya, di mana / kapan fungsi wp_magic_quotes()dijalankan? Saya tidak bisa menemukan eksekusi di wp-core.
T.Todua
Masalah ini masih ada pada 2019, lebih dari 8 tahun kemudian (misalnya dengan PHP 7.1.33 (2019-10-23) dan WordPress 5.2.4 (2019-10-14)).
Peter Mortensen

Jawaban:

8

Sederhananya WP mengubah situasi yang tidak ditentukan (tanda kutip sihir mungkin atau mungkin tidak diaktifkan dalam konfigurasi server) menjadi determinate (kutipan ajaib selalu ada dan konfigurasi server tidak masalah).

Daripada mengacaukan ini untuk semua inti WP, lebih masuk akal untuk menghapus garis miring pada kode Anda pada variabel Anda sendiri, saat Anda membutuhkannya.

Jarang
sumber
7
Ini gila, kalau boleh. Kutipan ajaib dianggap buruk oleh pembuat kode yang waras, dan ini adalah pilihan yang sangat tidak bertanggung jawab oleh Wordpress. Bukannya aku terkejut.
o0 '.
5
@ Lohoris perhatikan bahwa WP tidak hanya ada di sini dan sekarang. Itu ada rentang bertahun-tahun. Jika kutipan sihir adalah ide yang pada dasarnya buruk daripada tidak akan ada di tempat pertama. Sementara waktu berubah dan mudah untuk menjerit betapa buruknya ide itu sekarang - mengubah perilaku yang ada dalam basis kode datang dengan keamanan besar dan implikasi kompatibilitas ke belakang.
Jarang
3

Perilaku saat ini di WordPress adalah praktik terbaik berdasarkan kompatibilitas semua sistem dan konfigurasi PHP. WordPress selalu menormalkan $ _GET, $ _POST, $ _COOKIE, dan $ _SERVER untuk dipotong, dan berharap akan terus melakukannya.

Jadi, untuk mengekstrak parameter POST atau GET kita harus menulis:

$value = stripslashes_deep($_POST['name']); atau

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

Saya menulis solusi untuk berurusan dengan array superglobal ini dalam pertanyaan serupa di Stack Overflow.

Ini terdiri dari menulis satu "metode accessor" tunggal (dapatkan / set) untuk setiap superglobal, memotong dan menelanjangi secara transparan. Jadi, Anda akan menggunakan, misalnya:

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

Dengan cara ini Anda dapat menahan diri dari bermain-main lebih jauh dengan superglobals dan menikmati solusi yang akan bekerja "secara lokal" untuk kode Anda, tanpa efek samping. Bagi saya, itu adalah solusi utama.

André Chalella
sumber
-3

Baru-baru ini saya memiliki masalah ini, dan akhirnya saya menemukan jawabannya. Saya pada dasarnya mencari hampir setiap situs web tentang kutipan sihir di WordPress dan tidak ada yang membantu.

Ini cara memperbaikinya:

  1. Pergilah ke wp-settings.php Anda

  2. Cari wp_magic_quotes ();

  3. Komentari saja dan itu akan berfungsi sekarang

Ini berfungsi karena jika Anda melihat sebelum kode itu Anda akan melihat:

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

Kutipan ajaib yang ditambahkan kemudian menggunakan wpdb adalah apa yang mengacaukan kebanyakan orang, dan kebetulan itu adalah wp_magic_quotes (). Mengomentari saja akan mencegah kutipan sihir mengacaukan Anda.

Joe
sumber
6
Gagasan buruk: setelah peningkatan berikutnya, perubahan ini hilang.
fuxia
Meskipun ini adalah ide yang buruk ™, itu adalah satu-satunya solusi yang saya temukan untuk menjalankan WordPress dan Magento secara bersamaan tanpa memberikan masalah Magento saat menyimpan konten.
forsvunnet
1
Ini juga merupakan ide yang buruk karena banyak plugin yang ditulis dengan buruk dan tidak melarikan diri dari SQL dengan benar sehingga situs Anda mungkin menjadi rentan terhadap serangan injeksi SQL. Dan setiap plugin melakukan hal yang benar dengan menjalankan stripslash / stripslashes_deep di $ _GET / $ _ POST akan merusak input pengguna dengan menghapus backslash.
tomdxw