Bagaimana cara saya mengizinkan akses langsung ke file .php khusus saya di Modul Joomla untuk dikonsumsi dari AJAX?

8

Ini adalah pertama kalinya di PHP dan pertama kalinya di Joomla. Saya berasal dari latar belakang non-Web C # / .Net yang berat.

Saya telah menulis modul Joomla khusus yang berinteraksi dengan WebService pihak ketiga melalui nuSoap.

Ini semua berfungsi dengan baik jika saya hanya menjalankan file .php di lingkungan PHP non-Joomla saya sendiri di mesin dev saya.

Namun, saya jika mengerti benar, Joomla memblokir semua permintaan untuk semua kecuali index.php, apakah ini benar?

Bagaimana cara saya mengizinkan akses langsung ke file .php saya sendiri?

ini adalah contoh bagaimana saya memintanya dari javascript sisi klien menggunakan jQuery:

$.ajax({
     url: 'MyFile.php',
     type: 'POST',
     data: { ... },
     success: function(data, status) {
          ....

di mana MyFile.php saat ini berlokasi secara fisik di /htdocs/modules/mod_mymodule/MyFile.php

Saya tahu bahwa mengizinkan permintaan langsung ke file ini dapat menimbulkan risiko keamanan, namun saya harus menjalankannya secepat mungkin dan saya akan mengurus masalah keamanan di lain waktu.

Federico Berasategui
sumber
Coba ubah kode Anda menjadiurl: '/modules/mod_mymodule/MyFile.php',
TryHarder

Jawaban:

5

Biasanya satu-satunya hal yang mencegah akses langsung ke file joomla adalah baris di bagian atas file:

defined('_JEXEC') or die('Restricted access');

Jika itu belum ada di bagian atas file, maka Anda tidak akan kesulitan mengakses file secara langsung.

Redtaccess file htaccess sudah memiliki kondisi untuk tidak redirect jika file atau folder ada:

# and the requested path and file doesn't directly match a physical file
RewriteCond %{REQUEST_FILENAME} !-f
# and the requested path and file doesn't directly match a physical folder
RewriteCond %{REQUEST_FILENAME} !-d

Jika tidak, Anda tidak akan dapat memuat file javascript atau css!

Jadi sebenarnya yang perlu Anda lakukan adalah menghapus baris itu dari atas file dan Anda harus dapat mengakses file secara langsung.

Hal terbesar yang perlu diperhatikan adalah tidak ada kelas Joomla yang akan dimuat, jadi Anda harus menjalankan file ini sebagai file yang berdiri sendiri (yang sudah Anda lakukan.)

Sejauh yang saya ketahui, seharusnya tidak ada risiko keamanan yang melekat dalam mengakses file php secara langsung, selama itu adalah perilaku yang dimaksud. Karena mayoritas file di Joomla berasumsi bahwa mereka tidak akan diakses secara langsung, yang terbaik adalah memblokir akses langsung itu. Dalam kasus Anda, Anda ingin kode itu diakses secara langsung, jadi tidak ada risiko yang melekat. Anda mungkin memiliki risiko keamanan lainnya dengan menerima data POST dan tidak memfilternya dengan benar atau semacamnya (yang lebih mudah jika Anda membiarkan Joomla melakukannya untuk Anda), tetapi itu tidak terkait dengan apakah file tersebut diakses langsung atau tidak.

David Fritsch
sumber
Terima kasih atas jawaban anda. Saya khawatir solusi saya tidak akan berfungsi dalam hal itu, karena saya perlu mengintegrasikan fitur-fitur pengguna Joomla dan memuat data spesifik Joomla lainnya. Saya sudah membaca tentang com_ajaxtetapi karena saya benar-benar baru di Joomla (dan PHP sama sekali) saya ingin jalan keluar cepat yang tidak perlu menerapkan hal-hal tambahan. Sekarang Anda menyebutkan bahwa none of the Joomla classes will be loadedsaya menyadari itu bukan solusi yang tepat untuk masalah saya. Kecuali ada cara untuk "memuat" kerangka kerja Joomla secara manual berdasarkan permintaan dari file .php mandiri saya sendiri?
Federico Berasategui
Bagus! Terima kasih! akankah ini memungkinkan saya untuk, misalnya, mengambil profil pengguna yang saat ini masuk?
Federico Berasategui
2
Panggilan Joomla apa pun harusnya berfungsi. Jadi $user = JFactory::getUser()harus bekerja untuk memberi Anda informasi pengguna saat ini.
David Fritsch
4

Solusi alternatif,

Jika Anda mengembangkan modul dalam struktur Joomla yang tepat maka alih-alih menyertakan kerangka kerja Core Joomla ke file modul yang dapat Anda gunakan com_ajaxuntuk melakukan ajaxpanggilan ke modul atau plugin.

Jika Anda bekerja dengan layanan Web dan berencana untuk menggunakannya di banyak situs, begitu sederhana membuat modul / Plugin Joomla dan yang dapat diakses melalui ajax dan pemasangan modul / plugin ini cukup sederhana seperti ekstensi joomla lainnya.

Dokumentasi terperinci dapat ditemukan di sini , Juga jika Anda menggunakan versi Joomla yang lebih lama ada komponen yang tersedia untuk mencapai antarmuka Ajax. .

Fitur Ajax ini adalah built-in dengan versi J3.2 dan di atas sehingga versi di bawah ini harus menggunakan komponen ini.

Semoga ini masuk akal!

Jobin Jose
sumber