❶ Web前端新手應該如何防禦XSS攻擊
今天小編要跟大家分享的文章是關於Web前端新手應該如何防禦XSS攻擊。作為JS系工程師接觸最多的漏洞我想就是XSS漏洞了,然而並不是所有的同學對其都有一個清晰的認識。今天我們分享一下XSS漏洞攻擊,希望能幫助到大家。下面我們來一起看一看吧!一、什麼是XSS攻擊XSS(Cross-SiteScripting)又稱跨站腳本,XSS的重點不在於跨站點,而是在於腳本的執行。XSS是一種經常出現在Web應用程序中的計算機安全漏洞,是由於Web應用程序對用戶的輸入過濾不足而產生的。
常見的XSS攻擊有三種:反射型、DOM-based型、存儲型。其中反射型、DOM-based型可以歸類為非持久型XSS攻擊,存儲型歸類為持久型XSS攻擊。
1、反射型
反射型XSS一般是攻擊者通過特定手法(如電子郵件),誘使用戶去訪問一個包含惡意代碼的URL,當受害者點擊這些專門設計的鏈接的時候,惡意代碼會直接在受害者主機上的瀏覽器執行。
對於訪問者而言是一次性的,具體表現在我們把我們的惡意腳本通過URL的方式傳遞給了伺服器,而伺服器則只是不加處理的把腳本「反射」回訪問者的瀏覽器而使訪問者的瀏覽器執行相應的腳本。反射型XSS的觸發有後端的參與,要避免反射性XSS,必須需要後端的協調,後端解析前端的數據時首先做相關的字串檢測和轉義處理。
此類XSS通常出現在網站的搜索欄、用戶登錄口等地方,常用來竊取客戶端Cookies或進行釣魚欺騙。
整個攻擊過程大約如下:
2、DOM-based型
客戶端的腳本程序可以動態地檢查和修改頁面內容,而不依賴於伺服器端的數據。例如客戶端如從URL中提取數據並在本地執行,如果用戶在客戶端輸入的數據包含了惡意的javaScript腳本,而這些腳本沒有經過適當的過濾和消毒,那麼應用程序就可能受到DOM-basedXSS攻擊。需要特別注意以下的用戶輸入源document.URL、location.hash、location.search、document.referrer等。
整個攻擊過程大約如下:
3、存儲型
攻擊者事先將惡意代碼上傳或儲存到漏洞伺服器中,只要受害者瀏覽包含此惡意代碼的頁面就會執行惡意代碼。這就意味著只要訪問了這個頁面的訪客,都有可能會執行這段惡意腳本,因此儲存型XSS的危害會更大。
存儲型XSS一般出現在網站留言、評論、博客日誌等交互處,惡意腳本存儲到客戶端或者服務端的資料庫中。
整個攻擊過程大約如下:
二、XSS攻擊的危害XSS可以導致:
1、攻擊劫持訪問;
2、盜用cookie實現無密碼登錄;
3、配合csrf攻擊完成惡意請求;
4、使用js或css破壞頁面正常的結構與樣式等;三、防禦方法1、XSS防禦之HTML編碼
應用范圍:將不可信數據放入到HTML標簽內(例如div、span等)的時候進行HTML編碼。
編碼規則:將&<>"'/轉義為實體字元(或者十進制、十六進制)。
示例代碼:
_unction_ncodeForHTML(str,_wargs){
__return(''+_tr)
___.replace(/&/g,'&')
___.replace(/<_EX=><_ntity=><
___.replace(/>/g,'>')
___.replace(/"/g,'"')
___.replace(/'/g,''')_//'_煌萍觶蛭輝_TML規范中
___.replace(///g,'/');
_};
HTML有三種編碼表現方式:十進制、十六進制、命名實體。例如小於號(<)可以編碼為"十進制><","十六進制=><","命名實體=><"三種方式。對於單引號(')由於實體字元編碼方式不在HTML規范中,所以此處使用了十六進制編碼。
2、XSS防禦之HTMLAttribute編碼
應用范圍:將不可信數據放入HTML屬性時(不含src、href、style和事件處理屬性),進行HTMLAttribute編碼
編碼規則:除了字母數字字元以外,使用HH;(或者可用的命名實體)格式來轉義ASCII值小於256所有的字元
示例代碼:
_unction_ncodeForHTMLAttibute(str,_wargs){
__let_ncoded=''
__for(let_=0;_<_tr.length;_++)_
___let_h=_ex=_tr[i];
___if(!/[A-Za-z0-9]/.test(str[i])&&_tr.charCodeAt(i)<256)_
____hex=''+_h.charCodeAt(0).toString(16)+''
___}
___encoded+=_ex;
__}
__return_ncoded;
_};
3、XSS防禦之JavaScript編碼
作用范圍:將不可信數據放入事件處理屬性、JavaScirpt值時進行JavaScript編碼
編碼規則:除字母數字字元外,請使用xHH格式轉義ASCII碼小於256的所有字元
示例代碼:
_unction_ncodeForJavascript(str,_wargs)_
__let_ncoded=''
__for(let_=0;_<_tr.length;_++)_
___let_c=_ex=_tr[i];
___if(!/[A-Za-z0-9]/.test(str[i])&&_tr.charCodeAt(i)<256)_
____hex='\x'+_c.charCodeAt().toString(16);
___}
___encoded+=_ex;
__}
__return_ncoded;
_};
4、XSS防禦之URL編碼
作用范圍:將不可信數據作為URL參數值時需要對參數進行URL編碼
編碼規則:將參數值進行encodeURIComponent編碼
示例代碼:
_function_ncodeForURL(str,_wargs){
__return_ncodeURIComponent(str);
_};
5、XSS防禦之CSS編碼
作用范圍:將不可信數據作為CSS時進行CSS編碼
編碼規則:除了字母數字字元以外,使用XXXXXX格式來轉義ASCII值小於256的所有字元
示例代碼:
_unction_ncodeForCSS(attr,_tr,_wargs){
__let_ncoded=''
__for(let_=0;_<_tr.length;_++)_
___let_h=_tr.charAt(i);
___if(!ch.match(/[a-zA-Z0-9]/)_
____let_ex=_tr.charCodeAt(i).toString(16);
____let_ad='.substr((hex.length));
____encoded+='\'+_ad+_ex;
___}_lse_
____encoded+=_h;
___}
__}
__return_ncoded;
_};後記在任何時候用戶的輸入都是不可信的。對於HTTP參數,理論上都要進行驗證,例如某個欄位是枚舉類型,其就不應該出現枚舉以為的值;對於不可信數據的輸出要進行相應的編碼;此外httpOnly、CSP、X-XSS-Protection、SecureCookie等也可以起到有效的防護。
XSS漏洞有時比較難發現,所幸當下React、Vue等框架都從框架層面引入了XSS防禦機制,一定程度上解放了我們的雙手。但是作為開發人員依然要了解XSS基本知識、於細節處避免製造XSS漏洞。框架是輔助,我們仍需以人為本,規范開發習慣,提高Web前端安全意識。
以上就是小編今天為大家分享的關於Web前端新手應該如何防禦XSS攻擊的文章,希望本篇文章能夠對正在從事web前端工作的小夥伴們有所幫助。想要了解更多web前端相關知識記得關注北大青鳥web培訓官網。最後祝願小夥伴們工作順利!
作者:公子
鏈接:#/a/1190000017057646
❷ php網站怎樣防禦xss攻擊
過濾用戶輸入的<script></script>以及其他的HTML標簽等。。
❸ 如何防止xss攻擊,需要過濾什麼
XSS攻擊通常是指黑客通過"HTML注入"篡改了網頁,插入了惡意的腳本,從而在用戶瀏覽網頁時,控制用戶瀏覽器的一種攻擊。
一、HttpOnly防止劫取Cookie
HttpOnly最早由微軟提出,至今已經成為一個標准。瀏覽器將禁止頁面的Javascript訪問帶有HttpOnly屬性的Cookie。目前主流瀏覽器都支持,HttpOnly解決是XSS後的Cookie支持攻擊。
我們來看下網路有沒有使用。
未登錄時的Cookie信息
可以看到,所有Cookie都沒有設置HttpOnly,現在我登錄下
發現在個叫BDUSS的Cookie設置了HttpOnly。可以猜測此Cookie用於認證。
下面我用PHP來實現下:
<?php
header("Set-Cookie: cookie1=test1;");
header("Set-Cookie: cookie2=test2;httponly",false);
setcookie('cookie3','test3',NULL,NULL,NULL,NULL,false);
setcookie('cookie4','test4',NULL,NULL,NULL,NULL,true);
?>
<script>
alert(document.cookie);
</script>
js只能讀到沒有HttpOnly標識的Cookie
二、輸入檢查
輸入檢查一般是檢查用戶輸入的數據中是否包含一些特殊字元,如<、>、'、"等,如果發現存在特殊字元,則將這些字元過濾或者編碼。
例如網站注冊經常用戶名只允許字母和數字的組合,或者郵箱電話,我們會在前端用js進行檢查,但在伺服器端代碼必須再次檢查一次,因為客戶端的檢查很容易繞過。
網上有許多開源的「XSS Filter」的實現,但是它們應該選擇性的使用,因為它們對特殊字元的過濾可能並非數據的本意。比如一款php的lib_filter類:
$filter = new lib_filter();
echo $filter->go('1+1>1');
它輸出的是1,這大大歪曲了數據的語義,因此什麼情況應該對哪些字元進行過濾應該適情況而定。
三、輸出檢查
大多人都知道輸入需要做檢查,但卻忽略了輸出檢查。
1、在HTML標簽中輸出
如代碼:
<?php
$a = "<script>alert(1);</script>";
$b = "<img src=# onerror=alert(2) />";
?>
<div><?=$b?></div>
<a href="#"><?=$a?></a>
這樣客戶端受到xss攻擊,解決方法就是對變數使用htmlEncode,php中的函數是htmlentities
<?php
$a = "<script>alert(1);</script>";
$b = "<img src=# onerror=alert(2) />";
?>
<div><?=htmlentities($b)?></div>
<a href="#"><?=htmlentities($a)?></a>
2、在HTML屬性中輸出
<div id="div" name ="$var"></div>
這種情況防禦也是使用htmlEncode
在owasp-php中實現:
$immune_htmlattr = array(',', '.', '-', '_');
$this->htmlEntityCodec->encode($this->immune_htmlattr, "\"><script>123123;</script><\"");
3、在<script>標簽中輸出
如代碼:
<?php
$c = "1;alert(3)";
?>
<script type="text/javascript">
var c = <?=$c?>;
</script>
這樣xss又生效了。首先js變數輸出一定要在引號內,但是如果我$c = "\"abc;alert(123);//",你會發現放引號中都沒用,自帶的函數都不能很好的滿足。這時只能使用一個更加嚴格的JavascriptEncode函數來保證安全——除數字、字母外的所有字元,都使用十六進制"\xHH"的方式進行編碼。這里我採用開源的owasp-php方法來實現
$immune = array("");
echo $this->javascriptCodec->encode($immune, "\"abc;alert(123);//");
最後輸出\x22abc\x3Balert\x28123\x29\x3B\x2F\x2F
4、在事件中輸出
<a href="#" onclick="funcA('$var')" >test</a>
可能攻擊方法
<a href="#" onclick="funcA('');alter(/xss/;//')">test</a>
這個其實就是寫在<script>中,所以跟3防禦相同
5、在css中輸出
在owasp-php中實現:
$immune = array("");
$this->cssCodec->encode($immune, 'background:expression(window.x?0:(alert(/XSS/),window.x=1));');
6、在地址中輸出
先確保變數是否是"http"開頭,然後再使用js的encodeURI或encodeURIComponent方法。
在owasp-php中實現:
$instance = ESAPI::getEncoder();
$instance->encodeForURL(『url』);
四、處理富文體
就像我寫這篇博客,我幾乎可以隨意輸入任意字元,插入圖片,插入代碼,還可以設置樣式。這個時要做的就是設置好白名單,嚴格控制標簽。能自定義 css件麻煩事,因此最好使用成熟的開源框架來檢查。php可以使用htmlpurify
五、防禦DOM Based XSS
DOM Based XSS是從javascript中輸出數據到HTML頁面里。
<script>
var x = "$var";
document.write("<a href='"+x+"'>test</a>");
</script>
按照三中輸出檢查用到的防禦方法,在x賦值時進行編碼,但是當document.write輸出數據到HTML時,瀏覽器重新渲染了頁面,會將x進行解碼,因此這么一來,相當於沒有編碼,而產生xss。
防禦方法:首先,還是應該做輸出防禦編碼的,但後面如果是輸出到事件或腳本,則要再做一次javascriptEncode編碼,如果是輸出到HTML內容或屬性,則要做一次HTMLEncode。
會觸發DOM Based XSS的地方有很多:
document.write()、document.writeln()、xxx.innerHTML=、xxx.outerHTML=、innerHTML.replace、document.attachEvent()、window.attachEvent()、document.location.replace()、document.location.assign()
❹ 如何防止跨站點腳本攻擊
你好~
XSS漏洞產生的原因:
跨站點腳本的主要原因是程序猿對用戶的信任。開發人員輕松地認為用戶永遠不會試圖執行什麼出格的事情,所以他們創建應用程序,卻沒有使用任何額外的代碼來過濾用戶輸入以阻止任何惡意活動。另一個原因是,這種攻擊有許多變體,用製造出一種行之有效的XSS過濾器是一件比較困難的事情。
但是這只是相對的,對用戶輸入數據的」編碼」和」過濾」在任何時候都是很重要的,我們必須採取一些針對性的手段對其進行防禦。
如何創造一個良好的XSS過濾器來阻止大多數XSS攻擊代碼
1 .需要重點」編碼」和」過濾」的對象
The URL
HTTP referrer objects
GET parameters from a form
POST parameters from a form
Window.location
Document.referrer
document.location
document.URL
document.URLUnencoded
cookie data
headers data
database data
防禦XSS有一個原則:
以當前的應用系統為中心,所有的進入應用系統的數據都看成是輸入數據(包括從FORM表單或者從資料庫獲取到的數據),所有從當前應用系統流出的數據都看作是輸出(包括輸出到用戶瀏覽器或向資料庫寫入數據)
對輸入的數據進行」過濾」,對輸出數據進行」編碼」。這里的」編碼」也要注意,必須針對數據具體的上下文語境進行針對性的編碼。例如數據是輸出到HTML中的那就要進行HtmlEncode,如果數據是輸出到javascript代碼中進行拼接的,那就要進行javascriptEncode。
如果不搞清楚數據具體輸出的語境,就有可能因為HtmlParser()和javascriptParser()兩種解析引擎的執行先後問題導致看似嚴密的」編碼」形同虛設。
2. HtmlEncode HTML編碼
它的作用是將字元轉換成HTMLEntities,對應的標準是ISO-8859-1
為了對抗XSS,在HtmlEncode中要求至少轉換以下字元:
& --> &
< --> <
> --> >
" --> "
' --> '
/ --> /
在PHP中:
htmlentities
http://www.w3school.com.cn/php/func_string_htmlentities.asp
htmlspecialchars
http://www.w3school.com.cn/php/func_string_htmlspecialchars.asp
3. javascriptEncode javascript」編碼」
javascriptEncode與HtmlEncode的編碼方法不同,HtmlEncode是去編碼,而javascriptEncode更多的像轉義,它需要使用」\」對特殊字元進行轉義。從原理上來講,這都符合編碼函數的一個大原則: 將數據和代碼區分開,因為對於HTML Tag來說,我們對其進行」可視化(轉換成可以見字元)」的編碼可以將數據和HTML的界限分開。而對於javascript來說,我們除了要進行編碼之外,還需要對特殊字元進行轉義,這樣攻擊輸入的用於」閉合」的特殊字元就無法發揮作用,從而避免XSS攻擊,除此之外,在對抗XSS時,還要求輸出的變數必須在引號內部,以避免造成安全問題。
escape()
http://www.w3school.com.cn/js/jsref_escape.asp
該方法不會對 ASCII 字母和數字進行編碼,也不會對下面這些 ASCII 標點符號進行編碼: * @ – _ + . / 。其他所有的字元都會被轉義序列(十六進制\xHH)替換。
利用這個編碼函數,不僅能防禦XSS攻擊,還可以防禦一些command注入。
一些開源的防禦XSS攻擊的代碼庫:
PHP AntiXSS
這是一個不錯的PHP庫,可以幫助開發人員增加一層保護,防止跨站腳本漏洞。
https://code.google.com/p/php-antixss/
xss_clean.php filter
https://gist.github.com/mbijon/1098477
HTML Purifier
http://htmlpurifier.org/
xssprotect
https://code.google.com/p/xssprotect/
XSS HTML Filter
http://finn-no.github.io/xss-html-filter/
原文地址:http://resources.infosecinstitute.com/how-to-prevent-cross-site-scripting-attacks/
希望可以幫助到你~望採納哦~謝謝~
❺ 如何正確防禦xss攻擊
1、基於特徵的防禦。XSS漏洞和著名的SQL注入漏洞一樣,都是利用了Web頁面的編寫不完善,所以每一個漏洞所利用和針對的弱點都不盡相同,這就是給XSS漏洞防禦帶來的困難,不可能以單一特徵來概括所有XSS攻擊。
傳統的XSS防禦在進行攻擊鑒別時多採用特徵匹配方式,主要是針對JavaScript這個關鍵詞進行檢索,但是這種鑒別不夠靈活,凡是提交的信息中各有JavaScript時,就被硬性的判定為XSS攻擊。
2、基於代碼修改的防禦。Web頁面開發者在編寫程序時往往會出現一些失誤或漏洞,XSS攻擊正是利用了失誤和漏洞,因此一種比較理想的方法就是通過優化Web應用開發來減少漏洞,避免被攻擊:
①用戶向伺服器上提交的信息要對URL和附帶的HTTP頭、POST數據等進行查詢,對不是規定格式、長度的內容進行過濾。
②實現Session標記、CAPTCHA系統或者HTTP引用頭檢查,以防功能被第三方網站所執行。
③確認接收的內容被妥善的規范化,僅包含最小的、安全的Tag,去掉任何對遠程內容的引用,使用HTTP only的cookie。
3、客戶端分層防禦策略。客戶端跨站腳本攻擊的分層防禦策略是基於獨立分配線程和分層防禦策略的安全模型。它建立在客戶端,這是它與其他模型最大的區別。之所以客戶端安全性如此重要,客戶端在接受伺服器信息,選擇性的執行相關內容。這樣就可以使防禦XSS攻擊變得容易,該模型主要由三大部分組成:
①對每一個網頁分配獨立線程且分析資源消耗的網頁線程分析模塊;
②包含分層防禦策略四個規則的用戶輸入分析模塊;
③保存互聯網上有關XSS惡意網站信息的XSS信息資料庫。
❻ 求教ThinkPHP 有自帶的防止XSS的代碼么
你好,據我所知,ThinkPHP並沒有自帶的防止XSS的代碼.不過,在PHP上,要想防止XSS,其實很簡單,只需要調用一個函數即可:htmlspecialchars()
在你的要求輸入字元的位置,調用htmlspecialchars()函數即可.
希望我的回答能夠對你有所幫助.
❼ 如何正確防禦xss攻擊
XSS攻擊通常是指黑客通過"HTML注入"篡改了網頁,插入了惡意的腳本,從而在用戶瀏覽網頁時,控制用戶瀏覽器的一種攻擊。 一、HttpOnly防止劫取Cookie HttpOnly最早由微軟提出,至今已經成為一個標准。
❽ 如何實現php的安全最大化怎樣避免sql注入漏洞和xss跨站腳本攻擊漏洞
使用php安全模式
伺服器要做好管理,賬號許可權是否合理。
假定所有用戶的輸入都是「惡意」的,防止XSS攻擊,譬如:對用戶的輸入輸出做好必要的過濾
防止CSRF,表單設置隱藏域,post一個隨機字元串到後台,可以有效防止跨站請求偽造。
文件上傳,檢查是否做好效驗,要注意上傳文件存儲目錄許可權。
防禦SQL注入。
1.使用預編譯語句
2.使用安全的存儲過程
3.檢查輸入數據的數據類型
4.從資料庫自身的角度考慮,應該使用最小許可權原則,不可使用root或dbowner的身份連接資料庫。若多個應用使用同一個資料庫,也應該為資料庫分配不同的賬戶。web應用使用的資料庫賬戶,不應該有創建自定義函數,操作本地文件的許可權。
1.假定所有用戶輸入都是「邪惡」的
2.考慮周全的正則表達式
3.為cookie設置HttpOnly,防止cookie劫持
4.外部js不一定可靠
5.出去不必要的HTML注釋
6. 針對非法的HTML代碼包括單雙引號等,使用htmlspecialchars()函數。
❾ XSS攻擊的定義,類型以及防禦方法
XXS攻擊全稱跨站腳本攻擊,是一種在Web應用中的計算機安全漏洞,它允許惡意Web用戶將代碼植入到提供給其他使用的頁面中。
XSS攻擊有哪幾種類型?下面就由銳速雲的小編為大家介紹一下
經常見到XSS攻擊有三種:反射XSS攻擊、DOM-based型XSS攻擊以及儲存型XSS攻擊。
[if !supportLists]1、[endif]反射型XSS攻擊
反射性XSS一般是攻擊者通過特定手法(如電子郵件),誘使用戶去訪問一個包含惡意代碼的URL,當受害者點擊這些專門設計鏈接的時候,惡意代碼會直接在受害主機上的瀏覽器上執行,反射型XSS通常出現在網站搜索欄,用戶登入口等地方,常用來竊取客戶端或進行釣魚欺騙。
[if !supportLists]2、[endif]存儲型XSS攻擊
存儲型XSS攻擊也叫持久型XSS,主要將XSS代碼提交儲存在伺服器端(資料庫,內存,文件系統等)下次請求目標頁面時不用在提交XSS代碼。當目標用戶訪問該頁面獲取數據時,XSS代碼會從伺服器解析之後載入出來,返回到瀏覽器做正常的HTML和JS解析執行,XSS攻擊就發生了。儲存型XSS一般出現在網站留言,評論,博客日誌等交互處,惡意腳本儲存到客戶端或者服務端的資料庫中。
[if !supportLists]3、[endif]DOM-based型XSS攻擊
DOM-based型XSS攻擊它是基於DOM的XSS攻擊是指通過惡意腳本修改頁面的DOM結構,是純粹發生在客戶端的攻擊。DOM型XSS攻擊中,取出和執行惡意代碼由瀏覽器端完成,屬於前端JavaScript自身的安全漏洞。
如何防禦XSS攻擊?
[if !supportLists]1、[endif]對輸入內容的特定字元進行編碼,列如表示html標記<>等符號。
[if !supportLists]2、[endif]對重要的cookie設置httpOnly,防止客戶端通過document。cookie讀取cookie,此HTTP開頭由服務端設置。
[if !supportLists]3、[endif]將不可信的輸出URT參數之前,進行URLEncode操作,而對於從URL參數中獲取值一定要進行格式檢查
[if !supportLists]4、[endif]不要使用Eval來解析並運行不確定的數據或代碼,對於JSON解析請使用JSON。Parse()方法
[if !supportLists]5、[endif]後端介面也應該要做到關鍵字元過濾的問題。