Hi,我們已經完成了絕大部份的功能了,今天來針對一些所謂的資訊安全需求來進行強化
在資訊安全上,會有部份安全項目是不可揭露過多資訊、使用檢單的訊息代替完整伺服器錯誤訊息、不可揭露存檔路徑…等,這個項目通常是指若是有出現未處理的例外狀況時,使用統一的錯誤頁面來顯示訊息,在 express 框架中,已經內建該機制了,我們只需要調整 error.ejs 的內容即可
<h1><%= message %></h1>
<h2><%= error.status %></h2>
<!-- 拿掉這個部份
<pre><%= error.stack %></pre>
-->
這個也是常見需要處理的資安項目,通常我的做法會在登入頁上處理,將錯誤次數紀錄在 localStorage 或 sessionStorage 中,超過規定次數時,設定一個到期期限,每次執行登入時,檢查是否有超過錯誤次數,若沒有超過則放行,有超過則驗證是否還在阻擋期限中
senddata() {
//驗證登入錯誤次數與期限
let errtimes = (localStorage.getItem("errtimes")? localStorage.getItem("errtimes"): 0)
if(errtimes >= 3) {
let now = new Date()
let nowtime = now.getTime()
let limit = localStorage.getItem("limittime")
if(nowtime >= limit) {
//超過阻擋時限後,清空紀錄後放行
localStorage.removeItem("errtimes")
localStorage.removeItem("limittime")
} else {
//還在阻擋時限中,中止登入作業
alert("連續登入錯誤太多次,請稍候重新登入")
return false
}
}
const messageBuffer = new TextEncoder().encode(data.pwd);
crypto.subtle.digest('SHA-512', messageBuffer)
.then(hashBuffer => {
const hashArray = Array.from(new Uint8Array(hashBuffer));
const hashHex = hashArray.map(b => b.toString(16).padStart(2, '0')).join('');
axios.post("/saf/login", {
uid: data.uid,
pwd: hashHex
}).then(function (response) {
let rt = response.data
if(rt.status == "00") {
alert("登入成功")
//登入成功後,清除紀錄
localStorage.removeItem("errtimes")
localStorage.removeItem("limittime")
//…
} else {
//紀錄登入錯誤次數,超過3次時,紀錄有效期限
let errtimes = (localStorage.getItem("errtimes")? localStorage.getItem("errtimes"): 0)
console.log(errtimes)
errtimes++
localStorage.setItem("errtimes", errtimes)
if (errtimes >= 3) {
let limittime = new Date();
limittime.setMinutes(limittime.getMinutes() + 15)
localStorage.setItem("limittime", limittime.getTime())
}
alert(rt.msg)
}
}).catch(function (response) {
alert(response.response.data)
})
})
.catch(err => console.error(err));
}
上述是純前端的控制方式,完整的防護其實可以搭配後端作業,例如說登入帳號從資料庫端進行使用者停用、登入畫面加入驗證碼防止機器人破解等等