一、HTML轉(zhuǎn)義在視圖中,通過調(diào)用模板傳遞下文,模板對上下文的傳遞字符串進(jìn)行輸出時,會對以下字符自動轉(zhuǎn)義。HTML轉(zhuǎn)義的作用:轉(zhuǎn)義后標(biāo)記代碼不會被直接解釋執(zhí)行,而是被直接呈現(xiàn),防止客戶端通過嵌入js代碼攻擊網(wǎng)站。 小于號 < 轉(zhuǎn)換為 < 大于號 > 轉(zhuǎn)換為 > 單引號 ' 轉(zhuǎn)換為 ' 雙引號 " 轉(zhuǎn)換為 " 與符號 & 轉(zhuǎn)換為 & HTML轉(zhuǎn)義演示: 匹配URL: path('zhuanyi/', views.zhuanyi), 視圖: def zhuanyi(request): content = {"text":"<h1>標(biāo)題一</h1>"} #調(diào)用模板傳入HTML字符串 return render(request,"Book/zhuanyi.html",content) 模板: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>轉(zhuǎn)義演示</title> </head> <body> <p>{{ text }}</p> </body> </html> 結(jié)果: ? ?我們在視圖傳入的HTML標(biāo)簽沒有被瀏覽器執(zhí)行,就是為了防止js攻擊。在模板渲染的時候進(jìn)行了轉(zhuǎn)義,這樣瀏覽器就不會認(rèn)出來是專屬的標(biāo)簽啦。 禁止HTML轉(zhuǎn)義{{變量|escape}} 過濾器escape可以實現(xiàn)對變量的HTML轉(zhuǎn)義,默認(rèn)模板就會轉(zhuǎn)義,一般省略。 {{變量|safe}} 過濾器safe:禁用轉(zhuǎn)義,告訴模板這個變量是安全的,可以解釋執(zhí)行。 {% autoescape off %} ....... {% endautoescape %} 標(biāo)簽autoescape:設(shè)置一段代碼都禁用轉(zhuǎn)義,接收on、off參數(shù)(on:啟用轉(zhuǎn)義,off:禁用轉(zhuǎn)義) 代碼展示:<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>禁止轉(zhuǎn)義演示</title> </head> <body> {#默認(rèn)會進(jìn)行HTML轉(zhuǎn)義#} <p style="background: red">{{ text }}</p> <p>{{ text|safe }}</p> </body> </html> ? ?其他備注信息: 1、對于在模板中硬編碼? 2、在模板中硬編碼如果希望出現(xiàn)轉(zhuǎn)義的效果,則需要手動編碼轉(zhuǎn)義 二、CSRFCSRF全拼為Cross Site Request Forgery,翻譯為跨站請求偽造。CSRF指攻擊者盜用了你的身份,以你的名義發(fā)送惡意請求。包括:以你的名義發(fā)送郵件,發(fā)消息,盜取你的賬號,甚至購買商品,虛擬貨幣轉(zhuǎn)賬.............造成的問題就是,個人隱私泄露以及財產(chǎn)安全。 CSRF攻擊原理客戶端訪問服務(wù)器的時候,服務(wù)器沒有做驗證。因此就會出現(xiàn)偽造用戶訪問。 防止CSRF攻擊 Django默認(rèn)開啟了CSRF安全驗證功能: MIDDLEWARE = [ 'django.middleware.security.SecurityMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.common.CommonMiddleware', #默認(rèn)開啟CSRF驗證 'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware', ] 現(xiàn)在你在模板中用form表單提交數(shù)據(jù)(或者直接手動提交自己組鍵值),提交數(shù)據(jù)就會返回的頁面是Forbidden(403)。CSRF verification failed.Request aborted。等信息,因此需要在form表單內(nèi)添加CSRF驗證語法: <form> {#生成csrftoken進(jìn)行安全驗證,可以在表單內(nèi)的任意位置#} {% csrf_token %} </form> 如果不是在表單內(nèi),需要自己組成鍵值對提交進(jìn)行post。表單內(nèi)是表單自動組織鍵值對。 總結(jié)Django提供的CSRF防護(hù)機(jī)制: 1.Django 第一次響應(yīng)來自某個客戶端的請求時,會在服務(wù)器端隨機(jī)生成一個 token,把這個 token 放在 cookie 里。然后每次 POST 請求都會帶上這個 token,這樣就能避免被 CSRF 攻擊。 2.在返回的 HTTP 響應(yīng)的 cookie 里,django 會為你添加一個 csrftoken 字段,其值為一個自動生成的 token 3.在所有的 POST 表單時,必須包含一個 csrfmiddlewaretoken 字段 (只需要在模板里加一個 csrf_token標(biāo)簽, django 就會自動幫我們生成) 4.在處理 POST 請求之前,django 會驗證這個請求的 cookie 里的 csrftoken 字段的值和提 交的表單里的 csrfmiddlewaretoken 字段的值是否一樣。 ? 三、驗證碼在用戶注冊、登錄頁面,為了防止暴力請求,可以加入驗證碼功能,如果驗證碼錯誤,則不需要繼續(xù)處理,可以減輕服務(wù)器、數(shù)據(jù)庫壓力。網(wǎng)上有很多驗證碼的教程以及庫,方法等。 服務(wù)器隨機(jī)生成驗證碼,字符串存入session中,讓客戶輸入然后在視圖函數(shù)中調(diào)用數(shù)據(jù)庫中的判斷是否一致。 四、反向解析有時候我們的url是不斷變化的,有一個辦法就是url變化,但我還是想得到我要的網(wǎng)頁,那么重定向就是解決這個事情的。 并且越來越多的視圖,會出現(xiàn)以前的視圖匹配不想要,需要改動,但改動是很麻煩的。因此反向解析能夠很好地解決這些問題。 反向解析應(yīng)用:模板中的超鏈接,視圖中的重定向 urls.py:(加上一個名字) path('booklist/', views.bookList,name="index"), path('fan/', views.fan,), # views.py def fan(request): return render(request,"Book/fan.html") 模板中動態(tài)生成地址: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>反向解析</title> </head> <body> {#反向解析超鏈接,前面關(guān)鍵字url空格加上#} <a href="{% url "index" %}">跳轉(zhuǎn)到index頁面</a> </body> </html> ? ?跳轉(zhuǎn)的頁面如下所示 ? ?反向解析--視圖(重定向) #反向解析 def fan(request): return redirect(reverse("index")) ? ??反向解析--正則中取參數(shù)(位置參數(shù)) re_path("^fan1/(\d )/(\d )/$",views.index,name=fan1), # 反向解析:向正則中傳參 def fan1(request, v1, v2): str = '%s--%s'%(v1,v2) return HttpResponse(str) {# 向正則中傳參 #} <a href="{% url 'fan1' 188 5415 %}">動態(tài)地址和正則傳參跳轉(zhuǎn)到fan1</a> 關(guān)鍵字參數(shù) re_path("^(?P<number1>\d )/(?P<number2>\d )/$",views.index), ? 來源:https://www./content-4-507251.html |
|