Saya telah melihat berkali-kali orang mengatakan untuk tidak menggunakan filter PHP / PHP khusus (dari UI Drupal) di blok, node, views-args, aturan, dll. Saya telah mencari-cari sedikit dan belum menemukan banyak, sepertinya ini adalah praktik terbaik Drupal yang semuanya "hanya tahu".
Saya mengerti ini menimbulkan risiko keamanan potensial terutama di tangan pengguna akhir atau orang yang baru mengenal Drupal atau PHP, tetapi sebagai pengembang / pembangun situs apa alasan sebenarnya untuk tidak menggunakan PHP khusus dari UI Drupal?
Jawaban:
Beberapa alasan:
Mungkin ada lebih banyak alasan, tetapi itu sudah cukup :)
sumber
require_once $_SERVER['DOCUMENT_ROOT'].'/sites/all/themes/myTheme/php/stuff.php';
dan menulis sisa kode di editor IDE / teks Anda. Terkadang ini bukan pekerjaan mudah atau akan membutuhkan waktu yang sangat lama untuk membuat modul sendiri bahkan sebagai pengembang PHP yang baik. Satu contoh singkat: Tindakan Bersyarat Ubercart. Tapi memang benar itu bukan hal yang baik untuk menyimpan kode kita di db.Kode ini sulit di-debug dan dipelihara. Saya tidak tahu cara menggunakan kontrol versi untuk kode php semacam itu.
Dan itu benar-benar risiko keamanan potensial bagi orang yang baru mengenal Drupal atau PHP,
sumber
Mempertimbangkan kasus filter PHP yang digunakan dalam sebuah simpul, alasan untuk tidak menggunakannya adalah karena Anda membatasi pengguna yang dapat mengedit simpul itu, jika Anda tidak ingin mengizinkan semua pengguna untuk menggunakan filter PHP.
Daripada menggunakan filter PHP, lebih baik menggunakan modul khusus yang menggantikan teks tertentu dalam konten node dengan hasil dari kode yang dieksekusi (tanpa menggunakan
eval()
), atau yang menambahkan teksnya sendiri ke isi tubuh dari node. Dalam hal ini, setiap pengguna dapat mengedit simpul, tanpa memiliki izin untuk menambahkan kode PHP sewenang-wenang yang kemudian dijalankan oleh filter PHP.Secara umum, lebih baik untuk menghindari
eval()
karena mengurangi keterbacaan kode, kemampuan bagi Anda untuk memprediksi jalur kode (dan kemungkinan implikasi keamanan itu) sebelum runtime, dan karenanya kemampuan untuk men-debug kode.Terpisah dalam pengembangan atau situs uji, saya tidak akan mengaktifkan filter PHP, atau menggunakan kode PHP yang diteruskan ke
eval()
.Filter PHP telah dihapus dari Drupal 8. Sekarang modul pihak ketiga , tidak tercakup dalam kebijakan penasihat keamanan . Ini mungkin alasan lebih untuk tidak menggunakannya di server produksi (jika alasan yang sudah diberikan tidak meyakinkan Anda).
sumber
Sebagai solusi untuk berbagai masalah yang ditentukan di atas - kesulitan pemeliharaan kode, kontrol versi, penemuan kesalahan, Anda memiliki kemungkinan "klugey" ini:
Buat fungsi (beri nama dengan hati-hati, sesuai dengan fungsinya) di beberapa file yang selalu disertakan - jika Anda memiliki modul khusus yang Anda tulis untuk situs tersebut, itu adalah tempat yang tepat untuk meletakkan fungsi-fungsi ini. Php yang Anda masukkan hanyalah:
return my_specialfunc($somevar);
- di$somevar
sini berpotensi menjadi objek simpul yang dikerjakan, atau variabel apa pun lainnya yang relevan di sini.Saya menemukan bahwa saya biasanya masih menginginkan fleksibilitas, di beberapa tempat, untuk memanggil kode saya sendiri. Dalam menggunakan teknik ini, memelihara kode itu mudah karena itu hanya masalah memodifikasi fungsi dalam file. Bercak kesalahan mudah karena fungsinya akan muncul di backtrace.
Perhatikan, bagaimanapun, bahwa ini tidak menyelesaikan masalah keamanan potensial. Ini sebagian besar tergantung pada keamanan inti Drupal. Secara umum, kode yang berisi basis data seringkali menjadi kelemahan keamanan - fungsionalitas yang menggunakan kode yang berisi basis data cenderung jauh lebih rentan terhadap eksploitasi, dan keamanan di sekitarnya harus ekstra ketat. Namun, Drupal secara umum cukup baik dalam menjaga keamanan untuk masalah ini - mereka telah muncul dan kemudian dengan cepat ditambal / diselesaikan dengan rilis baru.
sumber
Berikut adalah alasan kerentanan keamanan untuk menghindari memberikan izin ini kepada pengguna Anda jika Anda tidak ingin pengguna non-admin Anda memodifikasi db secara langsung.
Meretas kredensial Drupal db
sumber
Daripada melakukan sesuatu seperti
return functionname($object)
itu, akan lebih baik menggunakan sistem token / filter sejauh mungkin. Ada modul-modul seperti Insert View dan Embed Node yang dapat membantu dengan keadaan umum di mana orang ingin menanamkan PHP dalam simpul atau blok badan.sumber
Anda harus peduli tentang portabilitas data Anda. Bagaimana jika Anda memigrasi node Anda dari drupal 7 ke drupal 8 dan teks tubuh beberapa node ada
<?php whatever_function_that_does_not_exist_anymore(); ?>
di dalamnya?Jangan memikirkan proyek Anda dalam 5 bulan tetapi dalam 5 tahun. Pembaruan, praktik yang baik, dan mudah dibawa adalah aspek penting dari setiap proyek TI yang baik menurut saya.
Menggunakan modul yang kurang berkontribusi mungkin juga merupakan salah satu aspek dari ini.
sumber