以下链接是问题 - 尽管“.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);