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