Login
网站首页 > 文章中心 > 其它

php中如何防止跨域调用接口

作者:小编 更新时间:2023-08-16 12:47:40 浏览量:361人看过

php 怎样防止跨域提交表单,表单为ajax方式提交

常用方法:

①生成随机hash值,存储session,提交的时候要提交hash值,然后判断提交的hash是否正确;

②验证来路网页的域名,空域名或者不是自己的都返回错误.

怎么解决跨域问题

①.、 通过jsonp跨域

JSONP(JSON with Padding:填充式JSON),应用JSON的一种新方法,

JSON、JSONP的区别:

①.、JSON返回的是一串数据、JSONP返回的是脚本代码(包含一个函数调用)

(类似往页面添加一个script标签,通过src属性去触发对指定地址的请求,故只能是Get请求)

需要调用,可以写一个接口,由这个接口在后端去调用并拿到返回值,然后再返回给index.html

header('Access-Control-Allow-Method:POST,GET');//允许访问的方式

跨域分为两种,一种xhr不能访问不同源的文档,另一种是不同window之间不能进行交互操作;

document.domain主要是解决第二种情况,且只能适用于主域相同子域不同的情况;

document.domain的设置是有限制的,我们只能把document.domain设置成自身或更高一级的父域,且主域必须相同.例如:a.b.example.com中某个文档的document.domain可以设成a.b.example.com、b.example.com 、example.com中的任意一个,但是不可以设成c.a.b.example.com,因为这是当前域的子域,也不可以设成baidu.com,因为主域已经不相同了.

兼容性:所有浏览器都支持;

优点:

可以实现不同window之间的相互访问和操作;

缺点:

只适用于父子window之间的通信,不能用于xhr;

只能在主域相同且子域不同的情况下使用;

使用方式:

不同的框架之间是可以获取window对象的,但却无法获取相应的属性和方法.比如,有一个页面,它的地址是 , 在这个页面里面有一个iframe,它的src是, 很显然,这个页面与它里面的iframe框架是不同域的,所以我们是无法通过在页面中书写js代码来获取iframe中的东西的:

script type="text/javascript"

function test(){

var iframe = document.getElementById('?ifame');

var win = document.contentWindow;//可以获取到iframe里的window对象,但该window对象的属性和方法几乎是不可用的

var doc = win.document;//这里获取不到iframe里的document对象

var name = win.name;//这里同样获取不到window对象的name属性

}

/script

iframe id = "iframe" src="" onload = "test()"/iframe

这个时候,document.domain就可以派上用场了,我们只要把 和 这两个页面的document.domain都设成相同的域名就可以了.

①在页面 中设置document.domain:

document.domain = 'example.com';//设置成主域

alert(document.getElementById('?iframe').contentWindow);//contentWindow 可取得子窗口的 window 对象

document.domain = 'example.com';//在iframe载入这个页面也设置document.domain,使之与主页面的document.domain相同

关键点:window.name在页面的生命周期里共享一个window.name;

最简单的利用了浏览器的特性来做到不同域之间的数据传递;

不需要前端和后端的特殊配制;

安全性:当前页面所有window都可以修改,很不安全;

数据类型:传递数据只能限于字符串,如果是对象或者其他会自动被转化为字符串,如下;

这里写图片描述

使用方式:修改window.name的值即可;

关键点:

兼容性:移动端可以放心用,但是pc端需要做降级处理

优点

不需要后端介入就可以做到跨域,一个函数外加两个参数(请求url,发送数据)就可以搞定;

移动端兼容性好;

缺点

无法做到一对一的传递方式:监听中需要做很多消息的识别,由于postMessage发出的消息对于同一个页面的不同功能相当于一个广播的过程,该页面的所有onmessage都会收到,所以需要做消息的判断;

安全性问题:三方可以通过截获,注入html或者脚本的形式监听到消息,从而能够做到篡改的效果,所以在postMessage和onmessage中一定要做好这方面的限制;

发送的数据会通过结构化克隆算法进行序列化,所以只有满足该算法要求的参数才能够被解析,否则会报错,如function就不能当作参数进行传递;

使用方式:通信的函数,sendMessage负责发送消息,bindEvent负责消息的监听并处理,可以通过代码来做一个大致了解;

Storage.prototype.sendMessage_ = function(type, params, fn) {

if (this.topWindow) {

this.handleCookie_(type, params, fn);

return;

var eventId = this.addToQueue_(fn, type);

var storageIframe = document.getElementById('mip-storage-iframe');

var element = document.createElement("a");

element.href = this.origin;

var origin = element.href.slice(0, element.href.indexOf(element.pathname) ◆ 1);

storageIframe.contentWindow.postMessage({

type: type,

params: params,

eventId: eventId

}, origin);

Storage.prototype.bindEvent_ = function() {

window.onmessage = function (res) {

if (window == res.source.window.parent

res.data.type === this.messageType.RES

window.location.href.match(res.origin.host).length 0) {

var fn = this.eventQueue[res.data.eventId];

fn fn();

delete this.eventQueue[res.data.eventId];

// reset id

var isEmpty = true;

for (var t in this.eventQueue) {

isEmpty = false;

if (isEmpty) {

this.id = 0;

}.bind(this);

php如何防止第三方网站私自调用网站的后端接口

一般不用担心这个的,别人看不到你php的函数.如果非要做的话可以加

A.php:

require_once('B.php');

B.php:

if(!defined('Sign')){

echo '非法调用';

这个方法是B文件检测是否A文件存在Sign常量,也可以说是签名,有签名才能调用,没有签名就输出非法调用

以上就是土嘎嘎小编为大家整理的php中如何防止跨域调用接口相关主题介绍,如果您觉得小编更新的文章只要能对粉丝们有用,就是我们最大的鼓励和动力,不要忘记讲本站分享给您身边的朋友哦!!

版权声明:倡导尊重与保护知识产权。未经许可,任何人不得复制、转载、或以其他方式使用本站《原创》内容,违者将追究其法律责任。本站文章内容,部分图片来源于网络,如有侵权,请联系我们修改或者删除处理。

编辑推荐

热门文章