JavaScript >> Javascript 文檔 >  >> JavaScript

JavaScript 密碼驗證

由於我在 regexadvice.com(我不時在那裡閒逛)上看到了大量的密碼驗證幫助請求,因此我編寫了一個更通用的 JavaScript 密碼驗證函數。它相當簡單,涵蓋了我最常遇到的驗證要求。另外,如果它不能滿足您的確切需求,可以通過向其傳遞自定義函數和正則表達式來增強其功能。

以下是開箱即用支持的驗證類型。都是可選的,也就是說默認允許所有密碼。

  • 最小和最大長度。
  • 最小 n 小寫字符 (a–z)。
  • 最小 n 大寫字符 (A–Z)。
  • 最小 n a-z 和 A-Z 字符的組合。
  • 最小 n 數字字符 (0–9)。
  • 最小 n 特殊字符(a–z、A–Z 和 0–9 以外的字符)。
  • 禁止特定字詞(不區分大小寫測試)。
  • 禁止n -length 字符序列(例如“abc”、“XYZ”或“789”,序列長度為 3;不適用於特殊字符)。
  • 禁止n -length qwerty 字符序列(例如“qwerty”或“asdf”,序列長度為 4;不適用於特殊字符)。
  • 禁止使用連續的、相同的字符(例如“aa”或“!!”)。
  • 使用自定義正則表達式(使用 RegExp.prototype.test 測試 ) 和函數(密碼作為第一個參數提供,並返回一個布爾值)。

這是一個如何使用它的示例:

var password = "password";
var passed = validatePassword(password, {
	length:   [8, Infinity],
	lower:    1,
	upper:    1,
	numeric:  1,
	special:  1,
	badWords: ["password", "steven", "levithan"],
	badSequenceLength: 4
});
// passed: false

以上要求 password 至少有八個字符長;至少有一個小寫、大寫、數字和特殊字符;不包括“password”、“steven”或“levithan”等詞;並且不包含長度為四個或更多字符的字母數字序列(例如“1234”)。

下面是代碼(沒有外部庫依賴):

/*
	Password Validator 0.1
	(c) 2007 Steven Levithan <stevenlevithan.com>
	MIT License
*/

function validatePassword (pw, options) {
	// default options (allows any password)
	var o = {
		lower:    0,
		upper:    0,
		alpha:    0, /* lower + upper */
		numeric:  0,
		special:  0,
		length:   [0, Infinity],
		custom:   [ /* regexes and/or functions */ ],
		badWords: [],
		badSequenceLength: 0,
		noQwertySequences: false,
		noSequential:      false
	};

	for (var property in options)
		o[property] = options[property];

	var	re = {
			lower:   /[a-z]/g,
			upper:   /[A-Z]/g,
			alpha:   /[A-Z]/gi,
			numeric: /[0-9]/g,
			special: /[\W_]/g
		},
		rule, i;

	// enforce min/max length
	if (pw.length < o.length[0] || pw.length > o.length[1])
		return false;

	// enforce lower/upper/alpha/numeric/special rules
	for (rule in re) {
		if ((pw.match(re[rule]) || []).length < o[rule])
			return false;
	}

	// enforce word ban (case insensitive)
	for (i = 0; i < o.badWords.length; i++) {
		if (pw.toLowerCase().indexOf(o.badWords[i].toLowerCase()) > -1)
			return false;
	}

	// enforce the no sequential, identical characters rule
	if (o.noSequential && /([\S\s])\1/.test(pw))
		return false;

	// enforce alphanumeric/qwerty sequence ban rules
	if (o.badSequenceLength) {
		var	lower   = "abcdefghijklmnopqrstuvwxyz",
			upper   = lower.toUpperCase(),
			numbers = "0123456789",
			qwerty  = "qwertyuiopasdfghjklzxcvbnm",
			start   = o.badSequenceLength - 1,
			seq     = "_" + pw.slice(0, start);
		for (i = start; i < pw.length; i++) {
			seq = seq.slice(1) + pw.charAt(i);
			if (
				lower.indexOf(seq)   > -1 ||
				upper.indexOf(seq)   > -1 ||
				numbers.indexOf(seq) > -1 ||
				(o.noQwertySequences && qwerty.indexOf(seq) > -1)
			) {
				return false;
			}
		}
	}

	// enforce custom regex/function rules
	for (i = 0; i < o.custom.length; i++) {
		rule = o.custom[i];
		if (rule instanceof RegExp) {
			if (!rule.test(pw))
				return false;
		} else if (rule instanceof Function) {
			if (!rule(pw))
				return false;
		}
	}

	// great success!
	return true;
}

您可以在這裡下載它 .

如果您有任何功能請求或其他關於如何改進它的建議,或者您是否需要為其編寫自定義規則的幫助,請讓我知道。


Tutorial JavaScript 教程
  1. 如何使用 Node.js 將內容附加到文件

  2. 何時在 JavaScript 中使用 `const` 與 `let` 與 `var`?

  3. 最好的 JavaScript 框架是什麼?

  4. 從外部文件訪問json數據

  5. JavaScript 擴展 |關鍵詞

  6. svg / d3.js 矩形一個角上的圓角

  7. MongoDB GridFS

  1. 使用遞歸構建 React 幻燈片

  2. 使用 React 的披薩外賣網站

  3. jQuery .on() 方法看不到新元素

  4. Javascript:從數組中刪除特定元素

  5. 如何克服求職面試編碼挑戰

  6. 像專業人士一樣過濾數組

  7. 你能在 Raspberry pi 上運行 Copilot,答案出人意料地是。

  1. Webpack、babel 和 Modern Webapp 解釋

  2. 在 React 中使用 Appwrite 進行身份驗證 - 第 2 部分

  3. React Native 如何降低您的開發成本

  4. Map、Filter、Reduce 與 For 循環(語法)