diff --git a/src/utils/request.js b/src/utils/request.js index 5f58aac..a1a99e5 100644 --- a/src/utils/request.js +++ b/src/utils/request.js @@ -119,7 +119,10 @@ service.interceptors.request.use( requestUrl += '?' + paramsString } } + const signature = generateRequestSignature(userId, timestamp, method, requestUrl, userSecret) + console.log(signature); + console.log(requestUrl); config.headers['timestamp'] = timestamp config.headers['X-Signature'] = signature } catch (error) { diff --git a/src/utils/validate.js b/src/utils/validate.js index 2c442f1..fc49f90 100644 --- a/src/utils/validate.js +++ b/src/utils/validate.js @@ -5,30 +5,38 @@ * @returns {Boolean} */ export function isPathMatch(pattern, path) { - const regexPattern = pattern.replace(/\//g, '\\/').replace(/\*\*/g, '.*').replace(/\*/g, '[^\\/]*') - const regex = new RegExp(`^${regexPattern}$`) - return regex.test(path) + const regexPattern = pattern + .replace(/\//g, '\\/') + .replace(/\*\*/g, '.*') + .replace(/\*/g, '[^\\/]*') + const regex = new RegExp(`^${regexPattern}$`) + return regex.test(path) } /** - * 判断value字符串是否为空 + * 判断value字符串是否为空 * @param {string} value * @returns {Boolean} */ export function isEmpty(value) { - if (value == null || value == "" || value == undefined || value == "undefined") { - return true - } - return false + if ( + value == null || + value == '' || + value == undefined || + value == 'undefined' + ) { + return true + } + return false } /** - * 判断url是否是http或https + * 判断url是否是http或https * @param {string} url * @returns {Boolean} */ export function isHttp(url) { - return url.indexOf('http://') !== -1 || url.indexOf('https://') !== -1 + return url.indexOf('http://') !== -1 || url.indexOf('https://') !== -1 } /** @@ -37,7 +45,7 @@ export function isHttp(url) { * @returns {Boolean} */ export function isExternal(path) { - return /^(https?:|mailto:|tel:)/.test(path) + return /^(https?:|mailto:|tel:)/.test(path) } /** @@ -45,8 +53,8 @@ export function isExternal(path) { * @returns {Boolean} */ export function validUsername(str) { - const valid_map = ['admin', 'editor'] - return valid_map.indexOf(str.trim()) >= 0 + const valid_map = ['admin', 'editor'] + return valid_map.indexOf(str.trim()) >= 0 } /** @@ -54,8 +62,9 @@ export function validUsername(str) { * @returns {Boolean} */ export function validURL(url) { - const reg = /^(https?|ftp):\/\/([a-zA-Z0-9.-]+(:[a-zA-Z0-9.&%$-]+)*@)*((25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]?)(\.(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])){3}|([a-zA-Z0-9-]+\.)*[a-zA-Z0-9-]+\.(com|edu|gov|int|mil|net|org|biz|arpa|info|name|pro|aero|coop|museum|[a-zA-Z]{2}))(:[0-9]+)*(\/($|[a-zA-Z0-9.,?'\\+&%$#=~_-]+))*$/ - return reg.test(url) + const reg = + /^(https?|ftp):\/\/([a-zA-Z0-9.-]+(:[a-zA-Z0-9.&%$-]+)*@)*((25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]?)(\.(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])){3}|([a-zA-Z0-9-]+\.)*[a-zA-Z0-9-]+\.(com|edu|gov|int|mil|net|org|biz|arpa|info|name|pro|aero|coop|museum|[a-zA-Z]{2}))(:[0-9]+)*(\/($|[a-zA-Z0-9.,?'\\+&%$#=~_-]+))*$/ + return reg.test(url) } /** @@ -63,8 +72,8 @@ export function validURL(url) { * @returns {Boolean} */ export function validLowerCase(str) { - const reg = /^[a-z]+$/ - return reg.test(str) + const reg = /^[a-z]+$/ + return reg.test(str) } /** @@ -72,8 +81,8 @@ export function validLowerCase(str) { * @returns {Boolean} */ export function validUpperCase(str) { - const reg = /^[A-Z]+$/ - return reg.test(str) + const reg = /^[A-Z]+$/ + return reg.test(str) } /** @@ -81,8 +90,8 @@ export function validUpperCase(str) { * @returns {Boolean} */ export function validAlphabets(str) { - const reg = /^[A-Za-z]+$/ - return reg.test(str) + const reg = /^[A-Za-z]+$/ + return reg.test(str) } /** @@ -90,8 +99,9 @@ export function validAlphabets(str) { * @returns {Boolean} */ export function validEmail(email) { - const reg = /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/ - return reg.test(email) + const reg = + /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/ + return reg.test(email) } /** @@ -99,7 +109,7 @@ export function validEmail(email) { * @returns {Boolean} */ export function isString(str) { - return typeof str === 'string' || str instanceof String + return typeof str === 'string' || str instanceof String } /** @@ -107,10 +117,10 @@ export function isString(str) { * @returns {Boolean} */ export function isArray(arg) { - if (typeof Array.isArray === 'undefined') { - return Object.prototype.toString.call(arg) === '[object Array]' - } - return Array.isArray(arg) + if (typeof Array.isArray === 'undefined') { + return Object.prototype.toString.call(arg) === '[object Array]' + } + return Array.isArray(arg) } /** @@ -119,19 +129,19 @@ export function isArray(arg) { * @returns {Boolean} */ export function isIPv4(ip) { - if (typeof ip !== 'string') return false - // 基础格式校验:四段数字 - const parts = ip.split('.') - if (parts.length !== 4) return false - for (let i = 0; i < parts.length; i++) { - const seg = parts[i] - // 不能为空,必须为数字,不能有前导零(允许单个0) - if (seg === '' || /\D/.test(seg)) return false - if (seg.length > 1 && seg[0] === '0') return false - const n = Number(seg) - if (n < 0 || n > 255) return false - } - return true + if (typeof ip !== 'string') return false + // 基础格式校验:四段数字 + const parts = ip.split('.') + if (parts.length !== 4) return false + for (let i = 0; i < parts.length; i++) { + const seg = parts[i] + // 不能为空,必须为数字,不能有前导零(允许单个0) + if (seg === '' || /\D/.test(seg)) return false + if (seg.length > 1 && seg[0] === '0') return false + const n = Number(seg) + if (n < 0 || n > 255) return false + } + return true } /** @@ -140,8 +150,8 @@ export function isIPv4(ip) { * @returns {number} */ function ipv4ToInt(ip) { - const [a, b, c, d] = ip.split('.').map(Number) - return ((a << 24) >>> 0) + (b << 16) + (c << 8) + d + const [a, b, c, d] = ip.split('.').map(Number) + return ((a << 24) >>> 0) + (b << 16) + (c << 8) + d } /** @@ -151,6 +161,27 @@ function ipv4ToInt(ip) { * @returns {Boolean} */ export function isIPv4RangeOrder(start, end) { - if (!isIPv4(start) || !isIPv4(end)) return false - return ipv4ToInt(start) <= ipv4ToInt(end) -} \ No newline at end of file + if (!isIPv4(start) || !isIPv4(end)) return false + return ipv4ToInt(start) <= ipv4ToInt(end) +} + +/** + * 统一安全校验方法 + * 使用方法:validSecurity(str) 返回 true/false + */ + +/** + * 统一安全校验方法 + * 使用方法:validSecurity(str) 返回 true/false + */ + +export function validSecurity(str) { + if (!str || typeof str !== 'string') { + return true; + } + + // 将所有正则模式合并为一个统一的正则表达式 + const securityRegex = /