2012-09-17 98 views
2

問題

我有一項將內容推送給用戶的服務。爲了向用戶提供此內容,客戶將在其網站上包含腳本。他們的腳本會向我的服務器發送一個令牌以標識它是哪個客戶,但問題在於:如果有人從用戶的網站複製腳本,他們可以收到此實時內容,並且客戶將爲不在其網站上的用戶。那麼,有沒有辦法確保腳本只包含在他們的網站上?谷歌分析如何實現這一目標?確保腳本僅包含在某些頁面中

我有一個想法,但我不知道這是否完全安全。

  1. 客戶告訴我他們想包含我的腳本的任何域(包括子域)。
  2. 我給用戶一個非常小的文本文件,他們存儲在他們的服務器上。
  3. 加載腳本後,它會檢查window.location.host,並嘗試從託管域的根目錄中獲取文本文件。
  4. 如果找到該文件,並且內容與我向客戶提供該文件時生成的內容相匹配,我將激活該服務。

這項工作?

爲什麼我不能使用window.location的

比方說,我的劇本讀了window.location,併發送到URL現在mydomain.com?token=ABC&locationhost=goodcustomer.com

,baduser.com的所有者希望濫用帳戶gooduser.com,所以他包含gooduser.com的腳本。腳本現在發送一個ajax請求到mydomain.com?token=ABC&locationhost=badcustomer.com

這不會啓動服務,因爲badservice.com不是goodcustomer.com所有者在註冊時輸入的域。這很容易規避,因爲badcustomer.com的所有者可以看看我的腳本,注意它發送了一個驗證url的請求,並且只發送他自己的請求。所以他會發送一個請求到mydomain.com?token=ABC&locationhost=goodcustomer.com。我的服務器看到了這個請求,比較了位置主機和與這個令牌關聯的域,並且開始給badcustomer.com的用戶提供goodcustomer.com用戶的內容。我的服務器無法知道請求是由我自己的腳本發送的,還是由試圖模擬實際客戶的用戶發送的。

+0

如果誰在第一時間刷過腳本的人也抓住了文本文件,那麼它將不起作用。顯然他們必須知道該文件在那裏,但如果你能找到它,其他人也可以檢查發送該令牌的請求的源頭,以及服務 中的客戶提供的域列表。 ?雖然你必須檢查某人是不是僞造起始請求的地方 – nat

+0

我想你誤解了我的意思。客戶端的服務器不發送令牌。令牌只是我的腳本請求中的一個參數,與分析跟蹤代碼類似。我希望任何使用靜態網站的人都可以使用我的服務,所以我不能要求他們從他們的服務器向我的服務器發送請求。 – bigblind

+0

當然,所以你驗證這個ID對你持有該ID的域列表..不是?無論哪種方式,你需要知道他們的領域。 – nat

回答

1

只有使用在最終用戶瀏覽器中運行的腳本,您無法對此做出安全解決方案。想要模仿客戶網站的人總是能夠通過創建發送給瀏覽器的每個腳本或文件的副本來完成此操作。你需要在你的客戶服務器上做些什麼。也就是說,您的客戶必須擁有某種不會發送到瀏覽器的祕密。

做到這一點的一種方法是給客戶一個生成一次性令牌的服務器端腳本。讓您的腳本調用此服務器端腳本來獲取令牌,並將此令牌包含在對服務器的請求中。在生成數據之前,您的服務器必須檢查令牌是否正確。

可以通過向每個客戶發送20個字符長的密碼來製作一次性令牌。讓服務器端腳本讀取密碼,添加日期和時間並使用SHA-256對該值進行散列。如果您不知道密碼,那麼創建虛假標記將非常困難。如果你在服務器端腳本中添加一個計數器會更好。讓計數器爲每個請求增加一個。但是,如果您網站上的櫃檯與客戶網站上的櫃檯不同步,則櫃檯會引入一些同步問題。

1

您可以建立用戶將託管腳本的域的數據庫,然後當用戶加載腳本時,它會將window.location發送到您的服務器,然後您的服務器在窗口位置與數據庫中的窗口位置匹配時發送內容。

+0

服務器應該能夠知道請求來自哪裏,而不需要客戶端做任何額外的工作。但這裏的理論認爲。 – Shmiddty

相關問題