Apa Praktik Keamanan Terbaik untuk Plugin dan Tema WordPress? [Tutup]

22

Seperti yang disarankan dalam pertanyaan ini , saya menambahkan topik ini sebagai pertanyaan baru, untuk diskusi / voting komunitas mengenai praktik terbaik untuk keamanan Plugin / Tema.

Berikut adalah daftar periksa awal, berdasarkan pengaturan saya saat ini (sedang dalam proses) / daftar periksa keamanan data yang digunakan untuk meninjau Tema (prinsip-prinsip seharusnya tidak berbeda untuk Plugin daripada untuk Tema).

Jika Anda ingin memeriksa tema dengan halaman pengaturan tema yang aman dan berkode solid, periksa tema ini:
http://wordpress.org/extend/themes/coraline

Chip Bennett
sumber
Jika seseorang dengan hak yang sesuai tidak keberatan membuat ini sebagai wiki komunitas?
Chip Bennett
Untuk mendapatkan pertanyaan dalam mode wiki mod perlu memberi tag pada pertanyaan dengan tepat , saya telah menandainya untuk perhatian mod, itu hanya masalah waktu sekarang .. :)
t31os
Apa yang istimewa dari coraline? Saya masih ada cara untuk masuk. Saya sarankan untuk menghubungkan anons A insted: wordpress.stackexchange.com/questions/13539/…
kaiser
Mungkin tidak ada yang istimewa tentang Coraline. Ini hanya yang saat ini kami arahkan ke pengembang Tema, ketika meninjau Tema, karena itu adalah contoh yang diberikan oleh Justin Tadlock, yang melakukan banyak ulasan Tema keamanan khusus awal. Saya akan menawarkan Oenology juga sebagai contoh yang baik, tetapi saya tidak ingin tampil sebagai mencoba untuk menjadi mucikari Tema saya sendiri. :)
Chip Bennett

Jawaban:

12

Sanitasi, validasi, dan lepas data

Bersihkan segala sesuatu yang bisa masuk dan keluar dari (!) Basis data baik ujung depan dan ujung belakang!

Plugin dan Tema harus melakukan validasi data yang tepat:

  1. Validasi dan bersihkan semua data yang tidak dipercaya sebelum memasukkan data ke dalam basis data
  2. Keluar dari semua data yang tidak dipercaya sebelum dikeluarkan di bidang formulir pengaturan
  3. Keluar dari semua data yang tidak tepercaya sebelum ditampilkan dalam file templat Tema

Plugin dan Tema harus digunakan esc_attr()untuk input teks dan esc_html()atau esc_textarea()untuk area teks.

Juga tersedia dari API WordPress adalah esc_url(), esc_url_raw(), esc_js()dan wp_filter_kses().

Contoh buruk:

<?php $url = 'javascript:pwnd()'; ?>
<a href="<?php echo $url; ?>">anchor</a>

Contoh yang baik:

<a href="<?php echo esc_url($url); ?>">anchor</a>

Berikut adalah video hebat Mark Jaquith yang menjelaskan penggunaan fungsi pelarian:

Chris_O
sumber
3
Bersihkan di jalan masuk, keluar di jalan keluar .. :)
t31os
9

Hanya gunakan $ _GET / $ _POST / $ _REQUEST dengan hati-hati dan ketika API yang lebih baik tidak tersedia

Plugin dan Tema harus menggunakan API Pengaturan untuk mendapatkan dan menyimpan data input formulir daripada mengandalkan $_POSTdan $_REQUESTdata secara langsung.

Rarst
sumber
3
Selalu perlakukan $ _POST, $ _REQUEST, dan $ _GET sebagai tidak aman. Sanitasi dan daftar putih nilai dari array tersebut dan masukkan ke dalam variabel Anda sendiri. Jangan pernah membersihkan nilai yang datang dari pengguna dan mengembalikannya ke $ _POST.
goldenapples
2
Selalu periksa bahwa kunci yang perlu Anda gunakan diatur dalam array yang sesuai. isset () adalah teman Anda :)
mfields
9

Menggunakan $wpdb->prepare

Saat membangun kueri khusus melalui $wpdbobjek, selalu gunakan $wpdb->prepareuntuk mengisi placeholder dengan nilai alih-alih menulis kueri dengan data yang dicampur dengan kode SQL, karena mysql_*fungsi keluarga telah salah mengajari semua orang.

Matteo Riva
sumber
$wpdb->prepareadalah tidak sama dengan pernyataan siap.
hakre
8

Hati-hati dengan fungsi PHP yang mungkin digunakan untuk menjalankan kode berbahaya

Bacaan yang bagus untuk siapa pun yang menulis PHP: Fungsi PHP yang dapat dieksploitasi di StackOverflow.

Gunakan API Modifikasi Tema

Tema harus menggunakan set_theme_mod()dan fungsi terkait bukan skema nama yang ditemukan sendiri.
API theme_mod adalah lapisan khusus untuk API pengaturan; itu menjamin nama-nama unik, mendorong semua opsi menjadi satu array dan - dari pengalaman saya - jauh lebih mudah untuk ditangani. Plus, ia menawarkan filter standar untuk plugin - yang bagus untuk interoperabilitas.

Hindari diaktifkan register_globals

Jangan mengandalkan register_globals = on. Sebuah Tema Pro yang klien terakhir saya membeli tidak tepat ini. Saya bisa meretas situs mana pun menggunakan tema ini dalam 5 menit ...
ThimbThumb melakukan ini juga (dan masih?).

Jangan membuat file dengan izin akses lebar yang tidak perlu

Jangan membuat file dengan izin akses yang terlalu bebas.

Gunakan SSL jika tersedia

Arahkan Share Anda di Twitter / Facebook / Apa pun tautan ke HTTPS URI jika tersedia. Keamanan pembaca Anda juga penting.

fuxia
sumber
2
Bisakah Anda menguraikan set_theme_mod(), terutama, bagaimana menggabungkannya dengan pengaturan API?
Chip Bennett
@Chip Bennett Saya telah menambahkan beberapa informasi ke jawaban saya.
fuxia
Dapatkah Anda menguraikan daftar mini ini dalam jawaban yang lebih spesifik dan lebih kecil? Lebih mudah mengelola wiki komunitas dalam bentuk yang lebih kecil. TIA
Rarst
3
Chip: Sistem mod Tema tidak terintegrasi dengan baik dengan API Pengaturan. Saya akan menulis posting yang menjelaskan bagaimana melakukannya dengan benar dalam waktu dekat.
Otto
7

Simpan data dalam satu array

Plugin dan Tema harus menyimpan opsi dalam satu larik, daripada membuat beberapa opsi untuk halaman pengaturan. Penggunaan API Pengaturan akan menangani ini.

Chip Bennett
sumber
6

Periksa kemampuan yang sesuai saat menambah dan mengeluarkan halaman pengaturan

Plugin harus menggunakan kapabilitas yang sesuai (mis. manage_options) Untuk kapabilitas menambahkan halaman pengaturan.

Tema harus digunakan edit_theme_optionssebagai kemampuan yang sesuai untuk menambahkan halaman pengaturan.

Rarst
sumber
1
Catatan kecil tapi penting: Anda tidak dapat menggunakan edit_theme_optionsdengan pengaturan API, pengiriman opsi membutuhkan kode untuk meminta manage_optionsuntuk mengirimkan pembaruan. Tiket Trac terkait dapat ditemukan di sini .
t31os
Benar, tetapi 1) yang hanya akan berdampak pada Editor, bukan Admin; dan 2) mudah-mudahan itu akan segera diatasi, melalui tiket Trac terkait.
Chip Bennett
Selalu ada kemungkinan peran khusus atau peran reguler diberikan edit_theme_optionsbatasnya, saya pikir mungkin berguna untuk menunjukkan bahwa pengaturan API dalam kondisi saat ini hanya dapat digunakan oleh peran dengan manage_optionskemampuan.
t31os
5

Gunakan tutorial dan informasi terbaru

Plugin & Tema harus mengimplementasikan halaman Opsi dan Pengaturan dengan sengaja dan tidak bergantung pada tutorial situs web salin dan rekat yang kedaluwarsa dan tidak menyertakan keamanan data yang tepat, seperti yang tercantum di bawah ini.

Contoh apa yang tidak boleh dilakukan :

t31os
sumber
1
Saya menambahkan sedikit teks yang ditekankan untuk menunjukkan tautan adalah contoh dari apa yang tidak boleh dilakukan, karena mudah untuk membaca sekilas informasi dan mengklik tautan tanpa membaca paragraf yang mendahuluinya. Juga membuat jawabannya sedikit lebih cantik sementara aku ada di sana ...;)
t31os
2
Ini bisa menggunakan sedikit penjelasan apa yang sebenarnya contoh tutorial lakukan dengan cara yang salah dan / atau lama.
Rarst
4

Gunakan Pengaturan API

Plugin dan Tema harus menggunakan Pengaturan API, yang lebih mudah digunakan, lebih aman, dan menangani banyak kerja keras halaman pengaturan:

Untuk tutorial yang baik tentang cara menggunakan Pengaturan API, lihat:

Chip Bennett
sumber
Lihat komentar saya pada jawaban ini sehubungan dengan pengaturan API dan opsi tema.
t31os
1

Untuk kotak centang dan pilih opsi, Plugins dan Tema harus menggunakan checked()dan selected()fungsi untuk keluaran checked="checked"dan selected="selected"masing-masing.

Chip Bennett
sumber
Bukan benar-benar masalah keamanan, kecuali saya kehilangan sesuatu. Masih sangat nyaman dan bagus untuk digunakan. :)
Rarst
Yah, mungkin dan mungkin tidak. Saya telah melihat BANYAK kode kustom untuk mencapai hal yang sama. Lebih banyak kode spaghetti = lebih banyak peluang untuk memperkenalkan risiko keamanan. :)
Chip Bennett
Bennet - dari mengirim surat ke toscho beberapa hari yang lalu - saya kira saya bisa mengatakannya untuk kami berdua - fungsi paling sederhana untuk yang jauh lebih mudah dibaca & dipahami daripada fungsi-fungsi itu. Saya tidak down-, tetapi juga tidak upvotings ini. Imo ini seharusnya tidak menjadi bagian dari inti, karena tidak menambah nilai apa pun.
kaiser
2
Saya ingin tahu apa yang kalian pikirkan lebih mudah dari checked( $theme_options['whatever_option'] )atau checked( 'some_value' == $theme_options['whatever_option'] ). Saya tidak tahu bagaimana ini menjadi lebih ringkas dari itu?
Chip Bennett
1

Fungsi awalan dan nama variabel

Plugin harus mengawali semua opsi, fungsi kustom, variabel kustom, dan konstanta kustom dengan plugin-slug.

Tema harus mengawali semua opsi, fungsi khusus, variabel khusus, dan konstanta khusus dengan slug tema.

Chip Bennett
sumber
Saya akan memperluas ini ke semua nama kelas serta nama objek kustom seperti post_types dan taksonomi.
mfields
1

Gunakan wp_safe_redirect () alih-alih memanggil fungsi tajuk php () langsung ketika mengarahkan ke halaman di domain yang sama.

mfields
sumber
0

Tambahkan halaman pengaturan ke bagian admin menu yang sesuai

Plugin harus menggunakan add_options_page()fungsi untuk menambahkan Halaman Pengaturan Plugin ke Settingsmenu, daripada menggunakan add_menu_page()untuk menambahkan menu tingkat atas.

Tema harus menggunakan add_theme_page()fungsi untuk menambahkan Halaman Pengaturan Tema ke Appearancemenu, daripada menggunakan add_menu_page()untuk menambahkan menu tingkat atas.

Chip Bennett
sumber