2014-10-16 26 views
0

我在一個站點上工作,它有一個文檔頁面,應該只能從另一個站點的成員訪問,而另一個站點有一個頁面可以從我正在從事的網站的成員訪問。在兩個站點之間共享數據(如果請求有效)

目前,這是通過檢查http引用來完成的,所以這個其他網站有一個鏈接可以說www.mysite.com/for-their-members-page/,如果http引用鏈接是www.theirsite。 com/members /我們知道它的成員區域內有來自他們網站的有效請求,他們必須簽署,並且相同。

我首先關心的是http referrer很容易被僞造,但另一個問題是依賴於用戶瀏覽器或安全設置,你甚至可能不會得到那個http referrer。

是否有任何解決方案,以便我可以驗證請求是否有效 - 即它是來自其他網站的成員區域?反之亦然,所以他們可以驗證對他們頁面的請求實際上來自我們網站的成員?

感謝任何幫助或指針:)

+0

站點H =數據的主機,站點C =要共享數據的站點。我將在Site H上設置一個Web服務,Site C可以使用它來請求許可密鑰。站點C然後可以將權限密鑰傳遞到站點H上的網關頁面(通過傳統的瀏覽器請求)以允許用戶查看文檔 – 2014-10-16 17:54:58

回答

0

你的第一個問題的答案是是是是。 cgi變量可以很容易僞造,不應該用於任何類型的「真實」身份驗證。其次,每個人都沒有一種「簡單」的方案來做你想要做的事情,但是有許多「單點登錄」解決方案使用第三方來源的認證。例如,你有沒有去過一個可以讓你登錄你的谷歌或Facebook賬戶的視線?他們正在使用oAuth--由大型社交媒體服務支持的SSO標準。

這可能是你想要做的事情的矯枉過正,但當我不知道總體風險是什麼時,實際上「推薦」某些東西確實很難。

例如,您可以在服務器A上創建一個鎖定到服務器B的IP地址的頁面(反之亦然)。該頁面可能會返回一個UUID - 您在應用程序範圍內創建並存儲的內容,並每天或每小時或5分鐘輪換(適用於風險)。然後,你可以存儲其他服務器UUID和使用CFHTTP定期刷新:

<cfhttp url="otherserver/myUUID.cfm"/> 
<cfset application.otherserveruuid = trim(cfhttp.filecontent)/> 

現在每個服務器就知道兩兩件事 - 它自己的UUID與其他服務器的UUID。

最後,你的UUID追加到鏈接到其他服務器,並添加檢查(撥入服務器上),以確保它的存在,並匹配從在未來的服務器預期的UUID。

該方案將工作但是:

  • 它不是非常安全 - 只是很難僞造。例如,如果您每天只更改一次UUID,則有人可能只是在一天中將鏈接傳遞給任何人。
  • 它沒有粒度。從你的問題,我把這個作爲你想要的。您不想要驗證特定的用戶。你真的不關心他們是誰 - 你只關心來自其他網站

只要你明白,並可以與這兩個cavaets生活,這將工作。正如你可能想象的那樣,還有很多其他的方式來做到這一點你可能會想到幾個:)

+0

感謝您的回答,正如我在其他兩個答案中所說的那樣,我將嘗試這個週末出去看看什麼效果最好。 – luke 2014-10-17 12:03:44

0

我會在這裏留給誰來從中挑選一些東西,但是this is the more elegant answer.,並禁用鏈接共享而無需登錄共享。


<cfif len(trim(Arguments.username)) is ""> 
    <cfset results.state = 0> 
    <cfset results.message = "Username argument is not defined"> 
    <cfreturn results> 
</cfif> 

<cfif len(trim(Arguments.password)) is ""> 
    <cfset results.state = 0> 
    <cfset results.message = "Password argument is not defined"> 
    <cfreturn results> 
</cfif> 

<cfif not isDefined("Arguments.CustID")> 
    <cfset results.state = 0> 
    <cfset results.message = "Customer ID (representing the user of your site) is required."> 
    <cfreturn results> 
</cfif> 

<cfquery name="ValidateSite"...> 
    select SiteID from othersites 
    where username = <cfqueryparam cfsqltype="cf_sql_varchar" value="#arguments.username#"> 
    where password = <cfqueryparam cfsqltype="cf_sql_varchar" value="#arguments.password#"> 
    and Active = 1 
</cfquery> 

<cfif ValidateSite.recordcount eq 1> 
    <cfset results.Passkey = Hash(Arguments.username & "_" & Arguments.custID)> 
    <!--- I chose hash because it will reliably create the same key when the referring site provides the same data. Wheras, a lot of other functions might not. ---> 
    <cfquery name="CheckID"...> 
    Select SiteID 
     from PermKeys 
    where SiteID=<cfparam cfsqltype="cf_sql_integer" value="#ValidateSite.siteID#"> 
     and PassKey=<cfparam cfsqltype="cf_sql_varchar" value="#results.PassKey#"> 
     and custID=<cfparam cfsqltype="cf_sql_varchar" value="#Arguments.custID#">) 
    </cfquery> 
    <cfif CheckID.recordcount eq 0> 
    <cfquery...> 
     insert into PermKeys(SiteID,Passkey,CustID) 
     values(<cfparam cfsqltype="cf_sql_integer" value="#ValidateSite.siteID#">,<cfparam cfsqltype="cf_sql_varchar" value="#results.PassKey#">,<cfparam cfsqltype="cf_sql_varchar" value="#Arguments.custID#">) 
    </cfquery> 
    <cfset results.message = "Authentication for this customer created."> 
    <cfelse> 
    <cfset results.message = "Authentication for this customer previously created. Authentication Key will always be the same. Please store the authentication keys, passed back as passKey, on your own server so that a call isn't needed each time."> 
    </cfif> 
    <cfset results.state = 1> 
    <cfset results.siteID = ValidateSite.siteID> 
    <cfset results.custID = Arguments.custID> 
<cfelse> 
    <cfset results.state = 0> 
    <cfset results.message = "User not found."> 
</cfif> 
<cfreturn results> 

這將返回,如果成功的話

  • 國家1.
  • SITEID,數字ID
  • 密鑰的,唯一的每個CUSTID
  • 客戶ID(如通過由Arguments.custID)。在這個例子中實際上並不需要。
  • 消息。

如果網站證書驗證失敗或未準確地提供,這將返回0

  • 一條消息,說明爲什麼

    • 狀態。

    然後我調用web服務,爲用戶獲取證書,並返回類似授權

    http://docssite.com/authorize/index.cfm?site=#siteID#&passkey=#passkey#&customerID=#custID#

    Index.cfm鏈接將檢查這三個網址參數對PermKeys,確保它是合法的,並登錄用戶輸入。您甚至可以直接在URL中傳遞docID並將該決定用作是否顯示docID。

    如果您還在列表中傳遞了一個docID,您可以輕鬆地將cfhttp傳遞到具有所有參數的相同url並獲取返回的文檔。

    然後,您可以編寫一個類似的web服務來刪除過期的憑證(說某人退訂客戶網站,您不希望他們的憑證仍然有效)。

    客戶網站可以(也應該)跟蹤他們已經調用過webservice的用戶,並將他們的密鑰和CustID(每個客戶都獨有)保存在他們自己的數據庫中,這樣他們就不需要重複調用您的web服務以獲取相同的信息。

  • +0

    感謝您的詳細解答!我將在本週末查看各種解決方案,看看哪些方法最好。 – luke 2014-10-17 12:02:35

    1

    一個「安全」的解決方案是利用ColdFusion會話變量。

    在站點A上,您需要有一個Session變量,用於標識登錄的用戶(假設您有Session.UserName)。然後,您有哪些做這個簡單的認證檢查頁面(check.cfm):

    <cfif IsDefined("Session.Username")>1<cfelse>0</cfif> 
    

    站點A鏈接到站點B是這樣的:

    http://siteB.com/page.cfm?remoteID=<cfoutput>#Session.CFID#&remoteToken=#Session.CFToken#</cfoutput> 
    

    現在站點B可以檢查用戶是否登錄進入站點A:

    <cfhttp url="http://siteA.com/check.cfm?CFID=#URL.remoteID#&CFToken=#URL.remoteToken#"/> 
    
    +0

    感謝您的回答,我喜歡這個解決方案。我將在本週末檢查並嘗試3種不同的解決方案,並看看哪種方法最好。再次感謝。 – luke 2014-10-17 12:01:42

    +0

    我不認爲會話變量是安全的。如果同一用戶在兩個站點上使用不同的瀏覽器選項卡,會話變量可能會混亂。 – 2014-10-17 12:11:10

    +0

    根據我的建議,用戶可以在同一瀏覽器中雙方登錄,並有兩個單獨的會話 - 他將有兩個不同的會話標識符。 – xpa1492 2014-10-17 12:25:02

    相關問題