验证域名是否在白名单中是编程时常用到的功能,对安全性有要求的项目中都有该功能。常见的使用场景有登录后回跳,跳转到外站时弹出安全提示等。

知乎登录后回跳;

只要有登录的地方就需要用到来源回跳。我们在一个页面www.baidu.com 调用知乎的登录框,登录成功后知乎会回跳到 www.baidu.com 吗?肯定不会。因为 www.baidu.com 不是知乎自己的域名。所以知乎在登录验证成功后会校验这个 Referer 参数(就是 www.baidu.com )。当 Referer 属于知乎或者腾讯(知乎被腾讯收购了)的域名才会跳转。

跳转到外站时弹出安全提示;

在QQ邮箱中,当我们点击邮件中的链接,跳转到非腾讯系的网站时都会弹出提示框告诉用户你可能会跳到钓鱼网站。

通过我的测试发现很多知名网站都存在『校验白名单』被绕过的问题。看起来很简单的功能,稍不注意就会给自己埋下大坑。

真实的情况比上文举例复杂的多,例如域名白名单需要支持所有多级域名,需要支持端口号,需要支持http,https,tcp,ftp等等。

在踏过无数坑之后,我通过正则完美的解决了如上所有问题,希望大家不要再踩我踩过的坑。另外我建议通过我的测试方法测试你的代码是否安全。

PHP版本

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37function filterURL($url)

{

$allowDomains = ["test.com", "demo.com"];

foreach ($allowDomains as &$val) {

$val = sprintf((%s), str_replace(".", "\.", $val));

}

$domainStr = sprintf((%s), join("|", $allowDomains));

$pattern = "/^((http://)|(https://)|(//))?([0-9a-zA-Z\._:\-]*[\.@])?" . $domainStr

. "(:[0-9]+)?(/.*)?$/";

if (preg_match($pattern, $url)) {

return true;

} else {

return false;

}

}

var_dump(filterURL("bb.com@test.com")); //true

var_dump(filterURL("test.com@bb.com")); //false

var_dump(filterURL("//test.com")); //true

var_dump(filterURL("http://test.com")); //true

var_dump(filterURL("https://test.com")); //true

var_dump(filterURL("https://test.com:8080/aa.com")); // true

var_dump(filterURL("https://bC.com:N:C@test.com")); //true

var_dump(filterURL("https://a.test.com:8080/aa.com")); // true

var_dump(filterURL("//bb:com@test.com/sss")); // true

var_dump(filterURL("//bb:cc.com@test.com")); // true

var_dump(filterURL("//bb:bb.com@test.com")); // true

var_dump(filterURL("http://test.com")); // true

var_dump(filterURL("https://:test.com")); //false

var_dump(filterURL("https://aA.com?test.com")); //false

var_dump(filterURL("https://aA.com#test.com")); //false

var_dump(filterURL("https://aA.com\test.com")); //false

var_dump(filterURL("javasCript:test.com")); // false

var_dump(filterURL("http://abctest.com")); // false

var_dump(filterURL("http://com:\@test.com")); // false

var_dump(filterURL("http://test.com@aa.com")); // false

var_dump(filterURL("https://test.com:aa.com")); // false

JavaScript版本

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32function filterURL(url){

var allowDomains = ["test.com", "demo.com"];

var domainStr = "", result = [];

for (i = 0; i < allowDomains.length; i++) {

allowDomains[i] = "(" + allowDomains[i].replace(".", "\.") + ")";

}

domainStr = "(" + allowDomains.join("|") + ")";

regStr = new RegExp("^((http://)|(https://)|(//))?([0-9a-zA-Z\._:\-]*[\.@])?" + domainStr + "(:[0-9]+)?(/.*)?$");

result = url.match(regStr);

return !!(result && result[0]);

}

console.log(filterURL("bb.com@test.com")); //true

console.log(filterURL("test.com@bb.com")); //false

console.log(filterURL("//test.com")); //true

console.log(filterURL("http://test.com")); //true

console.log(filterURL("https://test.com")); //true

console.log(filterURL("https://test.com:8080/aa.com")); // true

console.log(filterURL("https://bC.com:N:C@test.com")); //true

console.log(filterURL("https://a.test.com:8080/aa.com")); // true

console.log(filterURL("//bb:com@test.com/sss")); // true

console.log(filterURL("//bb:cc.com@test.com")); // true

console.log(filterURL("//bb:bb.com@test.com")); // true

console.log(filterURL("http://test.com")); // true

console.log(filterURL("https://:test.com")); //false

console.log(filterURL("https://aA.com?test.com")); //false

console.log(filterURL("https://aA.com#test.com")); //false

console.log(filterURL("https://aA.com\test.com")); //false

console.log(filterURL("javasCript:test.com")); // false

console.log(filterURL("http://abctest.com")); // false

console.log(filterURL("http://com:\@test.com")); // false

console.log(filterURL("http://test.com@aa.com")); // false

console.log(filterURL("https://test.com:aa.com")); // false

有经验的程序员不难发现最核心的代码就是正则表达式,所以其他语言能很好的移植。最后,请牢记安全无小事,编码需谨慎。

php 域名白名单,域名白名单验证相关推荐

  1. 360白名单域名有什么作用

    一般网站被拦截,一是因为网站没有产品的资质,二是因为网站被同行恶意举报.网站被拦截的绝大部分因素都是被举报的.360白名单域名,360认证域名,360照妖镜百分百域名.都可以提升网站信誉度,保障网站的 ...

  2. JS安全域名验证,安全域名效验,安全域名检查,正则表达式RegExp检查域名,截取字符串检查域名,检查域名url前缀的域名部分是否包含指定域名

    JS安全域名验证,安全域名效验,安全域名检查,正则表达式RegExp检查域名,截取字符串检查域名,检查域名url前缀的域名部分是否包含指定域名 安全域名列表 var DomainArray=['run ...

  3. 阿里云主机迁移 配置域名解析 顶级域名配置子域名

    如果我的文章能给你帮助,请给我一个赞,你的鼓励是我创作的动力! 本教程适合同账号下不同主机之间的迁移.若是跨账号或者是跨VPC的请参考阿里的教程,其实都是差不错,也是生成镜像,制作镜像,然后可能多了一 ...

  4. 什么是域名到期?域名到期抢注要怎么进行?

    做seo很多人都需要老域名,对那些到期的域名进行抢注,在最近几年变得格外火热,下面怀米网和大家介绍一下什么是域名到期和域名到期抢注要怎么进行. 什么是域名到期? 域名到期后,假如在一个月时间内没有进行 ...

  5. 我有一个域名_一个域名可以绑定几个网站?域名解析多少子域名?

    一个域名可以绑定几个网站?域名解析多少子域名?一个域名可以解析无数的子域名,这些子域名是顶级域名的下一级,整个域名包含两个."或者包括"."等等.下面聚名网小编就带大家看 ...

  6. MVC利用Routing实现多域名绑定一个站点、二级域名以及二级域名注册Area

    最近有这么个需求:在一个站点上绑定多个域名,每个域名进去后都要进入不同的页面.实现了这个功能以后,对于有多个域名,且有虚拟空间,但是虚拟空间却只匹配有一个站点的用户来说,可以节省很多小钱钱. 很久以前 ...

  7. 微信小程序 服务器域名和业务域名 区别,小程序合法域名和业务域名的区别

    小程序合法域名和业务域名的区别 内容精选 换一换 AppCube允许将标准页面或高级页面发布到微信小程序.本节将介绍在AppCube上发布应用到微信小程序的基本操作,包括:微信公众平台小程序注册.小程 ...

  8. 网站换域名,老域名权重值能转到新网站吗?

    如果企业想更换域名,那么之前的老域名权重值会作废吗?老域名的权重值能转移到新网站吗? 老域名 1.老域名权重值能转移到新网站吗? 可以,在搜索蜘蛛看来,如果用优质老域名,旧域名的权重会叠加到新域名上, ...

  9. https证书中的泛域名和多域名通配符

    SSL证书中的泛域名SSL证书就是我们通常说的通配符SSL证书,英文名是Wildcard Certificates,和普通的域名SSL证书一样可以对网站的信息传输进行加密,也可以对服务器身份进行验证. ...

最新文章

  1. http通信协议的基本原理
  2. azure linux 磁盘,在Azure Linux VM中,还有什么?什么磁盘收费?
  3. oracle 交叉链接,Oracle里的交叉SQL语句写法-数据库专栏,ORACLE
  4. 【NOIP】OpenJudge - 15:银行利息
  5. matlab设置ga算法,matlab遗传算法ga函数
  6. c#.net 无法直接启动带有“类库输出类型”的项目
  7. atitit 数字音频技术概论 艾提拉著 目录 1. 声学基础 2 1.1. 1.2人耳的听觉效应9 2 2. 第1章数字音频基础 2 2.1. 1.1音频的发展历史 2 2.2. 1.2音频的发展
  8. 微波烹调,营养损失多or少?
  9. 中缀表达式转前缀表达式
  10. python报错记录No.1
  11. 华为手机助手上架流程_华为手机助手导入音乐文件在哪里看 详细步骤介绍
  12. 爬取招聘信息并进行数据分析及可视化
  13. 从共享征信黑名单到建立白名单体系:LinkEye想打造基于区块链的征信联盟
  14. 自建企业邮箱如何选择服务器
  15. 免费Excel自动化转云端OA/ERP/CRM等办公系统数据管理软件工具
  16. 最全Pycharm教程(14)——Pycharm编辑器功能总篇
  17. C语言编程>第二十五周 ① 给定程序中,函数fun的功能是:在形参s所指字符串中的每个非数字字符之后插入一个“*”号。
  18. 选择排序法(C语言)
  19. 脉冲函数、阶跃函数和斜坡函数及脉冲响应
  20. linux的Netstat命令详解

热门文章

  1. 富士施乐2022网络扫描设置_富士施乐(FUJI XEROX)全系列复印机产品介绍
  2. 字符串字段当条件查询的时候需要加引号吗_如此详细的SQL优化教程,是你需要的吗?...
  3. PHP页面中嵌套go语言,go语言嵌套类型的使用细节
  4. 互动直播的视频录制与合成—支持多人离线重入
  5. oracle应收模块核销点不上,详解EBS接口开发之应收款处理
  6. 认识和选购极致画质的显示器
  7. sdk开发包如何使用_SDK如何使能行业?华为昇腾要用软件充分释放硬件性能
  8. java 安卓下载文件_GitHub - Charay/downloadfile: 使用Retrofit2+Rxjava+Rxandroid+okhttp的方式下载文件并存储到sd卡指定目录...
  9. 路由虚拟端口配置dhcp服务器,交换机和路由器DHCP设置中的端口配置
  10. datatable怎么根据两列分组_公司要IT转型,我该怎么办?用Python进行数据处理