Làm cách nào tôi có thể ngăn người dùng điện gọi các chức năng ajax của mình?


12

Tôi có một trang web sử dụng các cuộc gọi ajax để thực hiện một số chức năng. Họ có webbrowser gọi lại một tập lệnh - ajax.php. Mặc dù tôi sử dụng dữ liệu bài đăng để truyền dữ liệu và giới hạn các lệnh mà tập lệnh ajax có thể gọi, nhưng thực sự không có gì ngăn người dùng giả mạo các cuộc gọi ajax để cố gắng thao túng trang web. Có một số cách để ngăn chặn người dùng giả mạo các cuộc gọi? Có cách nào để đảm bảo rằng một cuộc gọi ajax thực tế đến từ trang web của tôi chứ không phải từ một số tập lệnh hoặc trang web khác không?

Hoặc tôi chỉ đơn giản là phải kiểm tra các điều kiện biên trong tập lệnh php và ngăn người dùng giả mạo những thứ họ sẽ không được phép làm, nhưng cho phép họ giả mạo ở nơi họ sẽ được phép.


Là các cuộc gọi ajax hoàn toàn không được xác thực? Bạn có tạo phiên cho mỗi? Có mô hình để lạm dụng? Và các vấn đề thao tác cụ thể hoặc nhiều hơn số lượng tải nó thêm vào trang web?
artlung

Bạn có thể gửi chi tiết cụ thể hơn xin vui lòng? Các cuộc gọi AJAX đang làm gì? Họ đang thao túng cái gì? Vấn đề gì xảy ra nếu tập lệnh được gọi bên ngoài AJAX?
Không hài lòngGoat

Tôi không thực sự hỏi về một trường hợp cụ thể, mà là một giải pháp chung áp dụng cho nhiều trường hợp. Nếu có một giải pháp như vậy, thì dường như không có.
Daniel Bingham

Câu trả lời:


12

Tôi không nghĩ có bất kỳ cách nào để làm điều này một cách đáng tin cậy, vì bất kỳ thông tin nào bạn có thể gửi có thể bị giả mạo, tùy thuộc vào mức độ thông minh của người dùng.

Nếu bạn chỉ muốn một khối người gọi đơn giản không phải từ trang của mình, thì bạn có thể kiểm tra người giới thiệu, sử dụng cookie hoặc thêm một trường ẩn ngẫu nhiên được gửi bởi trang gọi sẽ hết hạn sau một thời gian nhất định. Nhưng những điều này rất dễ bị giả mạo nếu người dùng thực sự quyết tâm.


2
+1 .. giống như không thể ngăn mọi người lưu các bản sao cục bộ của bất cứ thứ gì mà trình duyệt của họ hiển thị. Đây là một cuộc thi để xem liệu bạn có thể khiến họ bỏ cuộc và chuyển sang một thứ khác trước khi họ tìm ra nó.
Tim Post

6

Tóm lại, không. Bất kỳ yêu cầu nào được gửi tới một URL thông qua GET hoặc POST đều có thể được thực hiện bởi bất kỳ ai sử dụng bất kỳ phần mềm nào. Trên thực tế, một yêu cầu AJAX thực sự không khác gì việc tải URL trực tiếp, ngoại trừ sau đó, dữ liệu trả về được hiển thị trong trình duyệt như một trang web.

Đây chính xác là lý do tại sao bạn phải luôn xác thực dữ liệu đã gửi trên máy chủ, cho dù bạn có thực hiện bất kỳ xác thực Javascript nào hay không.

Không rõ chính xác kịch bản phía máy chủ đang làm gì và có thể xảy ra lỗi gì, nhưng nếu người dùng có thể "thao túng trang web" bằng cách gọi tập lệnh của bạn có dữ liệu xấu thì bạn đang làm sai.

Có lẽ giải pháp tốt nhất sẽ là giới thiệu một số hình thức xác thực.


3

Vì vậy, về cơ bản bạn muốn giới hạn ajax.php chỉ đáp ứng các yêu cầu AJAX?

Tôi không phải là chuyên gia về php, nhưng có vẻ như có thể xác định xem một yêu cầu đã cho đến từ AJAX hay yêu cầu trình duyệt "thông thường" bằng cách kiểm tra giá trị của $_SERVER['HTTP_X_REQUESTED_WITH'].

Nguồn


2
điểm hay, giả sử kẻ lạm dụng không sử dụng ajax hoặc giả mạo tiêu đề HTTP đó
Adam

1

Như một người khác đã chỉ ra ... các cuộc gọi ajax chỉ là người nhận $ _GET hoặc $ _POST, vì vậy cách tiếp cận của tôi luôn là chỉ xử lý chúng như bất kỳ trang hành động nào và lọc / vệ sinh đầu vào. Ví dụ: nếu bạn có một biến thể nhỏ của những gì bạn mong đợi trong một tháng và bạn biết nó luôn ở định dạng "Tháng một, Tháng hai, Tháng ba ...", bạn có thể đặt một mảng các giá trị dự kiến ​​và lọc theo nó. Bẫy bất cứ thứ gì không khớp và tùy ý ném lại thứ gì đó như "Bzzt ... cảm ơn vì đã chơi ..."

Tôi không thể nghĩ ra một ví dụ trong đó tập lệnh Ajax của tôi sẽ cần phải an toàn hơn so với việc gửi biểu mẫu.

HTH


+1 cho "Bzzt" - trở nên thú vị hơn nhiều trong bối cảnh "Bzzt - cảm ơn vì đã chơi!" theo sau là sự mờ dần thành màu đen kèm theo lệnh cấm ba giờ được thi hành bởi một bộ cookie trên máy của người dùng (tôi chắc chắn họ sẽ nhận được tin nhắn)
danlefree

0

Tôi nghĩ rằng một phần lớn của giải pháp của bạn sẽ là tỷ lệ giới hạn lưu lượng truy cập từ dấu vân tay người dùng cụ thể. Có thể là hàm băm của địa chỉ IP, chuỗi Tác nhân người dùng và dữ liệu được gửi.

Ngoài ra, việc ràng buộc trang gọi ajax với dữ liệu được trả về ajax gần hơn có thể giúp ích. Vì vậy, trên trang đang được đề cập, khi tải trang, hãy gửi khóa phiên phù hợp với Xphiên, với mỗi yêu cầu ajax, JavaScript của bạn sẽ cần phải trả lại khóa đó hoặc ajax sẽ trả về lỗi. Khi trang của bạn đạt X+1các cuộc gọi ajax, hãy buộc người dùng thực hiện một số hành động (có thể là captcha? Thậm chí có thể giống như một sự kiện mousemovehoặc tapsự kiện tùy thuộc vào UA) trước khi gửi khóa phiên mới xuống dây (ngoài băng từ ajax ban đầu) sau đó khởi động lại quá trình.

Mặc dù tôi nghĩ về nó, có thể một phần vấn đề của bạn là xác nhận lỏng lẻo các tham số được gửi. Nếu mọi người chỉ có thể chơi với các tham số được gửi và lấy lại dữ liệu hợp lệ thì sẽ khó thực hiện hơn. Làm thế nào để làm điều đó phụ thuộc vào loại giá trị nào được gửi bởi khách hàng và loại hành động xấu mà một diễn viên xấu có thể tạo ra bằng cách gửi các giá trị xấu.

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.