PHP 响应头技巧

PHP response-header tricks

index.php:

<style type="text/css">
img {
width: 50px;
}
</style>

<iframe name="myPHPScript" src="header.php" width="50%" 
frameborder="0"> 
</iframe>

<iframe name="myPHPScript" src="header.php" width="50%" 
frameborder="0"> 
</iframe>

<iframe name="myPHPScript" src="header1.php" width="50%" 
frameborder="0"> 
</iframe>

header.php:

<?php header("Content-type: image/png");
$img1 = file_get_contents ("3.png");
echo $img1;
?>

header1.php:

<?php header("Content-type: image/png");
$img2 = file_get_contents ("test1.jpg");
echo $img2;
?>

通过这种方法,我可以调用多个图像,但这不是我所期望的,我想只用 1 个 php 文件获得相同的结果。

您可以使用 URL 参数。

<iframe name="myPHPScript" src="header.php?id=0" width="50%" 
frameborder="0"> 
</iframe>

<iframe name="myPHPScript" src="header.php?id=0" width="50%" 
frameborder="0"> 
</iframe>

<iframe name="myPHPScript" src="header.php?id=1" width="50%" 
frameborder="0"> 
</iframe>

PHP 脚本使用 $_GET['id'] 来确定要 return 的图像文件。

<?php 
header("Content-type: image/png");
$images = ["3.png", "test1.jpg"];
if (isset($images[$_GET['id']])) {
    readfile($images[$_GET['id']]);
}
?>

另一种方法是 PHP return 一张包含所有图片的图片,并使用 CSS sprites 显示图片的不同部分。

没有"trick"。你不能 "prevent users from getting images".

每个服务器端资源,即图像、HTML 页面、样式表,一切,都需要有一个 URL下载。浏览器发出下载 URL 的请求,接收对该请求的响应,然后将其相应地视为 HTML 页面、图像或其他任何内容。

你不能有一个 URL return 两个不同的东西。我的意思是,您 可以 ,每次 URL 被访问时,您的服务器可以随机 return 不同的内容。但这是很荒谬的。 如果您想让访问者看到您的图片,您需要为他们提供一张独特的URL,以便他们可以这样做。如果如果您不想让访问者看到您的图片,请不要将其放到网上。

如果您让访问者看到您的图像,则意味着他们需要将其下载到他们的计算机上。为此,他们需要 URL。您的访问者根本不关心 URL 是否以 .php.jpg 结尾。他们所知道的是,对 URL 的请求将 return 该图像。你的 "trick" 没有做任何事情。您仍然会得到 a URL,可以从中下载 一张图片

图片下载完毕并且访问者可以看到后,它就在他们的计算机上了。您不能阻止用户在获取图像的同时也看到图像。你要的是废话

(这个答案可能看起来有些漫无边际,但解决了问题的 the original revision。)

通过一次调用显示多张图片的另一种方法是 return 包含多张图片的 return 单个图片 HTML。例如,您可以将 php 文件和 return 命名为:

  <img src="data:image/png;base64, iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg=="/>
  <img src="data:image/png;base64, iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg=="/>
  <img src="data:image/png;base64, iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg=="/>
  <img src="data:image/png;base64, iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg=="/>

将图像数据作为 base64 编码数据直接放在 SRC 中而不是链接。

正如其他人指出的那样,它不会阻止某人复制图像。

一个很好的例子,为什么还要使用 ctrl+prtsc。即使我们忽略诸如浏览器缓存之类的东西。也可以直接截取图像。


正如我在评论中提到的,如果有人(比如)未登录,您可以阻止 PHP 文件 returning 图片。这将阻止直接链接回您的网站.这在某些情况下是有正当理由的,我使用的示例是邮购新娘网站。一些个人资料图片 public 可见,其他则不可见(并非没有帐户)。在这种情况下,这不仅仅是 "Adult" 内容问题,因此有法律责任不向一般 public 显示某些图像或将它们直接链接回网站。

但这同样不会阻止某人复制图像并 public 分享它。