2013-11-03 12 views
5

Sử dụng PHP, làm thế nào để bạn an toàn xác thực cuộc gọi API, cross-domain, với các tiêu chí sau:Làm thế nào có thể PHP điều khiển API xác thực khách hàng chính hãng (referer) cross-domain (biết rằng các tiêu đề có thể được giả mạo)?

  1. Phải được gọi từ một domain.com/page nhất định (không có tên miền khác)
  2. phải có được chìa khóa

một số nền: Xin vui lòng đọc kỹ trước khi trả lời ...

Ứng dụng web của tôi sẽ hiển thị tiện ích javascript trên trang web của khách hàng qua một cuộc gọi như bên dưới. Vì vậy, chúng tôi đang nói về xác thực tên miền chéo cho tập lệnh được phân phát nhưng chỉ cho khách hàng chính hãng và cho một URL nhất định!

Hiện tại, tiện ích có thể được trang web của CLIENT đưa vào, bằng một dòng javascript.

Ví dụ client-website.com/page/with/my-widget

<head> 
... 
<script src="//ws.my-webappserver.com/little-widget/?key=api_key"></script> 
... 
</head> 

Bây giờ, trên thực tế điều này không gọi javascript trực tiếp nhưng một kịch bản PHP trên máy chủ từ xa của tôi mà ngồi ở phía trước javascript thực tế với mục đích thực hiện một số xác thực.

Các kịch bản PHP đằng sau những cuộc gọi trên thực hiện điều này đầu tiên:

  1. kiểm tra rằng khóa API ($ _REQUEST [ "key"]) phù hợp với hồ sơ của người dùng trong cơ sở dữ liệu.
  2. kiểm tra URL của liên kết giới thiệu ($ _SERVER ['HTTP_REFERER']) so với bản ghi trong cơ sở dữ liệu ***.

này là đơn giản, nhưng trong bản chất máy chủ trông giống như:

if ($_SERVER['HTTP_REFERER'] !== "http://client-website.com/page/with/my-widget") 
    && $_REQUEST["Key"] == "the_long_api_key") { 
    header("Content-type: application/x-javascript"); 
    echo file_get_contents($thewidgetJS_in_secret_location_on_server); 
} else { 
    //pretend to be a 404 page not found or some funky thing like that 
} 

*** Các widget chỉ được phép chạy trên một số trang web/các trang

Bây giờ, đây là vấn đề:

  1. khóa ở phía khách hàng để mọi người có thể xem nguồn và lấy khóa
  2. dẫn đến nhiều có thể bị giả mạo (bởi cURL) ví dụ

Và một chút snag: Tôi không thể nói với khách hàng để dính vào phím bên trong một kịch bản php trên máy chủ của họ, vì họ có thể được chạy bất kỳ máy chủ ngôn ngữ phụ!

Vậy làm cách nào để tôi có thể làm cho dịch vụ web của mình an toàn và chỉ có thể truy cập được bằng tên miền/trang đã cho?

Mọi trợ giúp sẽ thực sự được đánh giá cao!

ps: Tiện ích tải lên một số loại hộp thả xuống - vì vậy bảo mật là chìa khóa ở đây!

+1

Tôi đã nghe điều này rất nhiều trước đây. nó sẽ giúp bạn tự xác thực mỗi người dùng hoặc tin tưởng vào xác thực của trang web khác và giám sát mạnh mẽ cho hoạt động xấu (đó là những gì bạn đang làm). bạn có thể làm nhiều hơn trong js để phá vỡ các tập lệnh curl nghiệp dư, nhưng trừ khi bạn muốn đảm bảo mỗi yêu cầu, có rất ít bạn có thể làm. – dandavis

Trả lời

-1

id khuyên bạn nên sử dụng một cách tiếp cận danh sách trắng cho vấn đề này, tôi không hoàn toàn chắc chắn điều này sẽ giải quyết được vấn đề.

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