前端如何效验安全域名?

Fade
  • 15

场景

https://www.t.com/login.html?redirect=${url}

登录后locaction.href到redirect 这个url地址

但是我要保证这个url 是我主域名以及我非一级域名的安全域名,如何做效验?

诉求

求一个正则:

  1. 开头可能存在https:// 或者http://
  2. 其次:字母或者数字或者-或者. 的组合
  3. 其次:t.cn 或者t.cn/* 结尾

匹配:

t.cn
t.cn/sss
s.t.cn
s.t.cn/
www.t.cn
s.t.cn/sss
https://t.cn
https://www.t.cn
https://www.t.cn/34343
https://t.cn/fsffdsf
https://ss.t.cn
https://s3-4s.t.cn
https://s3s.t.cn
https://zz.ss.t.cn
https://ss.t.cn/fsfsfs
https://ss.t.cn/fs/435/sf

不匹配:

htttp://danger.com/a=t.cn
htttp://danger.com?a=t.cn
htttp://danger.com/t.cn
htttp://3t.cn
htttp://s.3t.cn
回复
阅读 236
3 个回答
function isValid(url) {
    if (!url.startsWith('http')) url = 'http://' + url;
    try { 
        return new URL(url).host.endsWith('t.cn');
    }catch(e) {
        return false;
    }
}
isValid('s.t.cn/sss')

并不建议用正则,使用原生的 URL 对象进行解析地址更加标准。

/^(https?:\/\/)?([a-zA-Z0-9]{0,}(-?[a-zA-Z0-9]){0,}\.){0,}t\.cn(\/[a-zA-Z0-9]+){0,}\/?$/

解释:
https://regexper.com/#%2F%5E%...

不确定类似这种https://t.cn/sss/ 是否满足需求,给的是满足这种的

console.log(`t.cn
t.cn/sss
s.t.cn
s.t.cn/
www.t.cn
s.t.cn/sss
https://t.cn
https://www.t.cn
https://www.t.cn/34343
https://t.cn/fsffdsf
https://ss.t.cn
https://s3-4s.t.cn
https://s3s.t.cn
https://zz.ss.t.cn
https://ss.t.cn/fsfsfs
https://ss.t.cn/fs/435/sf`.split('\n').map(test));

console.log(`htttp://danger.com/a=t.cn
htttp://danger.com?a=t.cn
htttp://danger.com/t.cn
htttp://3t.cn
htttp://s.3t.cn
---.t.cn
...t.cn
s-.t.cn
-s.t.cn
.s.t.cn
s..t.cn
s-.t.cn`.split('\n').map(test));

function test(url) {
    // 考虑了是否是合法域名的正则
    return /^(https?:\/\/)?([\da-zA-Z]+(-?[\da-zA-Z])*\.)*t\.cn(\/.*)?$/.test(url)
}
你知道吗?

宣传栏