是否可以阻止php脚本在img src
代码中运行?
如果以这种方式在网页上调用,我不希望执行来自http://example.com/page.php的脚本:
<img src="http://example.com/page.php">
我希望它只在直接打开页面或用户点击该页面的链接时运行,因此阻止引荐来源不是解决方案。
答案 0 :(得分:1)
是的,可以使用accept header执行此操作,但个别用户可以绕过保护。当浏览器下载图像时,它会发送标题所需的数据 - 例如Accept: image/png,image/*;q=0.8,*/*;q=0.5
但这当然不能依赖,因为任何用户都可以关闭此标题,任何浏览器都可能发生不发送此标题。
在这里,您可以阅读有关compatibility of http Accept header的文章。
另一个有用的标题可能是 Referer
标题。此标头会告诉您调用此请求的站点(该站点上的图像,站点上的CSS或此站点后面的链接)。规则是相同的 - 大多数用户将发送标题,但有些可能会将其关闭
许多人已经安装了插件来阻止引用者标题以增加他们的隐私。
答案 1 :(得分:0)
没有。无法阻止PHP脚本在图像标记中运行。
运行脚本后,您可以根据标头发回不同的内容。因为标题可以被修改,所以这不是防止任何事情的可靠方法。
但是,脚本在img
标记中运行应该不是问题。一旦浏览器发现内容不是图像,它就会丢弃它而不做任何事情(或者它可能会显示某种错误)。
答案 2 :(得分:0)
我做了一点测试。如果你将内容类型刷新为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>