對網站發動XSS攻擊的方式有很多種,僅僅使用php的一些內置過濾函數是對付不了的,即使你將filter\_var,mysql\_real\_escape\_string,htmlentities,htmlspecialchars,strip\_tags這些函數都使用上了也不一定能保證絕對的安全。
那么如何預防 XSS 注入?主要還是需要在用戶數據過濾方面得考慮周全,在這里不完全總結下幾個 Tips
1\. 假定所有的用戶輸入數據都是“邪惡”的
2\. 弱類型的腳本語言必須保證類型和期望的一致
3\. 考慮周全的正則表達式
4\. strip\_tags、htmlspecialchars 這類函數很好用
5\. 外部的 Javascript 不一定就是可靠的
6\. 引號過濾必須要重點注意
7\. 除去不必要的 HTML 注釋
8\. Exploer 求你放過我吧……
**方法一,利用php htmlentities函數**
例子
php防止XSS跨站腳本攻擊的方法:是針對非法的HTML代碼包括單雙引號等,使用htmlspecialchars()函數 。
在使用htmlspecialchars()函數的時候注意第二個參數, 直接用htmlspecialchars($string) 的話,第二個參數默認是ENT\_COMPAT,函數默認只是轉化雙引號(“), 不對單引號(‘)做轉義.
所以,htmlspecialchars函數更多的時候要加上第二個參數, 應該這樣用: htmlspecialchars($string,ENT\_QUOTES).當然,如果需要不轉化如何的引號,用htmlspecialchars($string,ENT\_NOQUOTES).
另外, 盡量少用htmlentities, 在全部英文的時候htmlentities和htmlspecialchars沒有區別,都可以達到目的.但是,中文情況下, htmlentities卻會轉化所有的html代碼,連同里面的它無法識別的中文字符也給轉化了。
htmlentities和htmlspecialchars這兩個函數對 '之類的字符串支持不好,都不能轉化, 所以用htmlentities和htmlspecialchars轉化的字符串只能防止XSS攻擊,不能防止SQL注入攻擊.
所有有打印的語句如echo,print等 在打印前都要使用htmlentities() 進行過濾,這樣可以防止Xss,注意中文要寫出htmlentities($name,ENT\_NOQUOTES,GB2312) 。
方法二,什么也不多說我們給一個函數
例子
functionxss\_clean($data){
//Fix &entity\n;
$data=str\_replace(array('&',''),array('&',''),$data);
$data=preg\_replace('/(&#\*\w+)\[\x00-\x20\]+;/u','$1;',$data);
$data=preg\_replace('/(&#x\*\[0-9A-F\]+);\*/iu','$1;',$data);
$data=html\_entity\_decode($data,ENT\_COMPAT,'UTF-8');
//Remove any attribute starting with "on" or xmlns
$data=preg\_replace('#(\]+?\[\x00-\x20"\'\])(?:on|xmlns)\[^>\]\*+>#iu','$1>',$data);
//Remove javascript: and vbscript: protocols
$data=preg\_replace('#(\[a-z\]\*)\[\x00-\x20\]\*=\[\x00-\x20\]\*(\[`\'"\]\*)\[\x00-\x20\]\*j\[\x00-\x20\]\*a\[\x00-\x20\]\*v\[\x00-\x20\]\*a\[\x00-\x20\]\*s\[\x00-\x20\]\*c\[\x00-\x20\]\*r\[\x00-\x20\]\*i\[\x00-\x20\]\*p\[\x00-\x20\]\*t\[\x00-\x20\]\*:#iu','$1=$2nojavascript...',$data);
$data=preg\_replace('#(\[a-z\]\*)\[\x00-\x20\]\*=(\[\'"\]\*)\[\x00-\x20\]\*v\[\x00-\x20\]\*b\[\x00-\x20\]\*s\[\x00-\x20\]\*c\[\x00-\x20\]\*r\[\x00-\x20\]\*i\[\x00-\x20\]\*p\[\x00-\x20\]\*t\[\x00-\x20\]\*:#iu','$1=$2novbscript...',$data);
$data=preg\_replace('#(\[a-z\]\*)\[\x00-\x20\]\*=(\[\'"\]\*)\[\x00-\x20\]\*-moz-binding\[\x00-\x20\]\*:#u','$1=$2nomozbinding...',$data);
//Only works in IE:
$data=preg\_replace('#(\]+?)style\[\x00-\x20\]\*=\[\x00-\x20\]\*\[`\'"\]\*.\*?expression\[\x00-\x20\]\*\(\[^>\]\*+>#i','$1>',$data);
$data=preg\_replace('#(\]+?)style\[\x00-\x20\]\*=\[\x00-\x20\]\*\[`\'"\]\*.\*?behaviour\[\x00-\x20\]\*\(\[^>\]\*+>#i','$1>',$data);
$data=preg\_replace('#(\]+?)style\[\x00-\x20\]\*=\[\x00-\x20\]\*\[`\'"\]\*.\*?s\[\x00-\x20\]\*c\[\x00-\x20\]\*r\[\x00-\x20\]\*i\[\x00-\x20\]\*p\[\x00-\x20\]\*t\[\x00-\x20\]\*:\*\[^>\]\*+>#iu','$1>',$data);
//Remove namespaced elements (we do not need them)
$data=preg\_replace('#\]\*+>#i','',$data);
do{//Remove really unwanted tags
$old\_data=$data;
$data=preg\_replace('#\]\*+>#i','',$data);
}while($old\_data!==$data);
//we are done...
return$data;
}
方法三:
//php防注入和XSS攻擊通用過濾.
$\_GET&&
SafeFilter($\_GET);
$\_POST&&
SafeFilter($\_POST);
$\_COOKIE&&
SafeFilter($\_COOKIE);
functionSafeFilter
(&$arr)
{
$ra=Array('/(\[\\x00-\\x08,\\x0b-\\x0c,\\x0e-\\x19\])/','/script/','/javascript/','/vbscript/','/expression/','/applet/','/meta/','/xml/','/blink/','/link/','/style/','/embed/','/object/','/frame/','/layer/','/title/','/bgsound/','/base/','/onload/','/onunload/','/onchange/','/onsubmit/','/onreset/','/onselect/','/onblur/','/onfocus/','/onabort/','/onkeydown/','/onkeypress/','/onkeyup/','/onclick/','/ondblclick/','/onmousedown/','/onmousemove/','/onmouseout/','/onmouseover/','/onmouseup/','/onunload/');
if(is\_array($arr))
{
foreach($arras$key=>$value)
{
if(!is\_array($value))
{
if(!get\_magic\_quotes\_gpc())//不對magic\_quotes\_gpc轉義過的字符使用addslashes(),避免雙重轉義。
{
$value=addslashes($value);//給單引號(')、雙引號(")、反斜線(\\)與
NUL(NULL 字符)加上反斜線轉義
}
$value=preg\_replace($ra,'',$value);//刪除非打印字符,粗暴式過濾xss可疑字符串$arr\[$key\]
\= htmlentities(strip\_tags($value));//去除
HTML 和 PHP 標記并轉換為 HTML 實體
}
else
{
SafeFilter($arr\[$key\]);
}
}
}
}
?>
1.1 什么是XSS攻擊
XSS是一種經常出現在web應用中的計算機安全漏洞,它允許惡意web用戶將代碼植入到提供給其它用戶使用的頁面中。比如這些代碼包括HTML代碼和客戶端腳本。攻擊者利用XSS漏洞旁路掉訪問控制——例如[同源策略](http://baike.baidu.com/view/3747010.htm)(same origin policy)。這種類型的漏洞由于被黑客用來編寫危害性更大的[網絡釣魚](http://baike.baidu.com/view/77554.htm)(Phishing)攻擊而變得廣為人知。對于[跨站腳本攻擊](http://baike.baidu.com/view/2633667.htm),黑客界共識是:跨站腳本攻擊是新型的“[緩沖區溢出攻擊](http://baike.baidu.com/view/700134.htm)“,而JavaScript是新型的“ShellCode”。
數據來源:2007 OWASP Top 10的MITRE數據
注:OWASP是世界上最知名的Web安全與[數據庫安全](http://baike.baidu.com/view/1317202.htm)研究組織
在2007年OWASP所統計的所有安全威脅中,跨站腳本攻擊占到了22%,高居所有Web威脅之首。
XSS攻擊的危害包括
1、盜取各類用戶[帳號](http://baike.baidu.com/view/261440.htm),如機器登錄帳號、用戶網銀帳號、各類管理員帳號
2、控制企業數據,包括讀取、篡改、添加、刪除企業敏感數據的能力
3、盜竊企業重要的具有商業價值的資料
4、非法轉賬
5、強制發送電子郵件
6、網站掛馬
7、控制受害者機器向其它網站發起攻擊
1.2 XSS漏洞的分類
XSS漏洞按照攻擊利用手法的不同,有以下三種類型:
類型A,本地利用漏洞,這種漏洞存在于頁面中客戶端腳本自身。其攻擊過程如下所示:
Alice給Bob發送一個惡意構造了Web的[URL](http://baike.baidu.com/view/1496.htm)。
Bob點擊并查看了這個URL。
惡意頁面中的JavaScript打開一個具有漏洞的HTML頁面并將其安裝在Bob電腦上。
具有漏洞的HTML頁面包含了在Bob電腦本地域執行的JavaScript。
Alice的[惡意腳本](http://baike.baidu.com/view/335609.htm)可以在Bob的電腦上執行Bob所持有的權限下的命令。
類型B,反射式漏洞,這種漏洞和類型A有些類似,不同的是Web客戶端使用Server端腳本生成頁面為用戶提供數據時,如果未經驗證的用戶數據被包含在頁面中而未經[HTML實體](http://baike.baidu.com/view/4757776.htm)編碼,客戶端代碼便能夠注入到[動態頁面](http://baike.baidu.com/view/2065821.htm)中。其攻擊過程如下:
Alice經常瀏覽某個網站,此網站為Bob所擁有。Bob的站點運行Alice使用用戶名/密碼進行登錄,并存儲敏感信息(比如銀行帳戶信息)。
Charly發現Bob的站點包含反射性的XSS漏洞。
Charly編寫一個利用漏洞的URL,并將其冒充為來自Bob的郵件發送給Alice。
Alice在登錄到Bob的站點后,瀏覽Charly提供的URL。
嵌入到URL中的[惡意腳本](http://baike.baidu.com/view/335609.htm)在Alice的瀏覽器中執行,就像它直接來自Bob的服務器一樣。此腳本盜竊敏感信息(授權、信用卡、帳號信息等)然后在Alice完全不知情的情況下將這些信息發送到Charly的Web站點。
類型C,存儲式漏洞,該類型是應用最為廣泛而且有可能影響到Web服務器自身安全的漏洞,[駭客](http://baike.baidu.com/view/18742.htm)將攻擊腳本上傳到Web服務器上,使得所有訪問該頁面的用戶都面臨信息泄漏的可能,其中也包括了Web服務器的管理員。其攻擊過程如下:
Bob擁有一個Web站點,該站點允許用戶發布信息/瀏覽已發布的信息。
Charly注意到Bob的站點具有類型C的XSS漏洞。
Charly發布一個熱點信息,吸引其它用戶紛紛閱讀。
Bob或者是任何的其他人如Alice瀏覽該信息,其會話cookies或者其它信息將被Charly盜走。
類型A直接威脅用戶個體,而類型B和類型C所威脅的對象都是企業級Web應用。
傳統防御技術
[編輯](https://www.jianshu.com/writer)
2.1.1基于特征的防御
XSS漏洞和著名的SQL[注入漏洞](http://baike.baidu.com/view/677614.htm)一樣,都是利用了Web頁面的編寫不完善,所以每一個漏洞所利用和針對的弱點都不盡相同。這就給XSS漏洞防御帶來了困難:不可能以單一特征來概括所有XSS攻擊。
傳統XSS防御多采用[特征匹配](http://baike.baidu.com/view/665174.htm)方式,在所有提交的信息中都進行匹配檢查。對于這種類型的XSS攻擊,采用的模式匹配方法一般會需要對“javascript”這個[關鍵字](http://baike.baidu.com/view/390935.htm)進行檢索,一旦發現提交信息中包含“javascript”,就認定為XSS攻擊。這種檢測方法的缺陷顯而易見:駭客可以通過插入字符或完全編碼的方式躲避檢測:
躲避方法1)在javascript中加入多個tab鍵,得到
;
躲避方法2) 在javascript中加入(空格)[字符](http://baike.baidu.com/view/263416.htm),得到
;
躲避方法3) 在javascript中加入(回車)字符,得到
< IMG SRC="jav
ascript:alert('XSS');" >;
躲避方法4)在javascript中的每個[字符](http://baike.baidu.com/view/263416.htm)間加入回車換行符,得到
< IMG SRC="javascrip\\r
\\nt:alert('XSS');" >
躲避方法5)對"javascript:alert('XSS')"采用完全編碼,得到
上述方法都可以很容易的躲避基于特征的檢測。而除了會有大量的漏報外,基于特征的
還存在大量的誤報可能:在上面的例子中,對上述某網站這樣一個地址,由于包含了關鍵字“javascript”,也將會觸發報警。
2.1.2 基于代碼修改的防御
和SQL注入防御一樣,XSS攻擊也是利用了Web頁面的編寫疏忽,所以還有一種方法就是從Web應用開發的角度來避免:
步驟1、對所有用戶提交內容進行可靠的輸入驗證,包括對URL、查詢關鍵字、HTTP頭、POST數據等,僅接受指定長度范圍內、采用適當格式、采用所預期的字符的內容提交,對其他的一律過濾。
步驟2、實現Session標記(session tokens)、CAPTCHA系統或者HTTP引用頭檢查,以防功能被第三方網站所執行。
步驟3、確認接收的的內容被妥善的規范化,僅包含最小的、安全的Tag(沒有javascript),去掉任何對遠程內容的引用(尤其是樣式表和javascript),使用HTTP only的cookie。
當然,如上操作將會降低Web業務系統的可用性,用戶僅能輸入少量的制定字符,人與系統間的交互被降到極致,僅適用于信息發布型站點。并且考慮到很少有Web編碼人員受過正規的安全培訓,很難做到完全避免頁面中的XSS漏洞。
3 綜論
XSS攻擊作為Web業務的最大威脅之一,不僅危害Web業務本身,對訪問Web業務的用戶也會帶來直接的影響,如何防范和阻止XSS攻擊,保障Web站點的業務安全,是定位于業務威脅防御的入侵防御產品的本職工作。
受攻擊事件
[編輯](https://www.jianshu.com/writer)
新浪微博XSS受攻擊事件
2011年6月28日晚,新浪微博出現了一次比較大的XSS攻擊事件。大量用戶自動發送諸如:“郭美美事件的一些未注意到的細節”,“建黨大業中穿幫的地方”,“讓女人心動的100句詩歌”,“3D肉團團高清普通話版種子”,“這是傳說中的神仙眷侶啊”,“驚爆!范冰冰艷照真流出了”等等微博和私信,并自動關注一位名為[hellosamy](http://baike.baidu.com/view/6001028.htm)的用戶。
事件的經過線索如下:
20:14,開始有大量帶V的認證用戶中招轉發[蠕蟲](http://baike.baidu.com/view/2596.htm)
20:30,某網站中的病毒頁面無法訪問
20:32,新浪微博中hellosamy用戶無法訪問
21:02,新浪漏洞修補完畢
http://baike.baidu.com/link?url=U6aHSRPZGSNdlqqaQPs\_CEHwU6PJuv71AgK2bjszQR2jSzggRNGomF4BjImBqCMIKJARajr-cLI2PdvCKXcN6a
- 技能知識點
- 對死鎖問題的理解
- 文件系統原理:如何用1分鐘遍歷一個100TB的文件?
- 數據庫原理:為什么PrepareStatement性能更好更安全?
- Java Web程序的運行時環境到底是怎樣的?
- 你真的知道自己要解決的問題是什么嗎?
- 如何解決問題
- 經驗分享
- GIT的HTTP方式免密pull、push
- 使用xhprof對php7程序進行性能分析
- 微信掃碼登錄和使用公眾號方式進行掃碼登錄
- 關于curl跳轉抓取
- Linux 下配置 Git 操作免登錄 ssh 公鑰
- Linux Memcached 安裝
- php7安裝3.4版本的phalcon擴展
- centos7下php7.0.x安裝phalcon框架
- 將字符串按照指定長度分割
- 搜索html源碼中標簽包的純文本
- 更換composer鏡像源為阿里云
- mac 隱藏文件顯示/隱藏
- 谷歌(google)世界各國網址大全
- 實戰文檔
- PHP7安裝intl擴展和linux安裝icu
- linux編譯安裝時常見錯誤解決辦法
- linux刪除文件后不釋放磁盤空間解決方法
- PHP開啟異步多線程執行腳本
- file_exists(): open_basedir restriction in effect. File完美解決方案
- PHP 7.1 安裝 ssh2 擴展,用于PHP進行ssh連接
- php命令行加載的php.ini
- linux文件實時同步
- linux下php的psr.so擴展源碼安裝
- php將字符串中的\n變成真正的換行符?
- PHP7 下安裝 memcache 和 memcached 擴展
- PHP 高級面試題 - 如果沒有 mb 系列函數,如何切割多字節字符串
- PHP設置腳本最大執行時間的三種方法
- 升級Php 7.4帶來的兩個大坑
- 不同域名的iframe下,fckeditor在chrome下的SecurityError,解決辦法~~
- Linux find+rm -rf 執行組合刪除
- 從零搭建Prometheus監控報警系統
- Bug之group_concat默認長度限制
- PHP生成的XML顯示無效的Char值27消息(PHP generated XML shows invalid Char value 27 message)
- XML 解析中,如何排除控制字符
- PHP各種時間獲取
- nginx配置移動自適應跳轉
- 已安裝nginx動態添加模塊
- auto_prepend_file與auto_append_file使用方法
- 利用nginx實現web頁面插入統計代碼
- Nginx中的rewrite指令(break,last,redirect,permanent)
- nginx 中 index try_files location 這三個配置項的作用
- linux安裝git服務器
- PHP 中運用 elasticsearch
- PHP解析Mysql Binlog
- 好用的PHP學習網(持續更新中)
- 一篇寫給準備升級PHP7的小伙伴的文章
- linux 安裝php7 -系統centos7
- Linux 下多php 版本共存安裝
- PHP編譯安裝時常見錯誤解決辦法,php編譯常見錯誤
- nginx upstream模塊--負載均衡
- 如何解決Tomcat服務器打開不了HOST Manager的問題
- PHP的內存泄露問題與垃圾回收
- Redis數據結構 - string字符串
- PHP開發api接口安全驗證
- 服務接口API限流 Rate Limit
- php內核分析---內存管理(一)
- PHP內存泄漏問題解析
- 【代碼片-1】 MongoDB與PHP -- 高級查詢
- 【代碼片-1】 php7 mongoDB 簡單封裝
- php與mysql系統中出現大量數據庫sleep的空連接問題分析
- 解決crond引發大量sendmail、postdrop進程問題
- PHP操作MongoDB GridFS 存儲文件,如圖片文件
- 淺談php安全
- linux上keepalived+nginx實現高可用web負載均衡
- 整理php防注入和XSS攻擊通用過濾