一個函數不能完全保護您免於腳本注入。考慮下面的程序:
<?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保護將無法運行我的簡單示例。如果你想嘗試使用一個沒有保護,或找到一個嚮導來擊敗它(不知道是否有一個例如鉻)。
使用'filter_input()'和'filter_input_array()'函數通常是更好的方法。你應該完全避免使用超級全局變量'$ _GET'和'$ _POST'等, – Octopus
即使是着名的網站也沒有那麼強大的保護。 Facebook有一個很好的保護,它仍然可以調用功能,取決於瀏覽器的c –