155.XSS攻擊原理

XSS攻擊:

XSS(Cross Site Script)攻擊叫作跨站腳本攻擊,他的原理是用戶使用具備XSS漏洞的網站的時候,向這個網站提交一些惡意代碼,當用戶在訪問這個網站的某個頁面的時候,這個惡意的代碼就會被執行,從而來破壞網頁的結構,獲取用戶的隱私信息等。

XSS攻擊場景:

好比如今有一個發佈帖子的入口,若是用戶在提交數據的時候,提交一段js代碼,好比,,而後網頁在渲染的時候直接將該代碼渲染了,那麼就會在瀏覽器的窗口中彈出一個對話框顯示Hello world!若是攻擊者能成功的運行這段js代碼,那麼他就能夠運行更多的js代碼,進而操控咱們的網頁,這就會讓咱們的網頁用戶的信息等很是不安全。

XSS攻擊防護:

1. 若是不須要顯示一些富文本,那麼在渲染用戶提交的數據的時候,直接進行轉義就能夠了。在Django的模板中默認就是轉義的。也能夠把數據在存儲到數據庫以前,先轉義再存儲進去,這樣之後在渲染的時候,即便不轉義也不會有安全問題,示例代碼以下:
from django.template.defaultfilters import escape
from .models import Comment
from django.http import HttpResponse

def add_comments(request):
    content = request.POST.get('content')
    <!--使用escape()函數,能夠在數據存儲到數據庫以前先進行轉義,再存儲到數據庫中,這樣即便以後網頁不進行轉義,也沒有關係-->
    escaped_content = escape(content)
    Comment.objects.create(content=escaped_content)
    return HttpResponse('success!')
2.若是對於用戶提交上來的數據包含了一些富文本(好比:給字體設置顏色,字體加粗等), 那麼這時候咱們在渲染的時候也要以富文本的形式進行渲染,就須要使用safe過濾器將其標記爲安全的,這樣才能顯示富文本樣式,可是這樣又會存在一個問題,若是用戶提交上來的數據攻擊的代碼呢?這時候再將其標記爲安全的,確定就不行了,示例代碼以下:
<ul>
    {% for comment in comments %}
    <!--使用safe過濾器,將數據標記爲安全的-->
        <li>{{ comment.id }} . {{ comment.comment|safe }}</li>
    {% endfor %}
</ul>
那麼這個時候要怎樣處理呢? 這時候就能夠指定某些標籤是咱們須要的(好比,span標籤),而某些標籤咱們是不須要的(好比:script)。那麼,咱們在服務器處理這些數據的時候,就能夠將這些數據的標籤保留下來,把不須要的標籤進行轉義,或者是直接進行刪除,這樣就能夠解決咱們的問題了,這個方法是可行的,不少線上的網站也是這樣的,在python中有一個庫咱們能夠用來處理這個事情,sanitizer。
富文本字符串處理
(1)bleach庫是用來清理包含html格式字符串的庫,他也能夠指定哪些標籤須要保留,哪些標籤是須要過濾的,也能夠指定標籤上哪些屬性是能夠保留的,哪些屬性是不須要的,想要使用這個庫,能夠執行pip install bleach 命令進行安裝。
(2)這個庫最重要的一個方法是bleach.clean()方法,bleach.clean()示例代碼以下:
@require_POST
def add_comments(request):
    # 從客戶端獲取數據
    comment = request.POST.get('comment')
    # bleach默認定義的一些標籤,在原來的基礎上添加一個img標籤
    tags = ALLOWED_TAGS + ['img']
    # bleach默認定義的一些屬性,在原來的基礎上,在img標籤上添加一個src屬性
    <!--這裏使用**ALLOWED_ATTRIBUTES,主要是將ALLOWED_ATTRIBUTESdict中的鍵值對打散開,以後,能夠和'img':['src'],進行拼接成一個字典-->
    若是不打散的話就會造成{{},'key':'value'}
    attributes = {**ALLOWED_ATTRIBUTES, 'img': ['src']}
    <!--選擇符合bleach.clean()方法中tags和標籤都符合的comment-->
    clean_data = bleach.clean(comment, tags=tags, attributes=attributes)
    # 保存到數據庫中
    Comment.objects.create(comment=clean_data)
    return redirect(reverse('index'))
(1)tags:表示容許哪些標籤。
(2)attribute:表示標籤中容許哪些屬性。
(3)ALLOWED_TAGS:這個變量是bleach默認定義的一些標籤,若是不符合要求,能夠對其進行增減或者是刪除。
(4)ALLOWED_ATTRIBUTES:這個變量是bleach默認定義的一些屬性,若是不符合要求,能夠對其進行增減或者是刪除。
在以上這個views.py中,爲默認的網頁加載標籤中添加了一個img標籤,而且爲img標籤添加一個屬性src,同時在項目中建立一個js文件,示例代碼以下:
window.onload = function () {
    var imgTag = document.createElement('img');
    imgTag.setAttribute('src', 'http://img.haote.com/upload/news/image/20170605/20170605144101_12960.jpg');
    document.body.appendChild(imgTag);
};
此時就能夠在index.html中進行加載該js文件了,而且能夠完美的加載img圖片。
相關文章
相關標籤/搜索