2010-10-06 36 views
9

Tôi có một tập lệnh sử dụng JSONP để thực hiện các cuộc gọi ajax tên miền chéo. Điều này làm việc tuyệt vời nhưng câu hỏi của tôi là, có cách nào để ngăn các trang web khác truy cập và nhận dữ liệu từ các URL này không? Về cơ bản, tôi muốn tạo danh sách các trang web được phép và chỉ trả lại dữ liệu nếu chúng nằm trong danh sách. Tôi đang sử dụng PHP và con số tôi có thể có thể sử dụng "HTTP_REFERER" nhưng đã đọc rằng một số trình duyệt sẽ không gửi thông tin này .... ??? Ý tưởng nào?Đảm bảo JSONP?

Cảm ơn!

+6

Ngoài ra, 'REFERRER' có thể được giả mạo –

Trả lời

6

Thực sự không có giải pháp hiệu quả. Nếu JSON của bạn có thể truy cập được thông qua trình duyệt thì có thể truy cập được vào các trang web khác. Đối với máy chủ web, yêu cầu bắt nguồn từ trình duyệt hoặc máy chủ khác hầu như không thể phân biệt được với các tiêu đề. Giống như ILMV đã nhận xét, các liên kết giới thiệu (và các tiêu đề khác) có thể bị giả mạo. Họ là sau khi tất cả, tự báo cáo.

Bảo mật không bao giờ là hoàn hảo. Một người được xác định đầy đủ có thể vượt qua bất kỳ biện pháp an ninh nào, nhưng mục tiêu an ninh là tạo ra một rào cản đủ cao mà người dân và hầu hết mọi người sẽ bị từ chối.

Với ý nghĩ đó trong đầu, bạn có thể tạo ra một hàng rào đủ cao để các trang web khác có thể không bận tâm đến việc đưa ra yêu cầu với hàng rào nhập cảnh được đưa vào. Bạn có thể tạo các mã thông báo sử dụng duy nhất được yêu cầu để lấy dữ liệu json. Khi mã thông báo được sử dụng để lấy dữ liệu json, mã thông báo sau đó sẽ bị vô hiệu hóa sau đó. Để lấy mã thông báo, trang web phải được yêu cầu với mã thông báo được nhúng trong trang trong javascript, sau đó được đưa vào cuộc gọi ajax cho dữ liệu json. Kết hợp điều này với các mã thông báo hết hạn thời gian, và đủ obfuscation trong javascript và bạn đã tạo ra một rào chắn đủ cao.

Chỉ cần nhớ, điều này không thể tránh được. Một trang web khác có thể trích xuất mã thông báo ra khỏi javascript và chặn cuộc gọi ajax và chiếm đoạt dữ liệu ở nhiều điểm.

+0

+1 cho mã thông báo sử dụng duy nhất – mattbasta

0

Bạn có quyền truy cập vào các máy chủ/trang web mà bạn muốn cấp quyền truy cập vào JSONP không?

Bạn có thể làm gì, mặc dù không lý tưởng là thêm bản ghi vào db của IP trên tải trang được phép xem JSONP, sau đó tải jsonp, kiểm tra xem bản ghi đó có tồn tại hay không. Có lẽ đã hết hạn trong hồ sơ nếu thích hợp.

ví dụ:

http://mysite.com/some_page/ - tải trang người dùng, thêm IP của họ vào cơ sở dữ liệu của người dùng được phép

http://anothersite.com/anotherpage - như trên, thêm vào cơ sở dữ liệu

  • JSONP tải, kiểm tra IP tồn tại trong cơ sở dữ liệu.
  • Sau một giờ xóa các bản ghi từ các db, vì vậy khác tải trang sẽ được yêu cầu ví dụ

Mặc dù điều này khá dễ dàng có thể được làm việc xung quanh nếu scraper (hoặc các trang web khác) quản lý để tìm ra phương pháp gì bạn đang sử dụng để cho phép người dùng xem JSONP, họ chỉ phải nhấn trang đầu tiên.

-1

Tôi chắc chắn bạn có thể làm điều này với htaccess -

Đảm bảo tiêu đề của bạn đang gửi "HTTP_REFERER" - Tôi không biết bất kỳ trình duyệt sẽ không gửi nó nếu bạn nói với nó.(nếu bạn vẫn lo lắng, hãy quay lại một cách duyên dáng)

Sau đó, sử dụng htaccess để cho phép/từ chối quyền truy cập từ người giới thiệu phù hợp.

# deny all except those indicated here 
order deny,allow 
deny from all 
allow from .*domain\.com.* 
0

Cách sử dụng cookie chứa mã thông báo được sử dụng với mọi yêu cầu jsonp? Tùy thuộc vào thiết lập, bạn cũng có thể sử dụng biến nếu bạn không muốn sử dụng cookie.

0

Làm việc với biểu mẫu importScript Web Worker khá giống với jsonp. Thực hiện kiểm tra kép như theAlexPoon cho biết. Chính-kịch bản cho nhân viên web, nhân viên web để cắt đứt và trở lại với truy vấn bảo mật. Nếu nhân viên web trả lời cho tập lệnh chính mà không được hỏi hoặc với mã thông báo sai, tốt hơn là chuyển tiếp trang web của bạn đến niết bàn. Nếu máy chủ được hỏi với mã thông báo sai thì không trả lời. Cookie sẽ không được gửi với yêu cầu importScript vì tài liệu không có sẵn ở cấp độ nhân viên web. Luôn gửi các cookie có liên quan đến bảo mật với yêu cầu đăng bài.

Nhưng vẫn còn nhiều rủi ro. Người đàn ông ở giữa biết làm thế nào.