為了避免自己撰寫出具有安全風險的程式碼而仍不自知,就挑上這堂 從 OWASP Top 10 實現全方位防禦強化 課程。這邊筆記下若有損壞驗證功能,該如何進行修復。
課程相關資訊
[連結]:https://hiskio.com/courses/1539/lectures/160748
本篇範圍:Chapter 2
請注意:本系列文章為個人對應課程的消化吸收後,所整理出來的內容。換言之,並不一定會包含全部的課程內容,也有可能會添加其他資源來說明。
內容
1. 若使用「完全相等」去進行比對,那就有機會在多次嘗試後,可以反推回對應的明文
假設 correctPassword 是「abc123」,而駭客首先嘗試輸入「a」。在字母「a」與正確密碼的第一個字母比對時,=== 會返回 false,因為剩下的部分(bc123)不相等。 然而,因為「a」是正確密碼的第一個字母,該比對的運算時間可能會稍微長一點(因為需要逐個字元進行比對)。駭客可以透過多次嘗試並測量每次比對所花費的時間來推測哪個字母是正確的。
2. 使用 hash 來進行安全比對。不同長度與相同長度所回傳的時間要相同的。這點在 PHP 中有內建函式為 HASH_EQUAL
JavaScript
1 2 3 4 5 6 7 8 9 10 11 12 13 |
function timingSafeEqual(a, b) { if (a.length !== b.length) { return false; } let result = 0; for (let i = 0; i < a.length; i++) { result |= a.charCodeAt(i) ^ b.charCodeAt(i); } return result === 0; } |