使用PHP函数include()来包含一个png图像。

5

大家好,尽管最佳实践是这样的,但今天我决定这样做:

<img src='<? include("dir/dir/img.png"); ?>'>

有6个不同的.png图片。

遗憾的是,只有其中2个在浏览器上清晰可见。

为什么只显示了其中的2张图片? 可能是数据在传输过程中丢失了一些位吗?

感谢您的时间:]


3
你想做什么?为什么不只是打印文件路径? - Benbob
4个回答

15

这段代码不起作用是因为<img>标签的src属性不应该包含原始图像数据,而应该包含指向图像数据的URI。

使用data: URI,你可以直接将图像嵌入到你的(X)HTML文档中。请注意,这在许多浏览器中无法正常工作,如较旧版本的Internet Explorer。此外,还有一些限制,例如IE8对data: URI设置的32KB限制。

使用PHP,你的代码会像这样:

<img src='data:image/png;base64,<?php echo base64_encode(file_get_contents("dir/dir/img.png")); ?>'>

如果您使用的图片类型发生更改,请不要忘记更改URL中的image/png部分。例如,如果您使用GIF图片,请将其更改为image/gif


奇怪的事实是它居然成功了两次XD!!! 但是,好吧,你刚刚给出了正确的方法。谢谢:] - Daniel Rodriguez MSFT

5

这本来是不可能的。

如果想要一种标准方法来实现这个(包括在HTML文档中内联显示图像而不是指向它们的URL),请参见data URI scheme


2
糟糕,今天的投票用完了。我认为你应该提到使用file_get_contents来读取文件,而不是调用include。(包含的数据存在安全风险!) - strager
你说得对。如果他控制了图片,那么不一定存在安全风险,但是这个图片可能会偶然包含字符 <?。更不用说,它会立即输出,所以他无法操纵数据来构建数据URI。 - Artefacto

4

include()告诉PHP解析该文件。如果它包含<?,你会遇到真正的麻烦。相反,请使用readfile()

此外,还必须考虑Artefacto的答案。


是的,xD我在回家的路上想到了这个。 - Daniel Rodriguez MSFT
1
确实,这里存在一个巨大的漏洞。在Gimp中打开图像,在注释部分添加PHP代码,然后再次尝试包含。它将从图像文件执行PHP代码!--对于任何不带有PHP代码的文件使用include都是非常危险的。如果您包含了用户上传的图像,甚至是您找到的(而不是创建的)图像,那么您可能会在服务器上设置一个后门! - Steve
是的,那就是我想说的。实际上,我曾经成功地利用这种技术攻击过一个CMS。 :) - scy

1
< img src='< ?php echo 'data:image/png;base64,' . base64_encode(file_get_contents('dir/dir/img.png')) ; ?> ' >

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接