原文連結
Cross-Site Scripting中文譯為「跨站腳本攻擊」,簡稱XSS。此乃是駭客利用網站上允許使用者輸入字元或字串的欄位插入HTML與Script語言,造成其他正常使用者在觀看網頁的同時,瀏覽器會主動下載並執行部份惡意的程式碼,或被暗地裡導入到惡意的網站,而受到某種型態的影響。
XSS攻擊介於駭客與使用者之間的攻防戰,並不會對server主機有任何威脅,所以才被稱為跨站腳本攻擊,意思即是:駭客使用某些語言(腳本)跨過主機對使用者進行攻擊。
換句話說,要防止XSS攻擊,修改程式碼為不二法則。最簡單防止XSS的攻擊,必須在使用者輸入欄位加入過濾字串的功能,將『<』、『>』、『%』、『/』、『()』、『&』等符號進行過濾不予輸出至網頁,或限定欄位長度的輸入。
PHP 可以使用 htmlspecialchars() 轉換這些特殊字元
以下舉個簡單的例子更容易了解 :
if(isset($_POST['content'])) {
/* --------------------
加上過濾機制,不會被 XSS 攻擊
$sql = "INSERT INTO `xss_test` (`content`) VALUES ('".htmlspecialchars($_POST['content'])."')";
----------------------*/
// 未加上過濾機制,會被 XSS 攻擊
$sql = "INSERT INTO `xss_test` (`content`) VALUES ('".$_POST['content']."')";
mysql_query($sql);
$sql = "SELECT * FROM `xss_test` ORDER BY id DESC LIMIT 1";
$rs = mysql_query($sql);
if(mysql_num_rows($rs)!=0){
list($id, $content) = mysql_fetch_row($rs);
echo $content;
}
}
?>
<form method="post">
<textarea name="content"></textarea>
<input type="submit">
</form>
$sql = "INSERT INTO `xss_test` (`content`) VALUES ('".$_POST['content']."')";
mysql_query($sql);
$sql = "SELECT * FROM `xss_test` ORDER BY id DESC LIMIT 1";
$rs = mysql_query($sql);
if(mysql_num_rows($rs)!=0){
list($id, $content) = mysql_fetch_row($rs);
echo $content;
}
}
?>
<form method="post">
<textarea name="content"></textarea>
<input type="submit">
</form>
把上面的程式碼拿來測試看看,如果在輸入文字的 textarea 欄位,輸入 <script>alert('javascript 會被執行喔!')</script>,就可以了解 XSS 是怎麼一回事了
沒有留言:
張貼留言