什么是XSS:這里通俗的講,就像是SQL注入一樣,XSS攻擊也可以算是對HTML和JS的一種注入。你本來希望得到是從用戶那得到一段有用的文本文字,但用戶提交給你的卻是別有用心的可執行javasc ript或其它腳本(這里並沒有把破壞樣式或文檔文本當作攻擊),當你再把這些提交的內容顯示到頁面上時,XSS攻擊就發生了。
關於XSS的攻擊方式和場景層出不窮,本文也只是做的普及一些基本的安全防護知識(不涉及flash腳本攻擊),如果想徹底研究這種攻擊方式推薦一本書<<XSS跨站腳本攻擊剖析與防御>>,如果沒時間看書的話就把本文看完吧。
本文的需掌握的基礎知識:cookie,session工作原理,對TP框架有一定了解。
1:抵御99%的攻擊方式,適用於90%的場景.
當網站不涉及復雜的用戶交互時,可以對用戶所有提交的文本進行htmlspecialchars函數處理。
在THINKPHP3.2版本中的操作步驟是:
一:在項目配置文件中添加配置: 'DEFAULT_FILTER' => 'htmlspecialchars', //默認過濾函數
二: 使用框架帶的I方法獲取來自用戶提交的數據;
例子:M('Member')->save(array('content'=>I('post.content')));這樣添加的content內容是經過htmlspecialchars處理過的.
提問:為什么經過htmlspecialchars處理過的文本可以保證是安全的?
回答:縱觀XSS各種攻擊方式絕大多數依賴<>'"& 這幾個字符中的一個或幾個對內容進行注入攻擊。而htmlspecialchars函數的作用就是將這些字符轉換成無害的HTML 實體;
提問:為什么有這么好的方法,而還有好多網站還是被攻擊.
回答:因為好多程序員總會粗心忘記使用這個方法,而遺漏某條數據的過濾。
2:對COOKIE進行IP綁定
cookie里面一般有自動登錄信息和session_id,就算對cookie里面的內容全部加了密,cookie的信息一但被別人通過XSS攻擊獲取后也一樣等同於把自己的帳號密碼給了別人。
對cookie進行IP綁定,(當然也可以獲取用戶客戶端更多的其它信息進行同時綁定)可以根據用戶的IP來判斷這個cookie是不是來原始授權用戶。
典型的應用示例:
-
用戶設置了自動登錄時保存自動登錄信息:
-
1
2
3
4
$auto
=I(
'post.auto'
);
//用戶設置了自動登錄
if
(!
empty
(
$auto
)){
cookie(
'auto'
,encrypt(serialize(
$data
)));
//將登錄信息保存到cookie,其中$data里含有加密后的帳號,密碼,和用戶的IP,這里的cookie已在全局中設置過期日期為一周
}
-
用戶關閉瀏覽器再次訪問網站時,進行自動登錄
-
1
2
3
4
5
6
7
8
9
10
11
12
if
(!is_login()) {
//是否未登錄狀態?
$auth
=cookie(
'auto'
);
if
(!
empty
(
$auth
)){
//是否未有自動登錄cookie?
$data
=unserialize(decrypt(
$auth
));
if
(!
empty
(
$data
) && !
empty
(
$data
[
'username'
]) && !
empty
(
$data
[
'password'
]) && !
empty
(
$data
[
'last_login_ip'
])){
$user
=M(
'Member'
)->where(
array
(
'username'
=>
$data
[
'username'
],
'password'
=>
$data
[
'password'
]))->find();
if
(!
empty
(
$user
[
'id'
])&&(
$user
[
'last_login_ip'
]==get_client_ip())){
//cookie帳號密碼是否有效?//IP來源是否相同?
login_session(
$user
[
'id'
],
$user
[
'username'
],
$data
[
'last_login_ip'
]);
//用戶自動登錄成功
}
}
}
}
優點:大多數場景下可使被XSS攻擊盜取的cookie失效。缺點:由於IP存在多台電腦共用的可能,對綁定做不到十分精細。
3:為COOKIE添加httponly配置
-
最新版本的thinkphp已經支持此參數。
-
此參數可以保證cookie只在http請求中被傳輸,而不被頁面中的腳本獲取,現市面上絕大多數瀏覽器已經支持。
4:HTML5值得觀注的新特性:
-
<iframe src="http://alibaba.com" sandbox>
-
為iframe的增加的sandbox屬性,可以防止不信任的Web頁面執行某些操作.相信這個方法以后會被廣泛使用。
5:富文本過濾
-
富文本過濾是,XSS攻擊最令人頭疼的話題,不僅是小網站,就連BAT這樣的巨頭也是三天兩頭的被其困擾.
更多ThinkPHP相關技術文章,請訪問ThinkPHP使用教程欄目進行學習!
以上就是thinkphp過濾xss的詳細內容,更多請關注php中文網其它相關文章!
==============================================================================================
● XSS(跨站腳本攻擊)兩種形式:輸入JS代碼或者HTML代碼導致頁面亂。
● XSS(跨站腳本攻擊)可以用於竊取其他用戶的Cookie信息,要避免此類問題,可以采用如下解決方案:
直接過濾所有的JavaScript腳本;
轉義Html元字符,使用htmlentities、htmlspecialchars等函數;
系統的擴展函數庫提供了XSS安全過濾的remove_xss方法;
新版對URL訪問的一些系統變量已經做了XSS處理。
用戶提交的表單信息時候,該表單里邊有可能存在相關的“代碼”(html/css/js等代碼),這樣代碼會在信息顯示的時候對頁面效果造成干擾。
1、下載htmlpurifier,解壓后將library文件夾放到ThinkPhp的插件文件夾並在分組的common文件夾中創建function.php
2、在function,php中創建防止xss攻擊方法
3.我們可以將從post中得到的數據先通過hThinkphp系統自帶的I()方法來進行數據過濾然后在通過調用函數fanXSS進行過濾即可
舉以下的例子:
在thinphp開發后台過程中需要添加編輯器,要讓編輯器正常顯示就要設置I函數不過濾。
現在的問題來了,如果不過濾就會被XSS攻擊如果過濾在線編輯器就不好使了,解決的辦法應該是有選擇性的過濾,
我們可以一個開源的過濾的包:htmlpurifier包。
把下載的包解壓到跟目錄改名為HTMLpurifier
創建一個函數
然后修改配置文件config.php讓I函數使用這個函數來過濾:
現在網站中I函數過濾時使用的就是我們寫的這個函數:有選擇性的過濾只過濾危險代碼。
網站就很安全了!
本文來自ThinkPHP框架技術文章欄目:http://www.php.cn/phpkj/thinkphp/
以上就是thinkphp中防止xss攻擊的方法的詳細內容,更多請關注php中文網其它相關文章!