PHP如何防止XSS攻擊與XSS攻擊原理的講解
XSS又稱CSS,全稱Cross SiteScript(跨站腳本攻擊), XSS攻擊類似于SQL注入攻擊,是Web程序中常見的漏洞,XSS屬于被動式且用于客戶端的攻擊方式,所以容易被忽略其危害性。其原理是攻擊者向有XSS漏洞的網(wǎng)站中輸入(傳入)惡意的HTML代碼,當用戶瀏覽該網(wǎng)站時,這段HTML代碼會自動執(zhí)行,從而達到攻擊的目的。如,盜取用戶Cookie信息、破壞頁面結構、重定向到其它網(wǎng)站等。
理論上,只要存在能提供輸入的表單并且沒做安全過濾或過濾不徹底,都有可能存在XSS漏洞。
下面是一些最簡單并且比較常見的惡意字符XSS輸入:
1.XSS 輸入通常包含 JavaScript 腳本,如彈出惡意警告框:<script>alert("XSS");</script>
2.XSS 輸入也可能是 HTML 代碼段,譬如:
- (1).網(wǎng)頁不停地刷新
<meta http-equiv="refresh" content="0;"> - (2).嵌入其它網(wǎng)站的鏈接
<iframe src=http://xxxx width=250 height=250></iframe>
除了通過正常途徑輸入XSS攻擊字符外,還可以繞過JavaScript校驗,通過修改請求達到XSS攻擊的目的,如下圖:

了解到XSS攻擊的原理和危害后,其實要預防也不難,下面提供一個簡單的PHP防止XSS攻擊的函數(shù):
<?PHP
/**
* @param $string
* @param $low 安全別級低
*/
function clean_xss(&$string, $low = False)
{
if (! is_array ( $string ))
{
$string = trim ( $string );
$string = strip_tags ( $string );
$string = htmlspecialchars ( $string );
if ($low)
{
return True;
}
$string = str_replace ( array ('"', "\\", "'", "/", "..", "../", "./", "http://" ), '', $string );
$no = '/%0[0-8bcef]/';
$string = preg_replace ( $no, '', $string );
$no = '/%1[0-9a-f]/';
$string = preg_replace ( $no, '', $string );
$no = '/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F]+/S';
$string = preg_replace ( $no, '', $string );
return True;
}
$keys = array_keys ( $string );
foreach ( $keys as $key )
{
clean_xss ( $string [$key] );
}
}
//just a test
$str = 'codetc.com<meta http-equiv="refresh" content="0;">';
clean_xss($str); //如果你把這個注釋掉,你就知道xss攻擊的厲害了
echo $str;
?>
PHP中的設置
PHP5.2以上版本已支持HttpOnly參數(shù)的設置,同樣也支持全局的HttpOnly的設置,在php.ini中
----------------------------------------------------- session.cookie_httponly = -----------------------------------------------------
設置其值為1或者TRUE,來開啟全局的Cookie的HttpOnly屬性,當然也支持在代碼中來開啟:
<?php ini_set("session.cookie_httponly", 1);
// or session_set_cookie_params(0, NULL, NULL, NULL, TRUE);
?>
Cookie操作函數(shù)setcookie函數(shù)和setrawcookie函數(shù)也專門添加了第7個參數(shù)來做為HttpOnly的選項,開啟方法為:
<?php
setcookie("abc", "test", NULL, NULL, NULL, NULL, TRUE);
setrawcookie("abc", "test", NULL, NULL, NULL, NULL, TRUE);
?>
老版本的PHP就不說了。沒企業(yè)用了吧。
總結
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對腳本之家的支持。如果你想了解更多相關內(nèi)容請查看下面相關鏈接
相關文章
PHP基于mssql擴展遠程連接MSSQL的簡單實現(xiàn)方法
這篇文章主要介紹了PHP基于mssql擴展遠程連接MSSQL的簡單實現(xiàn)方法,涉及php操作mssql的簡單連接、查詢、遍歷與輸出相關操作技巧,需要的朋友可以參考下2016-10-10
PHP表單遞交控件名稱含有點號(.)會被轉化為下劃線(_)的處理方法
做項目的過程中發(fā)現(xiàn),表單遞交就是不成功,后來發(fā)現(xiàn)原來我給控件的名字不規(guī)范導致,控件遞交到后端之后,發(fā)現(xiàn)所有我控件名字中含有.號的名字,遞交過之后都會被轉化成下劃線_2013-01-01
php偽協(xié)議實現(xiàn)命令執(zhí)行詳情
這篇文章主要介紹了php偽協(xié)議實現(xiàn)命令執(zhí)行詳情,文章圍繞主題展開詳細的內(nèi)容介紹,感興趣的朋友可以參考一下2022-06-06
判斷php數(shù)組是否為索引數(shù)組的實現(xiàn)方法
本篇文章是對判斷php數(shù)組是否為索引數(shù)組的方法進行了詳細的分析介紹,需要的朋友參考下2013-06-06

