什麼是XSS:這裡通俗的講,就像是SQL注入一樣,XSS攻擊也可以算是對HTML和JS的一種注入。你本來希望得到是從用戶那得到一段有用的文本文字,但用戶提交給你的卻是別有用心的可執行javasc ript或其它腳本(這裡並沒有把破壞樣式或文檔文本當作攻擊),當你再把這些提交的內容顯示到頁面上時,XSS攻擊就發生了。
關於XSS的攻擊方式和場景層出不窮,本文也只是做的普及一些基本的安全防護知識(不涉及flash腳本攻擊),如果想徹底研究這種攻擊方式推薦一本書<
本文的需掌握的基礎知識: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是不是來原始授權使用者。
典型的應用範例:
$auto=I('post.auto');//用户设置了自动登录 if(!empty($auto)){ cookie('auto',encrypt(serialize($data)));//将登录信息保存到cookie,其中$data里含有加密后的帐号,密码,和用户的IP,这里的cookie已在全局中设置过期日期为一周 }
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設定
4:HTML5值得觀註的新功能:
為iframe的增加的sandbox屬性,可以防止不信任的Web頁面執行某些操作.相信這個方法以後會被廣泛使用。
5:富文本過濾
#富文本過濾是,XSS攻擊最令人頭痛的話題,不僅是小網站,就連BAT這樣的巨頭也是三天兩頭的被其困擾.
#更多ThinkPHP相關技術文章,請訪問ThinkPHP使用教學欄位進行學習!
以上是thinkphp過濾xss的詳細內容。更多資訊請關注PHP中文網其他相關文章!