近期公司專案正好被檢查出xss漏洞,一直以來其實都知道xss漏洞,不過並沒有實際去寫過,正好這兩天處理了xss漏洞,下面來說一說xss漏洞相關的知識,以及我在專案中如何去解決xss漏洞。
引言:
由於web前端的高速發展,現在的web應用都會使用大量的動態內容和動態互動來提高使用者的使用體驗,那麼,動態內容會根據使用者的環境來輸出相應的內容。在這個內容上,就會受到「跨站指令碼攻擊」(cross site scripting,縮寫為xss)的威脅。xss是一種常見的web安全漏洞,它允許攻擊者將惡意**植入到提供其他使用者使用的頁面中,不同於大部分攻擊,xss涉及到三方,攻擊者、客戶端與web應用,xss攻擊目標是為了盜取存在客戶端的cookie或其它**使用者識別客戶端身份的敏感資訊,一單獲取到合法使用者資訊,攻擊者甚至可以假冒合法使用者和**進行互動。
xss分類:
xss目前的主要手段和目的如下:
web應用未對使用者提交請求的資料做充分的檢查過濾,允許使用者在提交的資料中摻入html**(最主要的是「>」、「<」),並將未經轉義的惡意**輸出到第三方使用者的瀏覽器解釋執行,是導致xss漏洞的產生原因。
接下來以反射性xss舉例說明xss的過程:現在有乙個**,根據引數輸出使用者的名稱,例如訪問url:,就會在瀏覽器輸出如下資訊:
hello astaxie
在我們的admin系統中,由於使用的spring.php框架過於陳舊,沒有使用xss過濾,所以在系統多處均有xss漏洞,而在dsp系統中,spring.php框架提供了xss過濾功能,但是在使用中發現由於場景的需要,有些頁面可能需要傳遞json,不能使用xss過濾,需要將其轉換為php陣列再將其屬性進行xss過濾,但是這部分工作由於開發人員的疏忽,導致xss漏洞的存在,通過綠盟的掃瞄,我們及時對這種漏洞進行修復。
首先我們需要乙個在統一***裡面對引數進行xss過濾,在spring.php
(公司自研發的php框架)框架中使用request來統一獲取由前端進行的web請求傳遞的引數值,通過對引數值的解析過濾,達到xss的效果,但是我們實際業務在獲取引數的時候可能需要不過濾的內容(例如傳遞json
),那麼這個時候,我們需要設計兩種方案,實現拿到安全的引數或不過濾的引數。
class
request
extends
singletonbase
return
$param;
}/**
* 獲取表單請求引數
*@param string $name 請求引數名稱
*/public
static
function
form
($name = '')
/*** 獲取url請求引數
*@param string $name 請求引數名稱
*/public
static
function
query
($name = '')
/*** 獲取請求引數
*@param string $name 請求引數名稱
*/public
static
function
rawparams
($name = '')
return
$param;
}/**
* 獲取表單請求引數
*@param string $name 請求引數名稱
*/public
static
function
rawform
($name = '')
/*** 獲取url請求引數
*@param string $name 請求引數名稱
*/public
static
function
rawquery
($name = '')
/*** 獲取頁面全位址
*/public
static
function
getfullurl
()
/*** 載入
}}request::create();
通過分析**,我們可以看到request在建立的時候會執行它的建構函式oncreate,那麼每一次的web請求,均會呼叫oncreate方法,我們在此處可以對引數值進行篩選過濾,在引數中,我們設定了兩種引數,他們都存放著web傳遞的值,這裡我們暫時只舉get的例子,self::get
、self::$raw_get
,get用於存放過濾後的內容,raw_get
用於存放未過濾的內容,方便我們實際業務的獲取。在stringutil::string_remove_xss($value)
方法裡面,我們去實際過濾下xss。
方法內容:
/**
* 移除陣列的xss
*@param $array
*@return mixed
*/public
static
function
array_remove_xss
($array)
else
}return
$array;
}public
static
function
string_remove_xss
($html)
else
if (!is_string($html))
if (!get_magic_quotes_gpc()) //不對magic_quotes_gpc轉義過的字元使用addslashes(),避免雙重轉義。
$html = preg_replace($ra, '', $html); //刪除非列印字元,粗暴式過濾xss可疑字串
$html = htmlentities($html); //去除 html 和 php 標記並轉換為 html 實體
return
$html;
}
在篩選過濾中,我們首先對型別進行判斷,如果是陣列需要進行迴圈讀取屬性再呼叫string_remove_xss
方法,
後面幾步均有注釋說明。
在實際業務使用中,我們只需要使用request::params()
方法獲取web網頁傳遞過濾後的值,使用request::rawparams()
方法獲取web網頁傳遞未過濾的值。至此,xss漏洞的輸入點防護解決完畢。
最後
在現代基於mvvm
框架的的spa
(單頁應用)不需要重新整理url來控制view,這樣可以大大防止xss隱患,例如vue.js react.js在設計的時候設計者已經考慮了xss對html插值的攻擊,我們使用者只需要熟練正確地使用他們,大部分情況下可以避免xss攻擊。
Jsonp常見安全漏洞分析
jsonp json with padding 是資料格式 json 的一種 使用模式 可以讓網頁從別的網域要資料。這個解釋來自於網際網路上面的答案。jsonp只是 一種使用json模式,之所以能夠很廣泛使用。主要用它來解決跨域訪問問題。可以方便跨網域名稱傳輸資料。一些是乙個jsonp的例子。但是,...
Linux Bash安全漏洞以及各環境修復解決方法
env i x a bash c echo date cat echo 執行上面的命令,如果有出現下面的反饋資訊說存在漏洞需要補丁。如果有出現上面的字元說明是有漏洞的,然後看下面根據不同系統環境公升級補丁。老左需要說的是,以防止萬一我們需要先做好備份,萬一出現不相容問題導致系統錯誤我們還可以補救備份...
產品常見安全漏洞挖掘和分析以及解決方案
原理 當函式內的乙個陣列緩衝區接受使用者輸入的時候,未對輸入的長度進行合法性檢查時,可以構造資料覆蓋超過緩衝區的高位址上原本的其他棧幀資料,如果本身的資料內就儲存了一系列的指令的二進位制 一旦棧溢位修改了函式的返回位址,並將該位址指向這段二進位制 的起始位置,那麼就形成成了基本的溢位攻擊行為。防護措...