$ _GET上的foreach循环是应用htmlspecialchars的好方法吗?

时间:2011-09-22 18:58:49

标签: php foreach htmlspecialchars

我想知道使用以下代码是否存在重大缺点:

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

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

更新:

因为我不认为上面的代码会起作用,所以我用我正在使用的代码更新它(尽管对建议有消极性)。 :)

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

4 个答案:

答案 0 :(得分:5)

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

一般来说,答案是“不”,您应该只为特定目的逃避数据。无目的地随意转发​​数据并没有帮助,它只会引起进一步的混乱,因为你必须跟踪被转义的内容和方式。

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

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

这种推理适用于递归。因此,如果你想写一个指向HTML输出的GET URL的链接,它就是这样的:

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

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

答案 1 :(得分:3)

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

仅将htmlspecialchars()应用于您要在HTML页面中输出的数据 - 理想情况是在输出之前或之后直接输出。

答案 2 :(得分:1)

它不会影响数字,但它可能适用于不打算放在HTML代码中的字符串参数。

您必须根据其含义对待每个键。概括的可能性还取决于您的应用。

答案 3 :(得分:1)

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

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