什么是xss:這里通俗的講,就像是sql注入一樣,XSS攻擊也可以算是對(duì)html和JS的一種注入。你本來(lái)希望得到是從用戶(hù)那得到一段有用的文本文字,但用戶(hù)提交給你的卻是別有用心的可執(zhí)行javasc ript或其它腳本(這里并沒(méi)有把破壞樣式或文檔文本當(dāng)作攻擊),當(dāng)你再把這些提交的內(nèi)容顯示到頁(yè)面上時(shí),XSS攻擊就發(fā)生了。
關(guān)于XSS的攻擊方式和場(chǎng)景層出不窮,本文也只是做的普及一些基本的安全防護(hù)知識(shí)(不涉及flash腳本攻擊),如果想徹底研究這種攻擊方式推薦一本書(shū)>,如果沒(méi)時(shí)間看書(shū)的話就把本文看完吧。
本文的需掌握的基礎(chǔ)知識(shí):Cookie,Session工作原理,對(duì)TP框架有一定了解。
1:抵御99%的攻擊方式,適用于90%的場(chǎng)景.
當(dāng)網(wǎng)站不涉及復(fù)雜的用戶(hù)交互時(shí),可以對(duì)用戶(hù)所有提交的文本進(jìn)行htmlspecialchars函數(shù)處理。
在thinkphp3.2版本中的操作步驟是:
一:在項(xiàng)目配置文件中添加配置: ‘DEFAULT_FILTER’ => ‘htmlspecialchars’, //默認(rèn)過(guò)濾函數(shù)
二: 使用框架帶的I方法獲取來(lái)自用戶(hù)提交的數(shù)據(jù);
例子:M(‘Member’)->save(Array(‘content’=>I(‘post.content’)));這樣添加的content內(nèi)容是經(jīng)過(guò)htmlspecialchars處理過(guò)的.
提問(wèn):為什么經(jīng)過(guò)htmlspecialchars處理過(guò)的文本可以保證是安全的?
回答:縱觀XSS各種攻擊方式絕大多數(shù)依賴(lài)'”& 這幾個(gè)字符中的一個(gè)或幾個(gè)對(duì)內(nèi)容進(jìn)行注入攻擊。而htmlspecialchars函數(shù)的作用就是將這些字符轉(zhuǎn)換成無(wú)害的HTML 實(shí)體;
提問(wèn):為什么有這么好的方法,而還有好多網(wǎng)站還是被攻擊.
回答:因?yàn)楹枚喑绦騿T總會(huì)粗心忘記使用這個(gè)方法,而遺漏某條數(shù)據(jù)的過(guò)濾。
2:對(duì)COOKIE進(jìn)行IP綁定
cookie里面一般有自動(dòng)登錄信息和session_id,就算對(duì)cookie里面的內(nèi)容全部加了密,cookie的信息一但被別人通過(guò)XSS攻擊獲取后也一樣等同于把自己的帳號(hào)密碼給了別人。
對(duì)cookie進(jìn)行IP綁定,(當(dāng)然也可以獲取用戶(hù)客戶(hù)端更多的其它信息進(jìn)行同時(shí)綁定)可以根據(jù)用戶(hù)的IP來(lái)判斷這個(gè)cookie是不是來(lái)原始授權(quán)用戶(hù)。
典型的應(yīng)用示例:
-
用戶(hù)設(shè)置了自動(dòng)登錄時(shí)保存自動(dòng)登錄信息:
-
$auto=I('post.auto');//用戶(hù)設(shè)置了自動(dòng)登錄 if(!empty($auto)){ cookie('auto',encrypt(serialize($data)));//將登錄信息保存到cookie,其中$data里含有加密后的帳號(hào),密碼,和用戶(hù)的IP,這里的cookie已在全局中設(shè)置過(guò)期日期為一周 }
-
用戶(hù)關(guān)閉瀏覽器再次訪問(wèn)網(wǎng)站時(shí),進(jìn)行自動(dòng)登錄
-
if?(!is_login())?{//是否未登錄狀態(tài)? $auth=cookie('auto'); if(!empty($auth)){//是否未有自動(dòng)登錄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帳號(hào)密碼是否有效?//IP來(lái)源是否相同? login_session($user['id'],?$user['username'],?$data['last_login_ip']);//用戶(hù)自動(dòng)登錄成功 } } } }
優(yōu)點(diǎn):大多數(shù)場(chǎng)景下可使被XSS攻擊盜取的cookie失效。缺點(diǎn):由于IP存在多臺(tái)電腦共用的可能,對(duì)綁定做不到十分精細(xì)。
3:為COOKIE添加httponly配置
-
最新版本的thinkphp已經(jīng)支持此參數(shù)。
-
此參數(shù)可以保證cookie只在http請(qǐng)求中被傳輸,而不被頁(yè)面中的腳本獲取,現(xiàn)市面上絕大多數(shù)瀏覽器已經(jīng)支持。
立即學(xué)習(xí)“PHP免費(fèi)學(xué)習(xí)筆記(深入)”;
4:html5值得觀注的新特性:
-
為iframe的增加的sandbox屬性,可以防止不信任的Web頁(yè)面執(zhí)行某些操作.相信這個(gè)方法以后會(huì)被廣泛使用。
5:富文本過(guò)濾
-
富文本過(guò)濾是,XSS攻擊最令人頭疼的話題,不僅是小網(wǎng)站,就連BAT這樣的巨頭也是三天兩頭的被其困擾.
更多ThinkPHP相關(guān)技術(shù)文章,請(qǐng)?jiān)L問(wèn)ThinkPHP使用教程欄目進(jìn)行學(xué)習(xí)!