跨域是Web开发中常见的问题,解决跨域的方法也有很多。本文以CORS(跨域资源访问)方式和大家一起来了解一下针对PHP语言,如何设置允许多域名访问。

首先,我们还需要对一些基础知识有了解。

(1)服务器变量

针对PHP语言而言,服务器变量存储在$_SERVER数组中,在这个数组中有一个特殊的键值:HTTP_ORIGIN。这个键只在跨域的时候才会存在值,同源时为空字符串。

(2)响应头设置允许某域名访问:access-control-allow-origin

通过PHP的header函数可以设置允许某域名跨域访问,形式为header('access_control_allow_origin:*')。

OK,下面直接上代码

$allow_origin = array('a.baidu.com','b.baidu.com',
);
$origin = isset($_SERVER['HTTP_ORIGIN']) ? $_SERVER['HTTP_ORIGIN'] : '';  //跨域访问的时候才会存在此字段
if (in_array($origin, $allow_origin)) {header('Access-Control-Allow-Origin:' . $origin);
} else {return;
}

note:

有一点要特别注意:通过接口工具请求接口时$_SERVER['HTTP_ORIGIN']变量也为空字符串,如果你的服务外网可以访问,那你一定要注意了。

================20181107 更新===============

背景:

11月2号服务上线,上线之后发现邮件组里收到了一些乱七八糟的邮件而且数据库里也插入了一些乱码的数据。可以判定,后端服务被攻击了。

追查:

查看线上机器日志,发现日志中记录的来源域名均为空,之前做的策略无效。后端Web Server是Nginx,在经过外网到内网流量调度、接入层转发之后,业务中无法取到$_SERVER['HTTP_ORIGIN']变量。

解决:

针对这种情况,想了以后几种解决方案:

(1)在Nginx中配置跨域

(2)做邮箱(手机号)验证码校验

(3)前端做拖图校验

第一种方案实践不可行,不知道是不是配置的问题,不起作用。

第三种方案需要使用到PHP的GD库、redis缓存以及开发量大,也弃用。

经过与PM FE UE商定,最终采用手机号进行验证码校验。

经过两天的开发、测试、上线,目前线上尚未发现之前的攻击问题。

note:后端服务接口不可能完全避免被刷,可做的就是增加黑客的攻击成本。

PHP 设置多域名允许跨域访问相关推荐

  1. 允许跨域访问_PHP设置多域名允许跨域访问

    php中文网最新课程 每日17点准时技术干货分享 针对 PHP 语言设置多域名允许跨域访问 服务器变量: 服务器变量存储在 $_SERVER 数组中,在这个数组中有一个特殊的键值:HTTP_ORIGI ...

  2. java设置access-allow_Java中设置多个Access-Control-Allow-Origin跨域访问

    1.如果服务端是Java开发的,添加如下设置允许跨域即可,但是这样做是允许所有域名都可以访问,不够安全. response.setHeader("Access-Control-Allow-O ...

  3. ajax跨域请求wcf,ajax wcf 指定某个域名 进行跨域访问

    Hi fss, 你是怎么实现ajax wcf发布后可以被任意域名访问的? 根据我的理解和测试,创建一个新的wcf ajax enabled service是不支持跨域访问的.需要自己加功能来实现跨域访 ...

  4. js 设置beforeSend,实现跨域访问

    受浏览器的同源策略限制,JavaSript只能请求本域内的资源.跨域资源共享(Cross-Origin Resource Sharing, CORS)是为解决Ajax技术难实现跨域问题而提出的一个规范 ...

  5. 西北乱跑娃 -- fastapi设置静态文件以及跨域访问

    import sys sys.path.append('../') from fastapi import FastAPI, Request from fastapi.responses import ...

  6. ajax 设置Access-Control-Allow-Origin实现跨域访问

    版权声明:本文为博主原创文章,未经博主允许不得转载.如需转载可私信或关注公众号fdipzone-idea与我联系. https://blog.csdn.net/fdipzone/article/det ...

  7. php accesscontrolalloworigin,设置Access-Control-Allow-Origin实现跨域访问

    这篇文章主要介绍了Ajax 设置Access-Control-Allow-Origin实现跨域访问,非常不错,具有参考借鉴价值,需要的朋友可以参考下 ajax跨域访问是一个老问题了,解决方法很多,比较 ...

  8. 第一百一十期:详解SpringBoot应用跨域访问解决方案

    说到跨域访问,必须先解释一个名词:同源策略.所谓同源策略就是在浏览器端出于安全考量,向服务端发起请求必须满足:协议相同.Host(ip)相同.端口相同的条件,否则访问将被禁止,该访问也就被称为跨域访问 ...

  9. ssm项目解决AJAX跨域,ssm项目跨域访问

    最近使用ssm开发了一个项目,为了项目的开发速度,采用的是前后端同时开发,所以前端文件没有集成在项目中,最后在调试时涉及到了跨域.跨域的解决方法很多,我采用的是最简单的一种,代码如下: 新建一个过滤器 ...

最新文章

  1. python手机版打了代码运行不了-android手机安装python并写代码运行
  2. c++中同名函数的三个不同术语(c++细节篇八)
  3. C/C++Linux服务器开发/高级架构师
  4. machine learning学习笔记
  5. 音视频技术开发周刊 | 173
  6. 【收集】ADOADO.NET 读取 Oracle 数据集
  7. 只需10分钟!就能用Flask,Docker和Jenkins部署机器学习模型
  8. 亚马逊出的平板电脑_美国最畅销的安卓平板电脑,还只有2GB内存
  9. JS 表单、表单验证(表单判断、get、post、submit、validity、checkValidity)
  10. [后缀数组] Luogu P5028 Annihilate
  11. rabbitMQ windows 下安装
  12. 《C专家编程》之 内存泄漏
  13. go Test Benchmark 性能测试
  14. 致远OA单点登陆到第三方系统(零代码实现)
  15. Redis imgrate迁移键 (error) ERR Target instance replied with error: NOAUTH Authentication required.
  16. keras调试的正确打开方式: 一句话让你把tensorflow当pytorch用
  17. 栈 括号匹配问题(C语言)
  18. 10.17——10.24ACM笔记
  19. 【Moasure魔尺】优秀景观设计师们悄悄在用的测量设备
  20. linux下如何make文件夹,Linux makefile 教程 非常详细,且易懂

热门文章

  1. 8086条件转移指令JNE,JNZ
  2. ITSM | 对话龙智资深技术顾问,探讨ITSM实践如何从过去转向未来
  3. 一个小流氓的色情往事
  4. 【Android】OkHttp源码解读逐字稿(1)-拦截器
  5. 留言板管理系统 jsp + servlet + mysql (2004)
  6. Cache 'redisCache' does not allow 'null' values;设置值为空时不存入Redis;设置unless无效;
  7. 敏捷领导力 - 修自己(练内功)
  8. Android自定义Camera2相机
  9. centos7篇---禁用默认的驱动nouveau,安装cuda和cudnn
  10. 《SPA设计与架构》之认识SPA