it-swarm-vi.com

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?

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 đơn giản là tôi 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.

12
Daniel Bingham

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 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.

12
delete

Tóm lại, không. Bất kỳ yêu cầu nào được gửi tới 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ừ dữ liệu trả về sau đượ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.

6
DisgruntledGoat

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

3
theycallmemorty

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
digit1001

Tôi nghĩ rằng một phần lớn giải pháp của bạn sẽ là giới hạn tỷ lệ lưu lượng truy cập từ dấu vân tay người dùng cụ thể. Có thể băm đị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 ajax được trả về dữ liệu gần hơn có thể giúp ích. Vì vậy, trên trang được đề cập, khi tải trang, hãy gửi khóa phiên phù hợp với X phiên, đối 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 chạm X+1 ajax gọi, 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ể là một sự kiện như mousemove hoặc tap tùy thuộc vào UA) trước khi gửi phiên mới phím xuống dây (ra khỏi băng từ ajax ban đầu) sau đó khởi động lại quá trình.

Mặc dù tôi nghĩ về điều đó, 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.

0
artlung