簡體   English   中英

沒有用戶名/密碼的身份驗證?

[英]Authentication without username/password?

我們正在構建一個 PHP 多租戶應用程序。 每個公司的帳戶都將在他們自己的子域 abcorp.example.com 上運行。 該應用程序允許公司編寫和發布內容(常見問題等)供其客戶閱讀。

他們會告訴他們的客戶訪問:abcorp.example.com/ 閱讀內容。 或者他們會在他們的安全 Web 應用程序中放置一個指向該 URL 的鏈接。

然而,這些公司可能不希望任何人通過訪問 abcorp.example.com/ 來閱讀內容

所以,我的問題是有什么方法可以提供一些基本的身份驗證而無需進入用戶名和密碼身份驗證。 我正在考慮添加到超鏈接或類似的某種隱藏標記

我的目標:

  1. 如果用戶直接在瀏覽器中輸入 abcorp.example.com/,他們將無法看到網頁,因為他們沒有進行身份驗證或傳遞令牌。

  2. 避免使用用戶名和密碼

另一種選擇是引用 URL 身份驗證

當然,如果有人將令牌公開,它將向找到它的人開放。

我想每個公司都可以使用共享令牌鏈接到他們的頁面,例如:

abccorp.example.com/?t=4rrfwr23rwads3

每個令牌都可以存儲在文件或數據庫中。

當有人請求一個頁面時,它會用存儲在服務器上的值來檢查 $_GET['t'] 的值。 如果匹配,則加載頁面的其余部分。 當然,這個變量必須貫穿整個站點,並包含在每個鏈接中。

同樣,這不會很安全。 公開的令牌可以讓全世界都可以訪問該站點。

您的“隱藏令牌”想法本質上是會話的工作方式。 會話可用於識別用戶(即跟蹤用戶瀏覽網站時的行為),並通過在鏈接中傳遞會話 ID 或將其存儲在 cookie 中來傳播

但是,使用沒有任何其他類型身份驗證的會話本質上是不安全的! 當您向用戶本身公開身份驗證和跟蹤用戶的方式時,用戶可以修改或偽造他們的身份驗證。 例如,用戶可以更改為會話 ID 傳遞的值或更改存儲在 cookie 中的值。

請閱讀有關會話和安全性的 PHP 手冊部分。

您還可以使用客戶端 IP 地址作為令牌,讓不同的 IP 地址訪問系統的不同(部分/實例)。 但是增益,這不是很安全,因為

  1. 您無法知道客戶端 PC 的幕后黑手和
  2. IP 地址可以被欺騙。 也許你可以開發額外的規范; 僅在辦公時間內提供 IP 地址訪問權限,或檢查客戶端瀏覽器(用戶代理)並根據客戶端正式使用的用戶代理進行檢查。

您可以使用基本散列,將共享的秘密密碼或“密鑰”存儲在您的系統和每個公司系統上(每個公司的不同密鑰且未公開發布),然后您使用鏈接中的子域散列秘密密碼和包括摘要作為參數。 然后您通過在您身邊運行相同的算法並與摘要進行比較來驗證它。

鏈接可能看起來像

abc.example.com/?d=b5939ca22f5dcf345b4000641995478c5910dbd1607b1bdadcbf4a8618a95211

其中摘要是:

$d = hash('sha256', $secret_password.$subdomain);

或包括推薦人:

$d = hash('sha256', ($secret_password.$subdomain.$_SERVER['HTTP_REFERER']));

克服的障礙是確保每個公司都可以根據公司特定的密鑰/算法支持正確生成這些鏈接 - 並且每個公司都不同,因此一家公司無法為另一家公司生成鏈接。

這比沒有身份驗證或根本未經驗證的公共共享令牌要好,但我確信它仍然存在漏洞。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM