【问题标题】:"amp;" Precedes $_GET array element (parameter) name“放大器;”在 $_GET 数组元素(参数)名称之前
【发布时间】:2013-07-31 14:05:30
【问题描述】:

以下链接是问题 - 尽管“.amp;” (当我在发布前查看此问题时,我发现我的链接没有显示为粘贴它。这正是我想要对我的 $_GET 变量名称执行的操作,从参数名称中删除 amp;)

index.php?SearchResults&SearchString=aliquippa&AllWords=off

$_GET 元素以 amp; 命名。在我期望的名字之前。例如,$_GET[amp;AllWords'] 是变量的命名方式。我期待 $_GET['AllWords'] 格式。

我的“网站”上的所有链接都是由标准类函数构建和返回的,该函数将 htmlspecialchars 应用于最终返回值。每个链接由特定于所需任务的类函数构造,然后通过调用此标准函数返回。虽然所有链接都通过相同的标准函数返回,但我只有 1 个链接行为不端。

此链接是我第一次尝试获取用户输入并将其传递(重定向?)通过 $_GET 参数返回。这就像 & 被加倍了。我确定代码没有添加第二个&符号。

作为解决方案,我立即找到并尝试了针对 POST 变量的 htmlspecialchars_decode()。它与分配给 $_GET 参数的名称没有区别。除了解码编码的内容并通过逻辑之外,我对理解感到茫然。错误地构建链接的代码看起来与构建正常工作的链接的代码相同。所有链接都通过标准函数返回,该函数应用 htmlspecialchars。我认为所有链接要么工作要么不工作,而不是混合。

以下是当 $_GET 数组包含名为“搜索”的参数时用于重定向的代码 - 这是我怀疑注入双 & 的代码。我已在此函数中添加了对日志文件的写入,并且“double &'s”出现在来自的返回值中 Link::ToSearchResults。

if (isset($_GET['Search']))
{
    $this->mSearchString = $_POST['search_string'];
$this->mAllWords = isset($_POST['all_words']) ? $_POST['all_words'] : 'off';

    ob_clean();

    header('HTTP/1.1 302 Found');
header('Location: ' . Link::ToSearchResults($this->mSearchString, $this->mAllWords));

    flush();
    ob_flush();
    ob_end_clean();
    exit;
}

以下是ToSearchResults函数代码:

$link = 'index.php?SearchResults';
if (empty($searchString))
$link .= '/';
else
    $link .= '&SearchString=' . $searchString;

$link .= '&AllWords=' . $allWords;

return self::Build($link);

以下是标准类函数 Build() 的返回。所有的链接在返回给调用者之前都经过这个函数。

return htmlspecialchars($link, ENT_QUOTES);

【问题讨论】:

  • 看起来你需要urldecode() 某处
  • 看起来你以某种方式调用 htmlspecialchars() 在已经转义的链接上,因此 &变成 &.可能在 Build 方法中。
  • index.php?SearchResults -- 这看起来很奇怪,为什么是无键值?它有什么好处?
  • @MightyPork 这是一个无值键,不是无键值,PHP 在$_GET 中正确地将其表示为值为空字符串的哈希键。因此,你后一个问题的答案应该很明显:它是一面旗帜。

标签: php url


【解决方案1】:

当您通过Build 方法传递包含'&' 的值时会出现问题,该方法使用HTML 实体转义HTML 特殊字符。生成的链接将采用以下形式:

index.php?SearchResults&SearchString=aliquippa&AllWords=off

PHP 的 URL 解析器不希望遇到 HTML 实体,因为它们不应该出现在 URL 中;因此,它正确地拆分了& 上的查询字符串,将结尾的amp; 视为键的一部分。要解决此问题,请不要通过 htmlspecialchars() 传递您的 URL。

【讨论】:

  • 行得通,谢谢。我正在学习一本电子商务入门书,所以我不确定为什么要使用 htmlspecialchars。但是,我想知道为什么所有其他链接都很好,而这个不是,而所有链接都是通过相同的函数返回的。除了参数名称之外,上面的链接和这个链接有什么区别? index.php?DepartmentId=1&CategoryId=3 - 我对这样的链接没有任何问题。
  • @PaulaShaw 链接没有区别,但处理方式似乎有所不同; Link::ToSearchResults() 接受由查询值组成的参数,然后将它们组装成一个完整的查询字符串,并将结果传递给Build(),然后传递给htmlspecialchars()。正是在这最后一步出现了问题;据推测,大多数生成的链接都不会通过Build(),或者以其他方式构造,使得完整的查询字符串在任何时候都不会通过htmlspecialchars()
  • 我所有的链接都是通过 Build 函数返回的。这就是为什么我不了解我所有其他链接的工作原理,但这个不了解。删除 htmlspecialchars 已经解决了这个问题,我已经能够完全调试搜索例程,而没有因删除引起的其他链接问题。此外,任何地方都没有出现链接问题。我需要找出作者为什么在他的所有链接上都使用 htmlspecialchars。
猜你喜欢
  • 1970-01-01
  • 2014-10-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多