例子
<SCRIPT language="javascript1.2"> var msg='<?= $welcome_msg?> '; // … </SCRIPT> 攻擊XSS輸入1 Hello'; evil_script(); // 將動態內容替換 將 $welcome_msg 替換為惡意 XSS 輸入: <SCRIPT language="javascript1.2"> var msg='Hello'; evil_script(); //'; // … </SCRIPT> 攻擊XSS輸入2 Hello</script><script>evil_script();</script><script> 將動態內容替換 將$welcome_msg 替換為惡意 XSS 輸入: <script> var msg = 'Hello</script> <script>evil_script();</script> <script>' // ... // do something with msg_text </script> |
分析
如上文所示,在 JavaScript 背景中使用動態內容需要非常謹慎。一般情況下,盡量避免或減少在 Javascript 的背景下使用動態內容,如果必須使用動態內容,在開發或代碼審計時必須考慮這些動態內容可能的取值,是否會導致 XSS 攻擊。
建立PHP庫函數校驗輸入
Web 開發人員必須了解,僅僅在客戶端使用 JavaScript 函數對非法輸入進行檢測過濾對于構建安全的 WEB 應用是不夠的。如上文所述,攻擊者可以輕易地借助工具繞過 JavaScript 校驗甚至 SSL 加密輸入惡意數據。在輸出端對動態內容進行編碼也只能起到一種雙重保護的作用,更重要的應該在服務器端對輸入進行校驗。PHP 提供了strpos()、strstr()、preg_match()等函數可用于檢測非法字符和字符串;preg_replace() 函數可用于替換非法字符串。OWASP PHP Filters 開源項目提供了一些 PHP 庫函數用于過濾非法輸入可作為參考。一些常見的檢測和過濾包括:
輸入是否僅僅包含合法的字符;
輸入如果為數字,數字是否在指定的范圍;
輸入字符串是否超過最大長度限制;
輸入是否符合特殊的格式要求,譬如email 地址、IP 地址;
不同的輸入框在邏輯上存在的耦合和限制的關系;
除去輸入首尾的空格;
總結
Web 應用的安全性是一個很重要、覆蓋范圍很廣泛的主題。為了防止常見的 XSS 的攻擊,Web 開發人員必須明白不能僅僅只在客戶端使用 JavaScript 對輸入進行檢測、過濾;同時還應建立服務器端的輸入校驗、輸出編碼庫函數;在服務器端檢測、過濾輸入;根據動態內容所處的背景將特殊字符進行編碼后再傳送給瀏覽器端顯示。
原文轉自:http://www.uml.org.cn/Test/201407161.asp