close

最近在改一個需求,根據資安法與政府組態基準 (GCB),密碼必須要參考 Windows 的密碼安全性原則(密碼複雜度設定),達到以下要求:

  • 至少 8 個字元
  • 至少有以下四個內容的其中三個
    • 小寫字母
    • 大寫字母
    • 數字
    • 特殊符號

寫不出漂亮的正規表示式 (regular expression),光是中括號就一直卡住,只好上網求助萬能的網路搜尋。找到一篇 "RegEx for strong password",裡面提到:

「以下的 pattern 可以符合需求:

"^((?=.{8,}$)(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).*|(?=.{8,}$)(?=.*\d)(?=.*[a-zA-Z])(?=.*[!\u0022#$%&'()*+,./:;<=>?@[\]\^_`{|}~-]).*)"

各種符號讓這個 pattern 又長又醜。遺憾的是 unicode 的範圍與類別都不支援,所以只能把它們用字元的方式寫出來。你會注意到我特別把雙引號換成 unicode (\u0022),避免這個雙引號讓 ValidationExpression(註:ASP.NET 拿來放正規表示式的屬性)提早被截斷。

在這個情況下,你的程式碼可能長成這樣:

<asp:TextBox ID="password" runat="server" />
<asp:RequiredFieldValidator ID="rfvPassword" runat="server" Display="Dynamic"
 ControlToValidate="password" ErrorMessage="Password is required!" />
<asp:RegularExpressionValidator ID="revPassword" runat="server" Display="Dynamic"
 ControlToValidate="password" ErrorMessage="Invalid password!"
 ValidationExpression="^((?=.{8,}$)(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).*|(?=.{8,}$)(?=.*\d)(?=.*[a-zA-Z])(?=.*[!\u0022#$%&'()*+,./:;<=>?@[\]\^_`{|}~-]).*)"
/>

我是把它拿到 JavaScript 裡用,所以長成這樣:

<script type="text/javascript">
// 以下是這個正規表示式的 pattern 的內容:
// 密碼長度須超過八個字 {8,}
// 密碼複雜度須包含:
// - 小寫字母 [a-z]
// - 大寫字母 [A-Z]
// - 數字 \d
// - 特殊符號 "#$%&'()*+,./:;<=>?@[]^_`{|}~-
var regex = new RegExp(/^((?=.{8,}$)(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).*|(?=.{8,}$)(?=.*\d)(?=.*[a-zA-Z])(?=.*[!\u0022#$%&'()*+,./:;<=>?@[\]\^_`{|}~-]).*)/, "g");
// 用另一個變數把使用者輸入的密碼接進來,假設那個密碼變數是 newpwd
if (newpwd.match(regex) == null) {
    alert('密碼複雜度不符合');
}  
</script>

 

打完收工~感恩網路上的大大們精美的奉獻。(合掌)

arrow
arrow

    小攻城師 發表在 痞客邦 留言(0) 人氣()