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()
  • シェル コマンド名には、escapeshellcmd().
  • シェル引数には、 を使用しますescapeshellarg()
  • GET URL 文字列を作成するurlencode()には、パラメーター値で使用します。
  • データベース クエリの場合は、それぞれのデータベース エスケープ メカニズム (または準備済みステートメント) を使用します。

この推論は再帰的に適用されます。したがって、GET URL へのリンクを HTML 出力に書きたい場合は、次のようになります。

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

$varその時点で、以前にすでに脱出したかどうか、およびその方法を覚えておく必要があるとしたら、それはひどいことです.

于 2011-09-22T19:06:44.787 に答える
3

ブランケット エスケープは必要なく、データに害を及ぼす可能性があります。やらないでください。

HTML ページに出力しようとしているデータにのみ適用htmlspecialchars()します。理想的には、出力する直前または直接出力します。

于 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 に答える