網(wǎng)站開發(fā)費(fèi)入什么費(fèi)用中國(guó)十大企業(yè)培訓(xùn)公司
文章目錄
- 一、重定向進(jìn)階功能
- 1.1 重定向回上一個(gè)頁(yè)面
- 1.2 對(duì)URL進(jìn)行安全驗(yàn)證
- 二、使用Ajax技術(shù)發(fā)送異步請(qǐng)求
- 2.1 什么是Ajax
- 2.2使用jQuery發(fā)送Ajax請(qǐng)求
- 三、服務(wù)器推送
- 四、web安全規(guī)范
- 1. 注入攻擊
- 2. XSS攻擊
- 3. CSRF攻擊
一、重定向進(jìn)階功能
1.1 重定向回上一個(gè)頁(yè)面
有時(shí)候,我們?cè)谀承┙缑鎴?zhí)行操作一些操作后,不希望界面跳轉(zhuǎn)到其他指定網(wǎng)頁(yè)上,而希望網(wǎng)頁(yè)能重定向?yàn)橛脩魟偛艦g覽的界面,以便繼續(xù)完成操作,例如在某個(gè)頁(yè)面需要登錄后才能進(jìn)行操作,我們希望登錄后不跳轉(zhuǎn)到主頁(yè)界面,而是重定向?yàn)閯偛挪僮鞯捻?yè)面,從而能夠方便的繼續(xù)剛才未完成的操作。
- 獲取上一個(gè)頁(yè)面的URL
要重定向?yàn)樯弦粋€(gè)頁(yè)面,最關(guān)鍵的是要獲取上一個(gè)頁(yè)面的URL。獲取的方法主要有兩種:
- HTTP referer
是一個(gè)用來記錄請(qǐng)求發(fā)源地址的HTTP首部字段,即訪問來源。當(dāng)用戶在某個(gè)網(wǎng)站點(diǎn)擊鏈接時(shí),瀏覽器發(fā)送請(qǐng)求的數(shù)據(jù)中包含的HTTP_REFERER字段記錄了用戶所在的原站點(diǎn)URL。
在Flask中,我們可以通過request.referrer進(jìn)行獲取。
return redirect(request.referrer)# 為了防止用戶出于隱私保護(hù)設(shè)置清除了或修改了該字段,添加備用選項(xiàng)
return redirect(request.referrer or url_for('index'))
- 查詢參數(shù)
除了從referer中獲取之外,我們還可以在URL中手動(dòng)加入包含當(dāng)前頁(yè)面URL的查詢參數(shù),一般命名為next
@app.route('/index')
def index():return '<a href="%s">登陸</a>' % url_for("login", next=request.full_path)@app.route("/login")
def login():執(zhí)行登陸操作......return rediect(request.args.get("next"))# 添加備選項(xiàng)return rediect(request.args.get("next"), url_for("index")))
通用重定向函數(shù),避免重復(fù)代碼
def redirect_back(default="hello", **kwargs):for target in request.args.get('next'), request.referrer:if target:return redirect(target)return redirect(url_for(default, **kwargs))@app.route("/login")
def login:return redirect_back()
1.2 對(duì)URL進(jìn)行安全驗(yàn)證
由于referer和next容易被篡改的特性,如果不對(duì)這些值進(jìn)行驗(yàn)證,則會(huì)形成開放重定向漏洞。
URL驗(yàn)證函數(shù)
for urllib.parse import urlparse, urljoin
from flask import requestdef is_safe_url(target):ref_url = urlparse(request.host_url)test_url = ulparse(urljoin(request.host_url, target))return test_url.scheme in ("http", "https") and ref_ul.netloc == test_url.netloc# 在重定向通用代碼中使用
def redirect_back(default="hello", **kwargs):for target in request.args.get('next'), request.referrer:if not target:continueif is_safe_ul(target):return redirect(target)return redirect(url_for(default, **kwargs))
這段代碼定義了一個(gè)名為 is_safe_url() 的函數(shù),用于判斷給定的 URL 是否安全。
具體來說,is_safe_url() 函數(shù)接受一個(gè)參數(shù) target,表示要檢查的 URL。在函數(shù)體內(nèi),首先使用 urlparse() 函數(shù)從當(dāng)前請(qǐng)求的 request.host_url 中解析出引用 URL(即當(dāng)前頁(yè)面的 URL),并將其賦值給 ref_url 變量。然后,使用 urljoin() 函數(shù)將 request.host_url 和 target 合并成完整的 URL,并使用 urlparse() 函數(shù)解析出測(cè)試 URL,并將其賦值給 test_url 變量。
最后,函數(shù)會(huì)判斷 test_url 是否安全。具體來說,它會(huì)檢查 test_url 的協(xié)議是否為 “http” 或 “https”,并且檢查 test_url 的域名與 ref_url 的域名是否相同。如果這兩個(gè)條件都滿足,那么 is_safe_url() 函數(shù)將返回 True,表示 URL 是安全的;否則,返回 False,表示 URL 不安全。
二、使用Ajax技術(shù)發(fā)送異步請(qǐng)求
2.1 什么是Ajax
Ajax(Asynchronous JavaScript and XML)是一種在網(wǎng)頁(yè)中使用的技術(shù),通過在后臺(tái)與服務(wù)器進(jìn)行異步通信,實(shí)現(xiàn)頁(yè)面內(nèi)容的局部更新,而無需刷新整個(gè)頁(yè)面。
傳統(tǒng)的網(wǎng)頁(yè)交互是同步的,即用戶發(fā)起請(qǐng)求后,需要等待服務(wù)器返回完整的頁(yè)面并刷新整個(gè)頁(yè)面才能看到結(jié)果。而使用 Ajax 技術(shù),可以在不刷新整個(gè)頁(yè)面的情況下,通過發(fā)送異步請(qǐng)求,獲取服務(wù)器返回的數(shù)據(jù),并使用 JavaScript 動(dòng)態(tài)更新頁(yè)面的部分內(nèi)容。
Ajax 基于以下幾個(gè)核心的技術(shù):
- XMLHttpRequest 對(duì)象:用于在后臺(tái)與服務(wù)器進(jìn)行數(shù)據(jù)交換。通過創(chuàng)建 XMLHttpRequest 對(duì)象,可以發(fā)送請(qǐng)求和接收服務(wù)器返回的數(shù)據(jù)。
- JavaScript 和 DOM 操作:通過 JavaScript 代碼和 DOM(文檔對(duì)象模型)操作,可以動(dòng)態(tài)地修改頁(yè)面的內(nèi)容,將服務(wù)器返回的數(shù)據(jù)插入到指定的位置,更新頁(yè)面的部分內(nèi)容,而不需要刷新整個(gè)頁(yè)面。
- 異步請(qǐng)求和回調(diào)函數(shù):Ajax 請(qǐng)求是異步的,意味著瀏覽器在發(fā)送請(qǐng)求后,不會(huì)阻塞頁(yè)面的其他操作,而是繼續(xù)執(zhí)行后續(xù)的 JavaScript 代碼。當(dāng)服務(wù)器返回?cái)?shù)據(jù)后,可以通過回調(diào)函數(shù)處理這些數(shù)據(jù),更新頁(yè)面或執(zhí)行其他操作。
Ajax 技術(shù)它可以用于實(shí)現(xiàn)實(shí)時(shí)搜索、動(dòng)態(tài)加載內(nèi)容、表單驗(yàn)證、無刷新提交等功能。
2.2使用jQuery發(fā)送Ajax請(qǐng)求
jQuery中文網(wǎng)
并不一定需要使用jQuery來實(shí)現(xiàn)Ajax請(qǐng)求,可以使用原生的XMLHttpRequest,其它JavaScript框架內(nèi)置的Ajax接口,或這使用更新的Fetch API來發(fā)送異步請(qǐng)求。
三、服務(wù)器推送
服務(wù)器推送(Server Push)是一種在客戶端與服務(wù)器之間建立持久連接,并由服務(wù)器主動(dòng)向客戶端發(fā)送數(shù)據(jù)的通信方式。它與傳統(tǒng)的客戶端發(fā)起請(qǐng)求、服務(wù)器響應(yīng)的模式不同,可以實(shí)現(xiàn)實(shí)時(shí)更新數(shù)據(jù)或推送通知給客戶端,而無需客戶端主動(dòng)請(qǐng)求。
常見實(shí)現(xiàn)方式和協(xié)議:
名稱 | 說明 |
---|---|
傳統(tǒng)輪詢 | 在特定的時(shí)間內(nèi),客戶端使用Ajax技術(shù)不斷向服務(wù)器發(fā)起HTTP請(qǐng)求,然后獲取的新的數(shù)據(jù)并更新頁(yè)面。 |
長(zhǎng)輪詢 | 和傳統(tǒng)相比,如果服務(wù)器一直沒有返回?cái)?shù)據(jù),那就保持連接一直開啟,直到有數(shù)據(jù)時(shí)才返回,取回?cái)?shù)據(jù)后再次發(fā)送另一個(gè)請(qǐng)求。 |
Server-Sent Events(SSE) | SSE 是一種基于 HTTP 的服務(wù)器推送技術(shù)。通過 SSE,服務(wù)器可以使用單向的持久連接向客戶端發(fā)送數(shù)據(jù)??蛻舳送ㄟ^ EventSource API 接收服務(wù)器發(fā)送的事件流,實(shí)現(xiàn)實(shí)時(shí)更新數(shù)據(jù)或接收通知。 |
WebSocket | WebSocket 是一種支持全雙工通信的網(wǎng)絡(luò)協(xié)議,它提供了雙向的持久連接,使得服務(wù)器可以主動(dòng)向客戶端發(fā)送數(shù)據(jù)。通過 WebSocket,服務(wù)器可以實(shí)時(shí)地將更新的數(shù)據(jù)或通知推送給客戶端,而客戶端也可以向服務(wù)器發(fā)送消息。 |
四、web安全規(guī)范
1. 注入攻擊
重點(diǎn)注意SQL注入攻擊
- 原理:在編寫SQL語句時(shí),如果直接將用戶傳入的數(shù)據(jù)作為參數(shù)使用字符串拼接的方式插入SQL語句中,那么攻擊者就可以通過注入其它語句來執(zhí)行攻擊操作,進(jìn)行數(shù)據(jù)庫(kù)增刪改查。
- 防范:使用orm,驗(yàn)證輸入類型,參數(shù)化查詢,轉(zhuǎn)義特殊字符等。
2. XSS攻擊
- 原理:又稱跨站腳本攻擊,歷史悠久,是注入攻擊的一種,通過將代碼注入被攻擊者的網(wǎng)站中,用戶一但訪問就會(huì)執(zhí)行被注入的惡意腳本。
- 防范:HTML轉(zhuǎn)義,驗(yàn)證用戶輸入
3. CSRF攻擊
- 原理:又稱跨站偽造請(qǐng)求,利用用戶已經(jīng)通過身份驗(yàn)證的會(huì)話來執(zhí)行未經(jīng)授權(quán)的操作的攻擊方式。攻擊者通過欺騙用戶訪問惡意網(wǎng)站或點(diǎn)擊惡意鏈接,利用用戶的身份來發(fā)送偽造的請(qǐng)求。
- 防范:使用正確的HTTP請(qǐng)求,csrf令牌校驗(yàn)。