1つの機能では、スクリプトの挿入から完全に保護することはできません。次のプログラムを考えてみましょう:
<?php
if(isset($_POST['height']))
$height=htmlspecialchars($_POST['height'], ENT_QUOTES, 'UTF-8');
else $height=200;
if(isset($_POST['width']))
$height=htmlspecialchars($_POST['width'], ENT_QUOTES, 'UTF-8');
else $width=300;
echo("
<!DOCTYPE html>
<html>
<body>
<iframe src='whatever' height=$height width=$width>
</iframe>
</body>
</html>
");
入力がサニタイズされていますが、JavaScriptのはまだのような単純な注入ベクトルを介して実行されます:あなたはまだあなたの属性を引用する必要があるか、このような脆弱性があり
300 onload=alert(String.fromCharCode(88)+String.fromCharCode(83)+String.fromCharCode(83))
例。
ユーザ入力がjavascriptコメントにエコーされ、新しい行を挿入したり、コメントを閉じることができます。私はそれを 'これはすべきだとは思えないほどうまくいきませんが、コメントの形で進めていくつもりだ」と非難します。
注:多くのブラウザのXSS保護は私の単純な例を実行しません。あなたがそれを試してみたい場合は、保護なしで使用するか、それを打ち負かすベクトルを見つけてください(例えば、Chromeの場合はわかりません)。
一般的には、 'filter_input()'と 'filter_input_array()'関数を使う方が良い方法です。あなたは完全に '$ _GET'や' $ _POST'などのスーパーグローバルの使用を避けるべきです。 – Octopus
有名なWebサイトでさえも、そのような強力な保護はありません。 Facebookは良い保護を持っており、ブラウザのofcに応じてまだ関数を呼び出すことができます –