使用白名单对象验证URL字符串,如何标记非白名单参数与取值?
URL参数白名单验证实现方案
实现思路
- 白名单数据改用
Set结构存储,查询时间复杂度为O(1),比普通数组/对象效率更高 - 采用浏览器原生
URL、URLSearchParamsAPI解析链接,避免手动分割字符串的边界问题(比如无query参数、参数带特殊转义字符等场景) - 遍历参数时两步校验:先校验参数名是否合法,再校验参数对应的每个取值是否匹配对应白名单
完整实现代码
// 合法参数白名单,用Set存储 const validParams = new Set([ "brand", "item", "size", "country" ]) // 各参数对应取值白名单,每个参数对应一个Set const validValueMap = { brand: new Set(["nike", "adidas", "puma"]), item: new Set(["trainers", "jackets", "socks"]), size: new Set(["S", "M", "L", "XL"]), country: new Set(["CN", "US", "JP", "UK"]) } export const Validate = (link) => { const errors = { invalidParams: [], // 存储不合法的参数名 invalidValues: [] // 存储不合法的参数取值,格式为{param: 参数名, value: 非法取值} } try { const url = new URL(decodeURI(link)) const searchParams = url.searchParams // 遍历所有query参数 for(const [param, value] of searchParams.entries()) { // 第一步:校验参数名是否合法 if(!validParams.has(param)) { errors.invalidParams.push(param) continue } // 第二步:拆分参数值(按空格分割多取值),逐个校验合法性 const valueList = value.split(' ') for(const val of valueList) { if(!validValueMap[param].has(val)) { errors.invalidValues.push({ param: param, invalidValue: val }) } } } } catch (e) { console.error('链接解析失败:', e) } console.log('校验结果:', errors) return errors } // 测试示例 Validate("https://example.com/?brand=nike%20adidas%20puma%20cat&item=trainers%20jackets%20socks&random=hello")
测试输出结果
校验结果: { invalidParams: [ 'random' ], invalidValues: [ { param: 'brand', invalidValue: 'cat' } ] }
完全匹配需求,可直接标记出非法参数random和非法brand取值cat。
内容的提问来源于stack exchange,提问作者Freddy.
相关产品推荐
相关产品推荐

