【发布时间】: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中正确地将其表示为值为空字符串的哈希键。因此,你后一个问题的答案应该很明显:它是一面旗帜。