检查PHP脚本是否用作<img/>源

时间:2015-05-05 15:52:45

标签: php http-headers

是否可以确定PHP脚本的输出是用作图像还是完整网站?

我需要这样的东西:

<?php
    if(clientRequestedImage()) {
        header("Content-Type: image/png");
        readfile("image.png");
    } else {
        readfile("image-wrapped.html");
    }
?>

因此,当我稍后使用<img src="script.php">时,将显示一个图像,当我使用地址栏或链接打开脚本时,将出现一个HTML文档。

我应该如何实现函数clientRequestedImage

类似的问题:Check if site is inside iframe

3 个答案:

答案 0 :(得分:3)

免责声明:这只是一种预感,我不确定这是否适用于所有浏览器(应该在最新的Chrome和Firefox中,至少应该是我测试过的)。

您可以解析客户端的Accept HTTP标头。客户端使用Accept header来指定浏览器应该向其发送响应的媒体类型。此标头的示例如下:

Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept: image/png,image/*;q=0.8,*/*;q=0.5

Chrome和Firefox 似乎在请求常规网站时始终发送Accept: text/html,...标头,并在加载由{{1嵌入的图片时Accept: image/...的某些变体标签。

您可以通过<img>变量在PHP中访问此标头。所以你可能能够做到这样的事情:

$_SERVER['HTTP_ACCEPT']

答案 1 :(得分:1)

大概是可重复使用的,您还需要知道图像名称或要引用的内容,因此可能会出现如下图像标记:

<img src="script.php?image=logo">

然后(这不安全,您需要将获取数据列入白名单或以其他方式消毒):

if(isset($_GET['image'])) {
    header("Content-Type: image/png");
    readfile($_GET['image'] . "image.png");
} else {
    readfile("image-wrapped.html");
}

如果没有,那么就像这样简单:

<img src="script.php?image">

或者:

<img src="script.php?html">    

然后检查isset($_GET['image'])等...

答案 2 :(得分:0)

  

你没有回答我的两个问题。如果我想要两个不同的   网址,我会使用<img src="image.png"><a href="site.html">   直接..

这条评论让我想到了网址重写。正如你在链接到的文章中提到的那样,HTTP Referrer只有3个选项。就像@AbraCadaver提到的那样,选项3最好,使用URL参数。

如果您坚持在一个脚本中执行此操作,则必须利用URL Rewrite。这允许您屏蔽URL参数。这样你就有了一些条件让PHP知道要呈现什么。

以您的示例为例,当浏览器呈现页面时,它会创建一个HTTP请求,以通过其属性<IMG>下载标记SRC指定的图像文件。浏览器为URL创建GET请求,即www.example.com/image.png,并且可以修改或不修改引用者到标题。 <A>标记基于href属性呈现链接,当用户在浏览器中点击此链接时,浏览器会为URL创建GET请求(听起来很熟悉吗?),即{{1 }}

使用URL Rewrite,我们可以检查这两个URL并将流量定向到相同的PHP脚本,在后台调整URL参数。对www.example.com/site.html的请求可以变为/image.pngscript.php?image=image.png的请求可以变为/site.html