目錄:
1. HTML表單
HTML 表單用于搜集不同類(lèi)型的用戶輸入。
表單是一個(gè)包含表單元素的區(qū)域。
表單元素是允許用戶在表單中輸入內(nèi)容,比如:文本域(textarea)、下拉列表、單選框(radio-buttons)、復(fù)選框(checkboxes)等等。
表單使用表單標(biāo)簽 <form> 來(lái)設(shè)置:
<form>
input elements
</form>
HTML 表單 - 輸入元素
多數(shù)情況下被用到的表單標(biāo)簽是輸入標(biāo)簽(<input>)。
輸入類(lèi)型是由類(lèi)型屬性(type)定義的。大多數(shù)經(jīng)常被用到的輸入類(lèi)型如下:
- 文本域(Text Fields)
文本域通過(guò)<input type="text">標(biāo)簽來(lái)設(shè)定,當(dāng)用戶要在表單中鍵入字母、數(shù)字等內(nèi)容時(shí),就會(huì)用到文本域。
<form>
First name: <input type="text" name="firstname"><br>
Last name: <input type="text" name="lastname">
</form>
注意:表單本身并不可見(jiàn)。同時(shí),在大多數(shù)瀏覽器中,文本域的缺省寬度是20個(gè)字符。
- 密碼字段
密碼字段通過(guò)標(biāo)簽<input type="password">來(lái)定義:
<form>
Password: <input type="password" name="pwd">
</form>
注意:密碼字段字符不會(huì)明文顯示,而是以星號(hào)或圓點(diǎn)替代。
- 單選按鈕(Radio Buttons)
<input type="radio">標(biāo)簽定義了表單單選框選項(xiàng)
<form>
<input type="radio" name="gender" value="male">Male<br>
<input type="radio" name="gender" value="female">Female
</form>
- 復(fù)選框(Checkboxes)
<input type="checkbox">定義了復(fù)選框. 用戶需要從若干給定的選擇中選取一個(gè)或若干選項(xiàng)。
<form>
<input type="checkbox" name="vehicle" value="Bike">I have a bike<br>
<input type="checkbox" name="vehicle" value="Car">I have a car
</form>
- 提交按鈕(Submit Button)
<input type="submit">定義了提交按鈕.
當(dāng)用戶單擊確認(rèn)按鈕時(shí),表單的內(nèi)容會(huì)被傳送到另一個(gè)文件。表單的動(dòng)作屬性定義了目的文件的文件名。由動(dòng)作屬性定義的這個(gè)文件通常會(huì)對(duì)接收到的輸入數(shù)據(jù)進(jìn)行相關(guān)的處理。:
<form name="input" action="html_form_action.php" method="get">
Username: <input type="text" name="user">
<input type="submit" value="Submit">
</form
2.CSRF
CSRF(Cross-site request forgery)通常縮寫(xiě)為CSRF或者XSRF:跨站請(qǐng)求偽造
CSRF攻擊可以理解為:攻擊者盜用了你的身份,以你的名義發(fā)送惡意請(qǐng)求。
舉例來(lái)講,某個(gè)惡意的網(wǎng)站上有一個(gè)指向你的網(wǎng)站的鏈接,如果
某個(gè)用戶已經(jīng)登錄到你的網(wǎng)站上了,那么當(dāng)這個(gè)用戶點(diǎn)擊這個(gè)惡意網(wǎng)站上的那個(gè)鏈接時(shí),就會(huì)向你的網(wǎng)站發(fā)來(lái)一個(gè)請(qǐng)求,
你的網(wǎng)站會(huì)以為這個(gè)請(qǐng)求是用戶自己發(fā)來(lái)的,其實(shí)呢,這個(gè)請(qǐng)求是那個(gè)惡意網(wǎng)站偽造的。
CSRF能夠做的事情包括:以你名義發(fā)送郵件,發(fā)消息,盜取你的賬號(hào),甚至于購(gòu)買(mǎi)商品,虛擬貨幣轉(zhuǎn)賬......造成的問(wèn)題包括:個(gè)人隱私泄露以及財(cái)產(chǎn)安全。
Django 提供的 CSRF 防護(hù)機(jī)制
django 第一次響應(yīng)來(lái)自某個(gè)客戶端的請(qǐng)求時(shí),會(huì)在服務(wù)器端隨機(jī)生成一個(gè) token,把這個(gè) token 放在 cookie 里。然后每次 POST 請(qǐng)求都會(huì)帶上這個(gè) token,
這樣就能避免被 CSRF 攻擊。
- 在返回的 HTTP 響應(yīng)的 cookie 里,django 會(huì)為你添加一個(gè) csrftoken 字段,其值為一個(gè)自動(dòng)生成的 token
- 在所有的 POST 表單時(shí),必須包含一個(gè) csrfmiddlewaretoken 字段 (只需要在模板里加一個(gè) tag, django 就會(huì)自動(dòng)幫你生成,見(jiàn)下面)
- 在處理 POST 請(qǐng)求之前,django 會(huì)驗(yàn)證這個(gè)請(qǐng)求的 cookie 里的 csrftoken 字段的值和提交的表單里的 csrfmiddlewaretoken 字段的值是否一樣。如果一樣,則表明這是一個(gè)合法的請(qǐng)求,否則,這個(gè)請(qǐng)求可能是來(lái)自于別人的 csrf 攻擊,返回 403 Forbidden.
- 在所有 ajax POST 請(qǐng)求里,添加一個(gè) X-CSRFTOKEN header,其值為 cookie 里的 csrftoken 的值
Django 里如何使用 CSRF 防護(hù):
- 首先,最基本的原則是:GET 請(qǐng)求不要用有副作用。也就是說(shuō)任何處理 GET 請(qǐng)求的代碼對(duì)資源的訪問(wèn)都一定要是“只讀“的。
- 要啟用 django.middleware.csrf.CsrfViewMiddleware 這個(gè)中間件
- 再次,在所有的 POST 表單元素時(shí),需要加上一個(gè) {% csrf_token %} tag
- 在渲染模塊時(shí),使用 RequestContext。RequestContext 會(huì)處理 csrf_token 這個(gè) tag, 從而自動(dòng)為表單添加一個(gè)名為 csrfmiddlewaretoken 的 input
3.代碼操作
需求:模擬登錄功能,如果用戶的名字是你的名字全拼且密碼是12345,則顯示登錄成功,否則登錄失敗
1.創(chuàng)建app:python manage.py startapp login
2.在app中創(chuàng)建templates文件夾,并簡(jiǎn)單寫(xiě)三個(gè)網(wǎng)頁(yè),分別是登陸頁(yè)面,登陸成功頁(yè)面,登陸失敗頁(yè)面。

3.建立項(xiàng)目視圖的練習(xí),詳情請(qǐng)見(jiàn)Django教程(一)- Django視圖與網(wǎng)址

- 定義視圖函數(shù)

- 在app中創(chuàng)建urls.py,定義視圖函數(shù)相關(guān)的url

- 在項(xiàng)目的urls.py中,導(dǎo)入django.conf.urls.include模塊,并且添加到urlpatterns列表

- 把新定義的app加到settings.py中的INSTALL_APPS中
測(cè)試:

輸入正確的用戶名和密碼:

反之:

這里只是為了完成需求,不考慮網(wǎng)頁(yè)的顯示的效果!233
注意:測(cè)試之前需在終端打開(kāi)服務(wù)器python manage.py runserver 8001(端口號(hào)默認(rèn)是8000,也可以選擇不設(shè)置!)