python---xss(Cross Site Scripting)跨站腳本攻擊和csrf(xsrf)跨站點請求僞造(Cross—Site Request Forgery)攻擊

xss跨站腳本攻擊:惡意攻擊者往Web頁面裏插入惡意Script代碼,當用戶瀏覽該頁之時,嵌入其中Web裏面的Script代碼會被執行,從而達到惡意攻擊用戶的目的。php

例如:某些論壇容許用戶自由發言,而不對用戶的輸入數據進行檢測,直接顯示在頁面中。css

如果用戶輸入了某些css樣式代碼,html表格代碼,顯示在頁面後會改變頁面的佈局。html

如果輸入某些js代碼,用於獲取其餘用戶的文件,或者修改本地文件,也能夠發送用戶cookie等信息到本身的計算機中模擬用戶登陸前端

通常能夠經過函數處理htmlspecialchars(php中)或者正則或者模板本身處理python

 

xsrf(csrf)跨站點請求僞造:ajax

轉載自此網站,解析十分不錯瀏覽器

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,他不能經過安全認證,所以該請求不會起做用。cookie

        這時,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 Code
form
    <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 Code
js
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
相關文章
相關標籤/搜索