1

我想知道使用以下代码是否有明显的缺点:

if(isset($_GET)){
foreach($_GET as $v){
    $v = htmlspecialchars($v);
}
}

我意识到可能没有必要在每个变量上使用 htmlspecialchars。任何人都知道这是否很好?

更新:

因为我认为我上面的代码行不通,所以我用我正在使用的代码来更新它(尽管对这些建议持否定态度)。:)

if(isset($_GET)){
foreach($_GET as $k=>$v){
    $_GET[$k] = htmlspecialchars($v);
}
}
4

4 回答 4

5

这完全取决于你想做什么。

一般来说,答案是“不”,您应该只为特定目的转义数据。无目的地随机转义数据没有帮助,而且只会导致进一步的混乱,因为您必须跟踪转义的内容以及如何转义。

简而言之,保持您的数据原始存储,并在使用专门将其转义以用于其预期用途:

  • 对于 HTML 输出,使用htmlentities().
  • 对于 shell 命令名称,使用escapeshellcmd().
  • 对于 shell 参数,使用escapeshellarg().
  • 要构建 GET URL 字符串,urlencode()请在参数值上使用。
  • 对于数据库查询,使用相应的数据库转义机制(或准备好的语句)。

这个推理递归地适用。所以如果你想写一个指向 HTML 输出的 GET URL 的链接,它会是这样的:

echo "<a href=" . htmlentities("$url?q=" . urlencode($var)) . ">click</a>";

如果那时你必须记住$var之前是否已经逃脱,以及如何逃脱,那将是可怕的。

于 2011-09-22T19:06:44.787 回答
3

毯子转义不是必需的,它可能对数据有害。不要这样做。

仅适用htmlspecialchars()于您将要在 HTML 页面中输出的数据 - 最好是在您即将输出之前,或者直接在您输出它时。

于 2011-09-22T19:01:51.610 回答
1

它不会影响数字,但对于不打算放入 HTML 代码的字符串参数可能会适得其反。

您必须根据其含义对每个键进行不同的处理。泛化的可能性还取决于您的应用程序。

于 2011-09-22T19:02:30.873 回答
1

你这样做的方式是行不通的。您需要进行$v引用,并且它会因任何需要递归($_GET['array'][0]例如)而中断。

if(isset($_GET)) {
  foreach($_GET as &$v) {
    $v = htmlspecialchars($v);
  }
}
于 2011-09-22T19:04:23.347 回答