是否可以阻止php脚本在img src标记中运行


Is it possible to block a php script from running in a img src tag?

是否可以阻止php脚本在img src标记中运行?

我不想要来自http://example.com/page.php如果以这种方式在网页上调用,则执行:

<img src="http://example.com/page.php">

我希望它只在直接打开页面或用户点击该页面上的链接时运行,因此阻止引用者不是一个解决方案。

是的,可以使用accept头执行此操作,但单个用户可以绕过保护。当浏览器下载图像时,它会发送预期数据的标头,例如Accept: image/png,image/*;q=0.8,*/*;q=0.5
但这当然不能依赖,因为任何用户都可以关闭此标头,任何浏览器都可能不发送此标头
在这里,您可以阅读关于http Accept标头兼容性的文章。

另一个有用的报头可能是Referer报头。这个头告诉您调用这个请求的站点(该站点上的图像、站点上的CSS或该站点后面的链接)。规则是相同的-大多数用户会发送标头,但有些用户可能会将其关闭。
许多人已经安装了插件来阻止referrer标头,以增加他们的隐私

否。没有办法阻止PHP脚本在图像标记中运行。

然而,一旦脚本运行,您就可以根据标头发回不同的内容。因为可以修改头,所以这不是防止任何事情发生的可靠方法。

不过,在img标记中运行脚本应该不是问题。一旦浏览器发现内容不是图像,它就会简单地丢弃它,什么也不做(或者它可能会显示某种错误)。

我做了一些测试。如果你将内容类型刷新为text/html(可能还有图像以外的任何内容),Firefox和IE似乎将停止等待完整的回复。但我看不出他们断开了联系。然而,Chrome等待了整个页面。

因此,如果浏览器没有断开连接,或者PHP无法检测到,你似乎无论如何都必须呈现整个页面。而且你必须很早就决定所有的标题设置。所以这不值得。

frametest.html

<html>
<head>
    <title>Frame test</title>
</head>
<body>
    <h1>Frame test</h1>
    <p>The following frame is not to be displayed in frames!</p>
    <img src="frametest.php"/>
</body>
</html>

frametest.php

<?php
header('Content-Type: text/html');
echo " ";
flush();
sleep(3);
echo " 'r'n ";
flush();
$aborted = (connection_aborted() ? 'yes' : 'no');
$status = (connection_status() ? 'yes' : 'no');
$temp = mail('your@email.here', 'Frametest', 'Client Aborted: ' . $aborted . ' Status: ' . $status);
?>
<html>
<head>
<title>test</title>
</head>
<body>
<h1>Test</h1>
<p>Not to be displayed in frames!</p>
<p>Mail ok? <?php echo ($temp ? 'Yes' : 'No'); ?> </p>
</body>
</html>