0

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

如果以这种方式在网页上调用来自http://example.com/page.php的脚本,我不希望执行该脚本:

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

我希望它仅在直接打开页面或用户单击该页面上的链接时运行,因此阻止引荐来源网址不是解决方案。

4

3 回答 3

1

是的,可以使用accept 标头来做到这一点,但是个人用户可以绕过保护。当浏览器正在下载图像时,它会发送预期数据的标题 - 例如Accept: image/png,image/*;q=0.8,*/*;q=0.5
但这当然不能依赖,因为任何用户都可以关闭此标题,并且任何浏览器都可能碰巧不发送此标题
在这里,您可以阅读有关http Accept header 兼容性的文章。

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

于 2013-02-09T00:27:49.563 回答
0

不,没有办法阻止 PHP 脚本在图像标签中运行。

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

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

于 2013-02-09T00:43:46.747 回答
0

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

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

框架测试.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>

框架测试.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>
于 2013-02-09T01:28:10.080 回答