Làm cách nào để cho phép truy cập trực tiếp vào tệp .php tùy chỉnh của tôi trong Mô-đun Joomla được sử dụng từ AJAX?


8

Đây là lần đầu tiên của tôi trong PHP và lần đầu tiên của tôi với Joomla. Tôi đến từ một nền tảng C # / .Net không phải là Web nặng.

Tôi đã viết một mô-đun Joomla tùy chỉnh tương tác với Dịch vụ web của bên thứ ba thông qua nuSoap.

Tất cả đều hoạt động tốt nếu tôi chỉ chạy các tệp .php trong môi trường PHP không phải Joomla của riêng tôi trong máy dev của tôi.

Tuy nhiên, nếu tôi hiểu chính xác, Joomla chặn tất cả các yêu cầu đối với mọi thứ ngoại trừ index.php, điều này có đúng không?

Làm cách nào để cho phép tôi truy cập trực tiếp vào tệp .php của riêng tôi?

đây là một ví dụ về cách tôi yêu cầu nó từ javascript phía máy khách bằng jQuery:

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

MyFile.php hiện đang nằm ở đâu /htdocs/modules/mod_mymodule/MyFile.php

Tôi biết rằng việc cho phép các yêu cầu trực tiếp đến tệp này có thể gây ra rủi ro bảo mật, tuy nhiên tôi cần phải chạy ASAP này và tôi sẽ giải quyết các vấn đề bảo mật vào lúc sau.


Hãy thử thay đổi mã của bạn thànhurl: '/modules/mod_mymodule/MyFile.php',
TryHarder

Câu trả lời:


5

Thông thường, điều duy nhất ngăn truy cập trực tiếp vào tệp j Joomla là một dòng ở đầu tệp:

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

Nếu điều đó chưa ở đầu tệp, thì bạn sẽ không gặp khó khăn gì khi chỉ truy cập tệp trực tiếp.

Chuyển hướng tệp htaccess đã có điều kiện để không chuyển hướng nếu tệp hoặc thư mục tồn tại:

# 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

Nếu không, bạn sẽ không thể tải bất kỳ tệp javascript hoặc css nào!

Vì vậy, thực sự tất cả những gì bạn thực sự cần làm là xóa dòng đó khỏi đầu tệp và bạn sẽ có thể truy cập tệp trực tiếp.

Điều lớn nhất cần lưu ý là sẽ không có lớp Joomla nào được tải, vì vậy bạn phải chạy tệp này dưới dạng tệp độc lập (mà bạn đang làm.)

Theo như tôi biết, sẽ không có rủi ro bảo mật cố hữu khi truy cập trực tiếp vào tệp php, miễn là đó là hành vi dự định. Vì phần lớn các tệp trong Joomla cho rằng chúng sẽ không được truy cập trực tiếp, nên tốt nhất là chặn truy cập trực tiếp đó. Trong trường hợp của bạn, bạn dự định mã đó sẽ được truy cập trực tiếp, do đó không có rủi ro cố hữu. Bạn có thể gặp rủi ro bảo mật khác bằng cách chấp nhận dữ liệu POST và không lọc đúng hoặc tương tự (sẽ dễ dàng hơn nếu bạn để Joomla làm điều đó cho bạn), nhưng điều đó không liên quan đến việc tệp có được truy cập trực tiếp hay không.


Cảm ơn câu trả lời của bạn. Tôi e rằng giải pháp của tôi sẽ không hoạt động trong trường hợp đó, vì tôi sẽ cần tích hợp các tính năng người dùng của Joomla và tải dữ liệu cụ thể khác của Joomla. Tôi đã đọc về com_ajaxnhưng vì tôi hoàn toàn mới đối với Joomla (và PHP hoàn toàn), tôi muốn có một lối thoát nhanh chóng mà không cần phải thực hiện các công cụ bổ sung. Bây giờ bạn đề cập rằng none of the Joomla classes will be loadedtôi nhận ra rằng đó không phải là một giải pháp thích hợp cho vấn đề của tôi. Trừ khi có cách tự "tải" khung công tác Joomla theo yêu cầu từ tệp .php độc lập của riêng tôi?
Federico Berasargetui


Tuyệt quá! cảm ơn! điều này sẽ cho phép tôi, ví dụ, lấy lại hồ sơ người dùng đã đăng nhập hiện tại?
Federico Berasargetui

2
Bất kỳ cuộc gọi Joomla nào cũng nên hoạt động. Vì vậy, $user = JFactory::getUser()nên làm việc để có được thông tin người dùng hiện tại.
David Fritsch

4

Một giải pháp thay thế,

Nếu bạn được phát triển mô-đun theo cấu trúc Joomla thích hợp thì thay vì đưa khung Core Joomla vào tệp mô-đun, bạn có thể sử dụng com_ajaxđể thực hiện ajaxcuộc gọi đến mô-đun hoặc plugin.

Nếu bạn đang làm việc với các dịch vụ Web và có kế hoạch sử dụng nó trong nhiều trang web thì đơn giản sẽ tạo ra một mô-đun / Plugin Joomla và có thể được thực hiện thông qua ajax và việc cài đặt mô-đun / plugin này khá đơn giản như bất kỳ tiện ích mở rộng j Joomla nào khác.

Một tài liệu chi tiết có thể được tìm thấy ở đây , Ngoài ra nếu bạn đang sử dụng phiên bản cũ hơn của Joomla thì có một thành phần có sẵn để đạt được giao diện Ajax. .

Tính năng Ajax này được tích hợp sẵn với phiên bản J3.2 trở lên vì vậy phiên bản dưới đây nên sử dụng các thành phần này.

Hy vọng nó có ý nghĩa!

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.