2012-01-04 28 views
7

Tôi có tập lệnh jQuery sử dụng .live() để tải nội dung trang của nó.Làm cách nào để từ chối tập lệnh truy cập của người dùng trực tiếp trong URL

$('#content').load("content.php?" + id); 

Câu hỏi: Làm cách nào để từ chối người dùng truy cập tệp content.php trực tiếp qua URL?

Tôi cố gắng để đặt mã này trên đầu trang của content.php nhưng Access Denied xuất hiện trong #content div tôi

if (!empty($_SERVER['SCRIPT_FILENAME']) && 'content.php' == basename($_SERVER['SCRIPT_FILENAME'])) 
    die('Access Denied'); 

cách chính xác để đảm bảo người dùng không thể truy cập vào tập tin content.php tôi sử dụng một URL là gì?

+0

Tại sao bạn muốn từ chối quyền truy cập của họ? Nếu họ không thể truy cập trực tiếp vào tệp, thì Ajax cũng không thể truy cập tệp. –

+0

Ý của bạn là "không thể truy cập trực tiếp". Nếu người dùng có thể truy cập tài nguyên thông qua một JavaScript, anh ta cũng sẽ có thể truy cập nó bằng cách thêm URL vào thanh địa chỉ của mình? Hay bạn có nghĩa là anh ta không thể truy cập content.php mà không truyền chuỗi truy vấn thích hợp, như trong ví dụ javascript của bạn? –

Trả lời

6

Bạn có thể sử dụng một số loại băm . Ví dụ: nếu content.php có tham số id; bạn thêm một tham số bổ sung hash có chứa mã băm MD5 của "'một số chuỗi ngẫu nhiên' + id * 15". Trong content.php, bạn kiểm tra xem giá trị băm & có phù hợp với id hay không; nếu không truy cập bị từ chối.

Tính toán phải được thực hiện bằng PHP (không phải ajax) vì người dùng không được biết hàm băm algprithmus.

Với phương pháp này, người dùng có thể tra cứu mã nguồn và truy cập trang trực tiếp nhưng bạn không thể không cho phép điều đó hoàn toàn vì trình duyệt cần truy cập trang để hiển thị. Nhưng người dùng không thể truy cập các trang mà anh ta không truy cập được thông qua ajax trước đây. Bạn có thể sử dụng một số tiêu đề (HTTP_X_REQUESTED_WITH) để ngăn người dùng internet truy cập trực tiếp vào trang nhưng người dùng có kinh nghiệm sẽ thay đổi tiêu đề và truy cập vào tiêu đề đó.

+0

Nhưng trong trường hợp đó, bạn sẽ phải hiển thị URL đầy đủ trong nguồn, trong cuộc gọi AJAX của bạn. Vì vậy, người dùng có thể chỉ cần duyệt nguồn để tìm URL thích hợp để sử dụng? Theo nhận xét của tôi về câu trả lời của Fabrizio, ai sẽ thực sự bảo vệ tài nguyên đó? –

+0

Có; nhưng người dùng chỉ có thể truy cập nội dung mà anh ta đã xem ở bên cạnh. Trình duyệt cần truy cập trang; vì vậy nó có thể truy cập được. – MasterCassim

+0

Điều đó đúng, theo cách đó bạn có thể bảo vệ tài nguyên từ những người không có URL đầy đủ. Có lẽ tôi đã hiểu sai câu hỏi, nhưng khi tôi đọc nó, tôi tin rằng anh ấy yêu cầu một cách để có thể truy cập tài nguyên thông qua JavaScript, không phải bằng cách duyệt trực tiếp URL, và trong trường hợp đó điều này sẽ không giúp ích gì. Mặt khác, tôi không hiểu tại sao bạn lại muốn giới hạn như vậy. –

2

Vì bạn đang gọi điện thoại một nguồn tài nguyên thông qua ajax một giải pháp khả thi là gửi một tiêu đề cụ thể vào các yêu cầu như HTTP_X_REQUESTED_WITH và sau đó phát hiện phía máy chủ tiêu đề như vậy:

/* AJAX check */ 
if(empty($_SERVER['HTTP_X_REQUESTED_WITH']) || 
    strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) !== 'xmlhttprequest') { 

    die($content); 
} 
+4

Điều đó có thể được khai thác bằng cách gửi các tiêu đề giả. – MasterCassim

+0

Điều đó có thể ngăn người dùng "thường xuyên" truy cập trang trực tiếp, vì họ không xem nguồn và nhận ra rằng họ có thể gửi tiêu đề mong đợi. Tuy nhiên, vì người dùng "thông thường" không nhìn vào nguồn và không giám sát lưu lượng truy cập HTTP của họ, họ sẽ không biết URL được yêu cầu để bắt đầu (vì yêu cầu được thực hiện trong nền). Vậy chúng ta đang bảo vệ mình từ ai? –

0

Có nội dung nào khác trên trang chính mà bạn có thể tham chiếu từ tệp content.php để xác minh rằng bạn đang tải nó như một phần của trang chính và không phải là trang độc lập không? Bạn cũng có thể truyền một thứ gì đó thông qua một phiên từ mainpage vào trang content.php và sau đó loại bỏ nó ở cuối tải content.php.

3

Nếu bạn muốn bảo vệ việc sử dụng, bạn có thể sử dụng thuật toán khóa một lần. Yêu cầu máy chủ tạo khóa mà trang sẽ chứa trong một biến hoặc thuộc tính ở đâu đó. Sau đó, trên lệnh tải, bạn chuyển khóa tới content.php như sau:

key = $("{some selector to get the key}") 
$('#content').load("content.php?id=" + id + "key=" + key); 

Khi trang thực hiện cuộc gọi đến máy chủ bằng cách sử dụng khóa, máy chủ sẽ hết hạn làm cho nó không sử dụng được. Bằng cách này, chỉ các yêu cầu trang đang hoạt động mới có quyền truy cập vào tệp content.php của bạn.

Phương pháp này vẫn không phải là bằng chứng đạn nhưng sẽ khiến người dùng khó truy cập vào content.php hơn.

0

Nếu URL có thể truy cập được bằng yêu cầu AJAX thì có thể truy cập trực tiếp vào URL và bạn không thể làm gì nhiều với nó.Bạn có thể thử để phát hiện nếu một yêu cầu là yêu cầu với AJAX:

function isAjaxRequest() { 
    return array_key_exists('HTTP_X_REQUESTED_WITH', $_SERVER) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) === 'xmlhttprequest'; 
} 

và kiểm tra nó vào đầu của kịch bản:

if (!isAjaxRequest()) 
    die('Access Denied'); 

nhưng bạn không nên dựa vào việc kiểm tra này quá nhiều bởi vì nó khá dễ dàng để bỏ qua.

Các vấn đề liên quan