PHP实现防盗链的方法分析

PHP实现防盗链的方法分析

什么是防盗链?

防盗链是指在网页制作和浏览时,为防止他人在未经允许情况下盗用自己网站资源,也就是防止其他网站将本站的图片等媒体资源引用到自己的网站上。

PHP实现防盗链的方法

方法一:根据Referrer来判断

在HTTP请求头中,将发送来请求的页面地址和该页面上的链接按照上述格式传送给服务器,这个“发送来请求的页面地址”就是Referrer。

例如:若A网站上有一张图片,B网站引用的时候通过URL的方式指向了A网站的图片,那么在A网站的服务器里,也就是接收方式,服务器判断远程那个网站在调用自己的资源的时候,就会根据请求头中的Referer信息验证调用者是否是合法的网站。

代码示例:

$referer = $_SERVER['HTTP_REFERER'];
// 判断refer是否为空
if (empty($referer)) {
    echo "无referer访问";
    exit;
}
// 解析当前url
$url = parse_url($referer);
// 获取域名
$refererHost = $url['host'];
// 定义被允许的域名
$allowHosts = array('example1.com', 'example2.com');
// 判断访问的是否允许的refer
if (!in_array($refererHost, $allowHosts)) {
    echo "访问来源不允许";
    exit;
}

方法二:直接判断HTTP请求头

这个方法与上面的方法类似,不过是直接判断HTTP请求头部包含的关键字,比如公司名称、域名等。这种方式简单实用,但可以被特定的请求头绕过,需要注意。

代码示例:

if (!isset($_SERVER['HTTP_X_REQUESTED_WITH']) || strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) != 'xmlhttprequest') {
    echo "非法访问";
    exit;
}

总结

以上是PHP实现防盗链的两种方法,具体使用什么方法可以根据实际情况来选择。需要注意的一点是,防盗链是不能百分百防止盗链,只能降低盗链的概率。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:PHP实现防盗链的方法分析 - Python技术站

(0)
上一篇 2023年6月15日
下一篇 2023年6月15日

相关文章

  • Java结构型模式之桥接模式详解

    Java结构型模式之桥接模式详解 概述 桥接模式是一种用于软件设计的结构型模式,最早由著名的设计模式书籍《设计模式:可复用面向对象软件的基础》中的Gamma等人提出。 桥接模式的主要目的是将抽象部分和实现部分分离,分别放在不同的类层次结构中,从而实现它们之间的独立变换。通过分离抽象部分和实现部分,可以使它们可以相对独立地变化,从而可以大大降低它们之间的耦合度…

    Java 2023年5月20日
    00
  • 原生JS实现$.param() 函数的方法

    当我们使用jQuery库时,我们通常使用$.param()函数来将一个对象序列化为一个字符串形式的参数列表,以便可以在URL,Ajax请求等中使用。但是如果我们需要在没有引入jQuery的情况下使用该函数,我们可以考虑使用原生JS来实现。 下面是用原生JS实现$.param()函数的方法: 1. 将一个对象序列化为查询字符串 将一个对象序列化为查询字符串的方…

    Java 2023年6月15日
    00
  • Java axios与spring前后端分离传参规范总结

    Java axios与Spring前后端分离传参规范总结 本攻略主要介绍了在Java axios与Spring前后端分离的开发中,如何进行传参规范。 一、传参规范 在前后端分离的开发中,一般通过JSON格式传递参数。在发送请求时,需要规范JSON数据的格式,保证后端能够正确解析参数。 以axios请求为例,将参数封装在data属性中,如下: javascri…

    Java 2023年6月3日
    00
  • 如何创建线程?

    以下是关于如何创建线程的完整使用攻略: 如何创建线程? 在Java中,可以通过继承Thread类或实现Runnable接口来创建线程。以下是创建线程的步骤: 继承Thread类创建线程 创建一个继承自Thread类的子类,并重写run()方法。 java public class MyThread extends Thread { public void r…

    Java 2023年5月12日
    00
  • SpringBoot与SpringMVC中参数传递的原理解析

    在SpringBoot和SpringMVC中,参数传递是Web开发中的重要部分。本文将详细讲解SpringBoot和SpringMVC中参数传递的原理解析,并提供两个示例说明。 SpringBoot中参数传递 在SpringBoot中,我们可以使用@RequestParam注解来获取请求参数。下面是一个示例: @GetMapping("/user&…

    Java 2023年5月18日
    00
  • java读取文件内容为string字符串的方法

    下面是详细讲解“Java读取文件内容为String字符串的方法”的完整攻略。 1. 读取整个文件 可以使用Java中的java.nio.file.Files类读取整个文件,具体的方法是readString。这个方法会读取整个文件的内容,并将其返回一个字符串形式。 import java.nio.file.Files; import java.nio.file…

    Java 2023年5月26日
    00
  • Java的Struts框架报错“ActionServletMappingException”的原因与解决办法

    当使用Java的Struts框架时,可能会遇到“ActionServletMappingException”错误。这个错误通常由以下原因之一起: ServletMapping配置错误:如果配置文件中没有正确ServletMapping,则可能会现此错误。在这种情况下,需要检查文件以解决此问题。 ServletMapping无效:如果ServletMappin…

    Java 2023年5月5日
    00
  • 基于jsp的井字游戏实例

    让我详细讲解一下“基于jsp的井字游戏实例”的完整攻略,具体如下: 1. 概述 本教程将介绍如何使用jsp开发一个简单的井字游戏,主要包括前端界面设计和涉及的后端交互,帮助读者理解jsp技术的应用和实现过程。 2. 前端界面设计 在本次实例中,我们将使用html和css设计前端界面,并使用javascript来完成井字游戏的交互逻辑。具体实现如下: 首先我们…

    Java 2023年6月15日
    00
合作推广
合作推广
分享本页
返回顶部