標籤:hdr view settings blog match 電腦 tin 資料傳遞 render
xss跨站指令碼攻擊:惡意攻擊者往Web頁面裡插入惡意Script代碼,當使用者瀏覽該頁之時,嵌入其中Web裡面的Script代碼會被執行,從而達到惡意攻擊使用者的目的。
例如:某些論壇允許使用者自由發言,而不對使用者的輸入資料進行檢測,直接顯示在頁面中。
若是使用者輸入了某些css樣式代碼,html表格代碼,顯示在頁面後會改變頁面的布局。
若是輸入某些js代碼,用於擷取其他使用者的檔案,或者修改本地檔案,也可以發送使用者cookie等資訊到自己的電腦中類比使用者登入
一般可以通過函數處理htmlspecialchars(php中)或者正則或者模板自己處理
xsrf(csrf)跨網站請求偽造:
轉載自此網站,解析十分不錯
CSRF攻擊執行個體:
受害者 Bob 在銀行有一筆存款,通過對銀行的網站發送請求 http://bank.example/withdraw?account=bob&amount=1000000&for=bob2 可以使 Bob 把 1000000 的存款轉到 bob2 的帳號下。通常情況下,該請求發送到網站後,伺服器會先驗證該請求是否來自一個合法的 session,並且該 session 的使用者 Bob 已經成功登陸。
駭客 Mallory 自己在該銀行也有賬戶,他知道上文中的 URL 可以把錢進行轉帳操作。Mallory 可以自己發送一個請求給銀行:http://bank.example/withdraw?account=bob&amount=1000000&for=Mallory。但是這個請求來自 Mallory 而非 Bob,他不能通過安全認證,因此該請求不會起作用。
這時,Mallory 想到使用 CSRF 的攻擊方式,他先自己做一個網站,在網站中放入如下代碼: src=”http://bank.example/withdraw?account=bob&amount=1000000&for=Mallory ”,並且通過廣告等誘使 Bob 來訪問他的網站。當 Bob 訪問該網站時,上述 url 就會從 Bob 的瀏覽器發向銀行,而這個請求會附帶 Bob 瀏覽器中的 cookie 一起發向銀行伺服器。大多數情況下,該請求會失敗,因為他要求 Bob 的認證資訊。但是,如果 Bob 當時恰巧剛訪問他的銀行後不久,他的瀏覽器與銀行網站之間的 session 尚未到期,瀏覽器的 cookie 之中含有 Bob 的認證資訊。這時,悲劇發生了,這個 url 請求就會得到響應,錢將從 Bob 的帳號轉移到 Mallory 的帳號,而 Bob 當時毫不知情。等以後 Bob 發現賬戶錢少了,即使他去銀行查詢日誌,他也只能發現確實有一個來自於他本人的合法請求轉移了資金,沒有任何被攻擊的痕迹。而 Mallory 則可以拿到錢後逍遙法外。
攔截方法之一:token
CSRF 攻擊之所以能夠成功,是因為駭客可以完全偽造使用者的請求,該請求中所有的使用者驗證資訊都是存在於 cookie 中,因此駭客可以在不知道這些驗證資訊的情況下直接利用使用者自己的 cookie 來通過安全驗證。要抵禦 CSRF,關鍵在於在請求中放入駭客所不能偽造的資訊,並且該資訊不存在於 cookie 之中。可以在 HTTP 要求中以參數的形式加入一個隨機產生的 token,並在伺服器端建立一個攔截器來驗證這個 token,如果請求中沒有 token 或者 token 內容不正確,則認為可能是 CSRF 攻擊而拒絕該請求。
python使用token進行處理代碼:(由於該token資料並不存在在cookie中,使用者不能直接使用cookie類比登陸狀態發送請求,使用者必須先get請求該頁面,從而獲得token,然後才能附上該token提交資料請求。當然這種方法也不是完全可以防止的)
在前端,form表單中將資料添加到了input:_xsrf隱藏標籤中,同時也為該使用者產生了一個cookie:_xsrf存放在使用者cookie中
可以通過form表單傳遞這個令牌,也可以通過ajax將令牌資料傳遞到服務端進行識別
class CsrfHandler(BaseRequestHandler): def get(self, *args, **kwargs): self.render(‘csrf.html‘) def post(self, *args, **kwargs): self.write(‘提交‘)settings ={ ‘template_path‘:‘views‘, ‘static_path‘:‘statics‘, ‘cookie_secret‘:‘dafawafawfaw‘, ‘xsrf_cookies‘:True,}View Codeform
<form action="/csrf" method="post"> {% raw xsrf_form_html() %} <input type="text" name="nm"/> <input type="password" name="pawd"> <input type="submit" value="提交"> </form>View Codejs
function getCookie(name) { var r = document.cookie.match("\\b" + name + "=([^;]*)\\b"); return r ? r[1] : undefined;}jQuery.postJSON = function(url, args, callback) { args._xsrf = getCookie("_xsrf"); $.ajax({url: url, data: $.param(args), dataType: "text", type: "POST", success: function(response) { callback(eval("(" + response + ")")); }});};View Code
python全棧系列之---xss跨站指令碼攻擊和csrf(xsrf)攻擊