【问题标题】:What is the best way to get the parameters in PHP?在 PHP 中获取参数的最佳方法是什么?
【发布时间】:2018-01-18 03:35:37
【问题描述】:

我会彻底澄清我的问题,对不起大家。 我有一个现在无法正常工作的网站的文件中编写的代码,html 代码位于具有 php 扩展名的页面上,位于我的 PC 中使用 Wampserever 的虚拟主机的文件夹中。 C:\wamp\1VH\PRU1,当网站上线时,有一个文件夹,其中有一个名为 image.php 的文件。该文件是从站点内的其他页面调用的,如下所示:(文件的一小段代码,C:\wamp\1VH\PRU1\example.php)

"<div><img src="https://www.example.com/img/image.php?f=images&amp;folder=foods&amp;type=salads&amp;desc=green&amp;dim=50&amp;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\1VH\PRU1\example.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 示例的图像必须是 C:/wamp/1VH/PRU1/images/foods/salads/green_50/23.png

我的电脑里有正确的文件夹和图片,我只需要写 image.php 文件。

请注意,有“&”,我必须将“desc=green&dim=50&”的值合并为结果:green_50(我电脑中的一个文件夹)。

TVM。

【问题讨论】:

  • 您可以直接回显 html:echo "&lt;div&gt;&lt;aimg src='/img/image.aphp?f=images&amp;amp;folder=foods&amp;amp;type=salads&amp;amp;desc=green&amp;amp;dim=50&amp;amp;id=23' alt='green salad 23'&gt;&lt;/div&gt;" ; 注意 html 属性周围的单引号
  • 对于 1,我不会把它放在代码片段中 - 它只是添加 4 个空格会创建一个 code block
  • 我不知道双引号是故意的还是发布问题的“神器”,但这对你来说效果不佳"&lt;div&gt;&lt;img src=" 通常有 3 种主要方式来传递值请求(HTTP 是无状态的),它们是 $_POST、$_GET 和 $_SESSION 在 PHP 中这些被称为超级全局,全局意味着您可以在任何范围内访问它们。
  • 对不起,我必须写image.php文件,这个文件必须获取参数并返回正确图像的URL。双引号只是因为我试图避免消息:你不能发布图片,因为你没有 10 分大声笑
  • 嗯,你必须提供更多的东西,那么图像是如何存储的?是否有需要从中获取图像文件路径的数据库?

标签: php html


【解决方案1】:

你可能想要这样的东西。

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...

然后,最后您会将所有“清理过的”值拼接在一起。正如我之前所说,很多人只是忽略了这一点,只是把东西放在了正确的路径上。但是,这不是正确的做法。

希望对你有所帮助。

【讨论】:

  • 我只需要写image.php文件: 直到我得到这样的 URL:images/foods/salads/green_50/23.png 并且该 URL 将在 IMG 元素的 SRC 致敬中。我说得对吗?
  • 我们会我真的不知道这意味着什么,但希望我所说的有所帮助。否则,您可能希望澄清您的问题
  • tvm 为您提供帮助,这个网站是有史以来最好的!抱歉我的未澄清问题,我只想知道获取图像的该 src 属性的参数的最佳方法是什么(现在我知道它是 $GET),以及如何在 image.php 中编写 PHP 代码文件(尚不存在)返回一个采用该 SRC 参数值的 URL。
  • @Daniel 一定要调用 1 isset() 并检查超全局数组中是否存在所有元素。看不懂的看说明书。
  • empty 在我的例子中会做同样的事情。 empty 忽略来自未设置变量的错误。但如果它让你开心,你可以使用isset。见php.net/manual/en/function.empty.phpempty() does not generate a warning if the variable does not exist
【解决方案2】:

您基本上只需要解析 $_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);

https://3v4l.org/tTALQ

【讨论】:

  • 泰劳伦斯!我会调查的。
【解决方案3】:

使用$_GET[];

<?php

$yourParam = $_GET['param_name'];

?>

【讨论】:

  • 请通过更多解释来改进这篇文章,以教育 OP 和未来的读者。
  • 好的,我必须重新写答案吗?
【解决方案4】:

我可以通过这种方式获取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中正确显示吗?

【讨论】:

    猜你喜欢
    • 2017-06-30
    • 1970-01-01
    • 1970-01-01
    • 2019-02-22
    • 1970-01-01
    • 1970-01-01
    • 2012-07-25
    • 1970-01-01
    • 2010-09-17
    相关资源
    最近更新 更多