从htmlenties()编码的url中提取url参数的正确方法


Proper way to extract url parameters from an htmlentities() encoded url?

我有一个php文件resizeImage.php,它可以这样调用-

http://<domain>/fam/resizeImage.php?&srcImg=<url encoded URL of a remote image>&width=<width>&height=<height>

然而,另一个模块以这种方式调用该URL的htmlentities编码版本-

htmlentities(http://<domain>/fam/resizeImage.php?srcImg=<url encoded url>&width=<width>&height=<height>)

因此,下面是一个名为-的示例URL

http://<domain>/fam/resizeImage.php?srcImg=https%3A%2F%2Flh3.googleusercontent.com%2FVRY0O_3L8VH2wxJSTiKPr72PeM5uhPPFEsHzzYdxenddpTI150M0TYpljnZisQaROR0%3Dh256-rw&amp;width=640&amp;height=960

现在,resizeImage.php收到了请求,但我无法使用$_request['width']获取参数宽度,但我可以执行以下操作-

  • 获取htmlenties_decode($_SERVER['REQUEST_URI'])
  • 使用CCD_ 1对其进行分解以获得参数值对
  • 使用CCD_ 2进行分解以获得与参数相对应的值

所以,有两件事——

  • 我想知道在这种情况下,这是否是提取参数的正确方法
  • 我不知道调用模块调用htmlentities编码URL的原因。有没有更好的方法来建议他们

您可以使用PHP的内部函数来解析和解码URL:

  • parse_url-解析url并获取所需组件
  • html_entity_decode-解码html实体
  • url_decode-解码url编码的字符
  • 最后parse_str-将参数字符串解析为关联数组

下面是我想出的一个示例代码(你可以在这里尝试):

$parsed = parse_url($url);
parse_str(urldecode(html_entity_decode($parsed['query'], ENT_HTML401)), $tmp);
var_dump($tmp);

它将您的URL参数呈现为一个关联数组:

array(3) {
  ["srcImg"]=>
  string(109) "https://lh3.googleusercontent.com/VRY0O_3L8VH2wxJSTiKPr72PeM5uhPPFEsHzzYdxenddpTI150M0TYpljnZisQaROR0=h256-rw"
  ["width"]=>
  string(3) "640"
  ["height"]=>
  string(3) "960"
}

至于第二部分,我认为第二个模块的方法稍微安全一点,因为您将URL放在URL的参数中。如果你不想在解析和从参数中剥离不必要的部分时遇到麻烦,那么对整个部分进行编码是一种简单而安全的方法,可以避免URL出现语法错误。

在某些情况下,当人们在get parameters中发送html代码时,单个参数上的htmlentities在标签上可能是可以的,但在链接本身上则不然-他们应该为此使用urlencode:

<a href="htpp://yourdomain.tld/?param1=<?php echo urlencode('<somehtmltag>'); ?>>htpp://yourdomain.tld/?param1=<?php echo htmlentities('<somehtmltag>'); ?></a>