我對此進行了一些研究,但我還沒有找到針對這種特殊情況的可靠答案。
假設我有一個名為的路由/information回傳指定的一些敏感資料,info_id并且僅當提供有效的one_time_code.
我可以考慮通過兩種方式來做到這一點:
- 獲取/資訊?info_id=x&one_time_code=y
- POST /資訊
體:info_id = x, one_time_code = y
回應(這不會改變,資料庫中的其他任何東西也不會改變 - 一次性代碼有一個到期 - 并且可以通過不同的方式清除):
{
"info_owner_id" : "1234",
...
}
從我的理解來看,GET 方法似乎是更 RESTful 的方法,但可能并不理想,因為帶有查詢字串的 URL 會保存在瀏覽器中,并且結果可能會在此程序中被快取。此外,info_id可能會在此程序中泄漏(即使在 URL 中使用 HTTPS)。
但是,使用 POST 方法,不會快取任何內容,過期代碼也不會保存在瀏覽器中。但是,沒有創建任何內容,事實上,資料庫根本沒有更改,因此它可能不是最“合乎邏輯”的方法。
我正在努力理解在這種情況下什么是最佳實踐,我希望得到一些澄清。
此外,如果您認為采用完全不同的方式更可取,請告訴我。我想將 GET 與身份驗證標頭一起使用,但我的網站在其資料庫中沒有“用戶”,但人們可以保存自己的資訊并通過生成的鏈接(info_id/通過電子郵件發送的一次性代碼)訪問它。
uj5u.com熱心網友回復:
如果一次性密碼泄漏,它只能使用一次,這是一個問題嗎?我的意思是即使你在 url 上發送它,回應也會被檢索,如果黑客想要重用它,它也不會作業......
在我看來,最 RESTful 的方式是:
GET /information/{infoId}?oneTimeCode=xxx
或者
GET /information/{infoId}/{oneTimeCode}
但它并不是真正的 RESTful,因為它不是無狀態的,前提是您不能使用相同的 url 兩次訪問相同的資源。
uj5u.com熱心網友回復:
我會使用 GET 請求。即使請求已快取在瀏覽器歷史記錄中(我會使用 XHR/ajax),獲取一次性代碼也不是破壞性操作,也不會真正構成危險。正如您所提到的,由于沒有任何更改,您應該使用 GET 請求。PS,所有查詢 GET 引數都與使用 SSL 的 POST 正文一樣安全。
uj5u.com熱心網友回復:
RESTful API 通常使用 GET(讀取)、POST(創建)、PUT(替換/更新)和 DELETE(洗掉記錄)。
所以對于你的情況,人們經常使用 get 方法。
獲取/資訊/{infoId}
對于敏感資訊,我強烈建議我們無論如何都應該隱藏它,將它隱藏在用戶的視線之外。
所以在我看來,如果你使用 get ,我們應該把一次性令牌代碼放在 header 中,如果你使用 post 方法,我們應該把它放在 body 中。
即使使用 https,get 或 post 都是安全的。我仍然想將它隱藏在用戶的視線之外。
無狀態是理想的,但當系統非常復雜時,很難達到身份驗證、超時、一次性令牌等。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/314024.html
