2

以下链接是问题 - 尽管“.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 数组包含名为“搜索”的参数时用于重定向的代码 - 这是我怀疑注入双 & 的代码。我在此函数中添加了写入日志文件,并且 Link::ToSearchResults 的返回值中存在“double &'s”。

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);
4

1 回答 1

1

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

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

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

于 2013-07-31T14:24:36.003 回答