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

boz*_*doz 1 php foreach htmlspecialchars

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

if(isset($_GET)){
foreach($_GET as $v){
    $v = htmlspecialchars($v);
}
}
Run Code Online (Sandbox Code Playgroud)

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

更新:

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

if(isset($_GET)){
foreach($_GET as $k=>$v){
    $_GET[$k] = htmlspecialchars($v);
}
}
Run Code Online (Sandbox Code Playgroud)

Ker*_* SB 5

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

一般来说,答案是"不",您应该只为特定目的逃避数据.无目的地随意转义数据无济于事,它只会引起进一步的混乱,因为你必须跟踪被转义的内容和方式.

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

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

这种推理适用于递归.因此,如果您要编写指向HTML输出的GET URL的链接,它将是这样的:

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

如果在那一点上你必须记住$var以前是否已经逃脱过,那将是非常可怕的.

  • 安全作为事后的想法听起来像是一个不祥的预兆......"适当的设计也是事后的想法".正确的转义是程序设计中不可或缺的一部分.嗯.如果要存储HTML转义变量,则应该专门为此目的创建一个新数组. (3认同)