php 域名白名单,域名白名单验证

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

知乎登录后回跳;

只要有登录的地方就需要用到来源回跳。我们在一个页面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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/554926.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java Socket与Html5 websocket通信

一、Mysocket.java文件 import org.springframework.stereotype.Component;import javax.websocket.*; import javax.websocket.server.*;// ws://localhost:8080/ws/Tom ServerEndpoint("/ws/{user}") Component public class MySocket {private String currentUse…

matlab 由移相角如何产生移相脉冲,整流电路控制角移相范围是怎么确定的?

整流电路控制角移相范围是怎么确定的&#xff1f;2019-03-14【FrancisQu的回答(28票)】:谢邀^^一言以蔽之&#xff0c;整流电路控制角的范围取决于整流电路直流输出电压平均值时所得的控制角&#xff0c;详细分析如下。基本概念&#xff1a;触发延迟角(控制角)——从晶闸管开始…

php编程对联,形容程序员的对联大全

程序员&#xff0c;是从事程序开发、维护的专业人员。现在有一些形容程序员的对联&#xff0c;学习啦小编为大家整理了一些&#xff0c;感兴趣的&#xff0c;欢迎大家阅读。形容程序员的对联摘抄上联&#xff1a;莫道运维无姝丽&#xff0c;下联&#xff1a;谁言开发不风情?横…

SpringBoot 实现SSE 服务器发送事件

SSE 全称Server Sent Event&#xff0c;直译一下就是服务器发送事件&#xff0c;一般的项目开发中&#xff0c;用到的机会不多&#xff0c;可能很多小伙伴不太清楚这个东西&#xff0c;到底是干啥的&#xff0c;有啥用 本文主要知识点如下&#xff1a; SSE 扫盲&#xff0c;应…

php多表递归查询,使用公用表表达式的递归查询

微软从SQL2005起引入了CTE(Common Table Expression)以强化T-SQL。公用表表达式 (CTE) 具有一个重要的优点&#xff0c;那就是能够引用其自身&#xff0c;从而创建递归 CTE。递归 CTE 是一个重复执行初始 CTE 以返回数据子集直到获取完整结果集的公用表表达式。当某个查询引用递…

php如何把图片存入oracle,在PHP中将图片存放ORACLE中

我这里提供一个用PHP操纵blob字段的例子给你&#xff0c;希望能有所帮助&#xff01;这个例子是把用户上传的图片文件存放到BLOB中。假设有一个表&#xff0c;结构如下&#xff1a;CREATE TABLE PICTURES (ID NUMBER,DESCRIPTION VARCHAR2(100),PICTURE BLOB);然后是用来处理数…

Springboot之整合SSE实现消息推送

Springboot之整合SSE实现消息推送 前言 项目中涉及到部分请求&#xff0c;后端处理时间较长&#xff0c;使用常规Http请求&#xff0c;页面等待时间太长&#xff0c;对用户不友好&#xff0c;故考虑使用长链接进行消息推送&#xff0c;可选方案有WebSocket、SSE&#xff0c;We…

SQL按某字段去重 保留按某个字段排序最大值

select * from tablename as a where not exists ( select 1 from tablename as bwhere b.namea.name and b.id>a.id)talename&#xff1a;要去重复的表 name:需要去重复的字段&#xff0c;可以有多个字段 ID&#xff1a;取id字段最大 例子&#xff1a; create table ta…

oracle将字符串的日期格式化,oracle格式化字符串 oracle 怎么把字符串转换成日期...

Oracle数据库中如何将字符串格式化为日期可以用 to_date(日期类型字符串,要转化的日期类型)函数进行日期格式转换 sql&#xff1a;select to_date(1990-12-12 12:12:32,yyyy-MM-dd hh24:mi:ss) from dual; 解释&#xff1a;此语句的输出结果就是 “1990-12-12 12:12:32”(日期类…

SQL中只要用到聚合函数就一定要用到group by 吗?

SQL中只要用到聚合函数就一定要用到group by 吗? 今天记录一个弱智问题&#xff0c;一直没发现这个问题。 答&#xff1a;看情况 1、当聚集函数和非聚集函数出现在一起时&#xff0c;需要将非聚集函数进行group by 2、当只做聚集函数查询时候&#xff0c;就不需要进行分组了…

oracle排名怎么去除空值影响,Oracle排序中常用的NULL值处理方法

1、缺省处理Oracle在Order by 时缺省认为null是最大值&#xff0c;所以如果是ASC升序则排在最后&#xff0c;DESC降序则排在最前2、使用nvl函数nvl函数可以将输入参数为空时转换为一特定值&#xff0c;如nvl(employee_name,’张三’)表示当employee_name为空时则返回’张三’&a…

Vue中npm run dev 和 npm run serve区别

在运行vue文件时&#xff0c;需要进行npm操作&#xff0c;但我们发现&#xff0c;有时候用的是npm run serve&#xff0c;而有的时候用的是npm run dev&#xff0c;二者有什么区别 在我们运行一些 vue 项目的时候&#xff0c;输入npm run serve或者 npm run dev的其中一个时&a…

SpringBoot导出数据为PDF

一、SpringBoot导出数据为PDF 1、添加所需依赖 <dependency><groupId>com.itextpdf</groupId><artifactId>itextpdf</artifactId><version>5.5.11</version> </dependency> <dependency><groupId>com.itextpdf.…

php安装mem+cache扩展,安装memcached及php扩展

用的是centos系统1、安装memcachedyum -y install memcached安装完成后&#xff0c;memcached -h应该会出现memcached 参数说明2、memcached配置文件vi /etc/sysconfig/memcachedPORT"11210"USER"memcached"MAXCONN"1024"CACHESIZE"64"…

Springboot集成支付宝沙箱支付(完整版)

开发前准备 easy支付官方文档&#xff1a;https://opendocs.alipay.com/open/009ys9 通用版文档&#xff1a;https://opendocs.alipay.com/open/02np94 支付宝沙箱的配置 注册支付宝开发者账户&#xff0c;进入开发者控制台 https://openhome.alipay.com/platform/developer…

mongodb 数组查询 php,关于PHP,查询mongodb里的数组的问题

这一个记录{ “_id” : ObjectId(“56bb7aafa1164ef44e000029”), “qishu” : 21, “shuzi” : [ 69, 15, 86, 40, 20, 67, 46, 13, 36, 23, 33, 26, 9, 49, 81, 96, 65, 31, 52, 75, 99, 6, 39, 74, 47, 42, 1, 94, 82, 91, 5, 27, 30, 28, 7, 90, 34, 37, 79, 70, 18, 87, 5…

Springboot集成支付宝沙箱支付(退款功能)

包括&#xff1a; 支付宝沙箱 支付 异步通知 退款功能 正式版本的sdk 通用版本SDK文档&#xff1a;https://opendocs.alipay.com/open/02np94 <dependency><groupId>com.alipay.sdk</groupId><artifactId>alipay-sdk-java</artifactId><…

oracle 数据库日期定义,Oracle数据库实现日期遍历功能

遍历开始日期到结束日期的每一天&#xff0c;若有查询某段日期下有什么业务或者事件发生时&#xff0c;可用到此函数。 Oracle SQL Developer create or replace type class_date as object( year varchar2(10), month varchar2(10), day varchar2(20))--定义所需要的日期类---…

linux tomcat php配置文件在哪个文件夹下,tomcat下,怎么安配备置php ?(linux系统)

(一)、JDK安装tar.gz为解压后就可使用的版本&#xff0c;这里我们将jdk-8u45-linux-i586.tar.gz解压到/usr/local/下。1、解压[rootTomcat~]#tar-zxvfjdk-8u45-linux-i586.tar.gz2、环境配置[rootTomcat~]#sudovi/etc/profile#setjavaenvironmentJAVA_HOME/usr/local/jdk1.8.0C…

Java递归生成树

1.建菜单表 CREATE TABLE t_menu (id int(11) NOT NULL AUTO_INCREMENT,pid int(11) NOT NULL,name varchar(255) DEFAULT NULL,PRIMARY KEY (id) ) ENGINEInnoDB AUTO_INCREMENT11 DEFAULT CHARSETutf8mb4;2.造一些数据 注意&#xff1a;根节点的pid0&#xff0c;其他节点的p…