我在一个网站的文件中编写了代码,但现在无法正常工作,html 代码位于带有 php 扩展名的页面上,位于我使用 Wampserever 的 PC 中虚拟主机的文件夹中。
C:\wamp\1VH\PRU1
,当站点在线时,有一个文件夹,其中有一个名为 image.php 的文件。该文件是从站点内的其他页面调用的,如下所示:(文件的一小段代码,C:\wamp VH\PRU1 xample.php)
"<div><img src="https://www.example.com/img/image.php?f=images&folder=foods&type=salads&desc=green&dim=50&id=23" alt="green salad 23"></div>"
结果是图像显示正确。 现在,就像我在本地有这个项目一样,我没有我必须自己编写的 image.php 文件的代码,这样图像将以与网站在线时相同的方式显示。
当网站在线并且我打开该 image.php 文件返回的图像时,URL 是,按照示例,https://example.com/images/foods/salads/green_50/23.png.
现在这个网站是如何只在本地的,我还没有写那个 image.php 文件,因为我不知道怎么写,图像显然没有显示。
在 C:\wamp VH\PRU1 xample.php 中,文件代码已更改,删除“https://www.example.com/img/image.php?”对于本地路径“img/image.php?”。
在同一个文件夹中还有一个:“img”文件夹(这里必须分配image.php文件)和“images”文件夹,里面有/foods/salads/green_50/23.png, 24.png.25 .png......................
所以我的文件夹架构与在线站点完全相同,我更改了我只能更改的代码,例如用 jQuery 替换“https://www.example.com/img/image.php?”对于“img/image.php?”但我做不到的是替换 image.php 文件之后的所有代码来获取图像文件。
所以我认为正常获取图像的最简单方法是创建我的虚拟主机中没有的 IMAGE.PHP 文件。
想知道如何在image.php文件中获取参数并返回正确的URL
DIV EXAMPLE的图片必须是C:/wamp/1VH/PRU1/images/foods/salads/green_50/23.png
我的电脑里有正确的文件夹和图片,我只需要写 image.php 文件。
请注意,有“&”,我必须将“desc=green&dim=50&”的值合并为结果:green_50(我电脑中的一个文件夹)。
你可能想要这样的东西。
image.php
$id = intval($_GET['id']);
echo '<div><img src="images/foods/salads/green_50/'.$id.'.png" alt="green salad '.$id.'"></div>';
然后你会调用这个页面
www.example.com/image.php?id=23
所以你可以在 url 中看到我们在 url 的查询部分有
id=23
。我们使用 $_GET['id']
在 PHP 中访问它。很简单。在这种情况下,它等于 23
如果它是 id=52
它将是那个数字。
现在,出于安全原因,
intval
部分非常重要,您永远不应将用户输入直接放入文件路径。我不会详细介绍目录横向攻击。但是,如果您只允许其中的任何内容,那么您将很容易受到攻击。它经常被忽视,所以你不会是第一个。
https://en.wikipedia.org/wiki/Directory_traversal_attack
现在授予服务器应该正确设置用户权限,但我说为什么我们可以用 1 行代码安全地赌博。
这应该让你开始。对于其余的人,我会像这样设置一个白名单:
对于
folder=foods
您将创建一个包含允许值的数组,
$allowedFolders = [
'food',
'clothes'
'kids'
];
etc...
然后你会这样检查它
///set a default
$folder = '';
if(!empty($_GET['folder'])){
if(in_array($_GET['folder'], $allowedFolders)){
$folder = $_GET['folder'].'/';
}else{
throw new Exception('Invalid value for "folder"');
}
}
etc...
最后,您会将所有“已清理”的值拼接在一起。正如我之前所说,很多人只是忽略了这一点,只是把这些东西放在了正确的路径上。但是,这不是正确的方法。
无论如何希望有所帮助。
你基本上只需要解析 $_GET 参数,然后做一些检查文件是否找到,一个真实的图像,然后通过设置适当的内容类型头来提供文件,然后输出文件内容。
这应该可以解决问题:
<?php
// define expected GET parameters
$params = ['f', 'folder', 'type', 'desc', 'dim', 'id'];
// loop over parameters in order to build path: /imagenes/foods/salads/green_50/23.png
$path = null;
foreach ($params as $key => $param) {
if (isset($_GET[$param])) {
$path .= ($param == 'dim' ? '_' : '/').basename($_GET[$param]);
unset($params[$key]);
}
}
$path .= '.png';
// check all params were passed
if (!empty($params)) {
die('Invalid request');
}
// check file exists
if (!file_exists($path)) {
die('File does not exist');
}
// check file is image
if (!getimagesize($path)) {
die('Invalid image');
}
// all good serve file
header("Content-Type: image/png");
header('Content-Length: '.filesize($path));
readfile($path);
使用
$_GET[]
;
<?php
$yourParam = $_GET['param_name'];
?>
我可以通过以下方式获取image.php文件中的参数值:
<?php
$f = $_GET['f'];
$folder = $_GET['folder'];
$type = $_GET['type'];
$desc = $_GET['desc'];
$dim = $_GET['dim'];
$id = $_GET['id'];
?>
但是我必须为图像做些什么: C:/wamp/1VH/PRU1/images/foods/salads/green_50/23.png
可以在带IMG SRC属性的DIV中正确显示吗?