成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Web 開發(fā)學(xué)習(xí)筆記(4) --- 重定向與HSTS

kevin / 1904人閱讀

摘要:回顧通過前幾篇文章的內(nèi)容我們已經(jīng)搭建了基于框架的一個簡單的應(yīng)用的代碼如下此外我們還為其申請了公網(wǎng)和域名并且部署了的證書現(xiàn)在當(dāng)我們在瀏覽器地址欄輸入即可訪問我們的網(wǎng)站不過我們的網(wǎng)站目前還存在幾個問題無法訪問每次都需要用戶手動輸入前綴以制定形式

回顧

通過前幾篇文章的內(nèi)容, 我們已經(jīng)搭建了基于 Flask 框架的一個簡單的 Web 應(yīng)用, server.py 的代碼如下


from flask import Flask
from flask.views import MethodView
app = Flask(__name__)

class IndexHandler(MethodView):
    def __init__(self, name):
        print(name)

    def get(self):
        return "It is a GET request"

    def post(self):
        return "It is a POST request"

if __name__ == "__main__":
    app.add_url_rule("/", view_func=IndexHandler.as_view("index"))
    context = ("./server.cer", "./server.key")
    app.run(port=443, host="0.0.0.0", debug=True, threaded=True, ssl_context=context)

此外, 我們還為其申請了公網(wǎng) IP 和域名 www.awesome.com , 并且部署了 Let"s Encrypt 的 HTTPS 證書. 現(xiàn)在, 當(dāng)我們在瀏覽器地址欄輸入 https://www.awesome.com 即可訪問我們的網(wǎng)站.


不過, 我們的網(wǎng)站目前還存在幾個問題:


1.無法訪問 http://www.awesome.com
2.每次都需要用戶手動輸入 https:// 前綴以制定 https 形式的訪問

為此, 我們需要重新編寫一個 server 并監(jiān)聽 80 端口, 并對所有請求返回一個 redirect 響應(yīng), 把所有 http 請求都重定向?yàn)?https 請求. 最后, 我們還將開啟 HSTS, 方便用戶、提高安全性的同時減少無效的訪問.


監(jiān)聽 80 端口

考慮我們的目的只是為了進(jìn)行重定向, 我們不如暫且撇開 Flask, 用 Python 自帶的網(wǎng)絡(luò)庫寫一個簡單的 server, 把它當(dāng)成一個練手的 demo.


結(jié)合文檔 wsgiref, 我們可以新建 ~/webapp/redirect.py 并填寫如下內(nèi)容


from wsgiref.util import setup_testing_defaults
from wsgiref.simple_server import make_server

def simple_app(environ, start_response):
    status = "200 OK"
    headers = [("Content-type", "text/plain; charset=utf-8")]
    start_response(status, headers)

    ret = [("%s: %s
" % (key, value)).encode("utf-8") for key, value in environ.items()]
    return ret

with make_server("0.0.0.0", 80, simple_app) as httpd:
    httpd.serve_forever()


http 請求重定向?yàn)?https 請求

為了實(shí)現(xiàn)重定向(redirect), 我們需要構(gòu)造這樣一個 http response:


它的 Status Code301 Moved Permanently

它的 headers 中包含了 redirect 的目標(biāo)地址 Location: https://..., 其中 ... 是用戶請求的 URI, 如首頁的 URI 就是 https://www.awesome.com/, 下面以這個 URI 為例.

最后將 response body 設(shè)為空即可


因此我們可以得到這樣的 response headers


HTTP/1.1 301 Moved Permanently
Content-length: 0
Location: https://www.awesome.com/

我們可以據(jù)此修改 redirect.py 的內(nèi)容


from wsgiref.util import request_uri
from wsgiref.simple_server import make_server

def simple_app(environ, start_response):
    uri = request_uri(environ)            # 獲取 client 請求的地址 URI
    location = uri[:4] + "s" + uri[4:]    # 將 http 替換成 https
    status = "301 Moved Permanently"      # 設(shè)置 Status Code
    headers =   [ ("Content-length", "0"), ("Location", location) ] # 設(shè)置 headers

    start_response(status, headers)
    return b""

httpd = make_server("0.0.0.0", 80, simple_app)
httpd.serve_forever()

至此, 我們新編寫的 server 已經(jīng)完成了, 我們在 ~/webapp/ 目錄下打開一個 Terminal, 然后運(yùn)行如下命令


python3 redirect.py

接著, 我們打開瀏覽器的開發(fā)者工具, 并在地址欄輸入 www.awesome.com. 如果一切順利, 我們將在開發(fā)者工具中看到一個 301 跳轉(zhuǎn), 然后被重定向到 https://www.awesome.com


開啟 HSTS

為了開啟 HSTS, 我們需要在 http response headers 中添加如下記錄


Strict-Transport-Security: max-age=15768000; includeSubDomains; preload

以上內(nèi)容在提供 https 服務(wù)的 server 中添加即可, 因此我們需要修改 ~/webapp/server.py. 首先引入 make_response, 然后在 get() 方法中生成 resp = make_response("It is a GET request"), 以替換原來的生成響應(yīng)的方法. 接著加上新的 headers 記錄 resp.headers["Strict-Transport-Security"]. 因此可以得到如下 server.py


from flask import Flask, make_response
from flask.views import MethodView
app = Flask(__name__)

class IndexHandler(MethodView):
    def get(self):
        resp = make_response("It is a GET request")
        resp.headers["Strict-Transport-Security"] = "max-age=15768000; includeSubDomains; preload"
        return resp

if __name__ == "__main__":
    app.add_url_rule("/", view_func=IndexHandler.as_view("index"))
    context = ("./server.cer", "./server.key")
    app.run(port=443, host="0.0.0.0", debug=True, threaded=True, ssl_context=context)

保存 server.py 之后, 我們運(yùn)行 server.py


python3 server.py

接著, 我們用無痕模式訪問 www.awesome.com, 在開發(fā)者工具中, 我們首先可以看到一個 301 跳轉(zhuǎn), 然后在自動進(jìn)行的對 https://www.awesome.com 的請求之后, 我們就可以在 response headers 看到新添加的 Strict-Transport-Security 記錄了.


此時, 如果我們再次輸入 www.awesome.com, 從開發(fā)者工具中我們可以看到, 跳轉(zhuǎn)碼從 301 變成了 307, 也就是 Internal Redirect, 這是在瀏覽器內(nèi)部進(jìn)行的重定向, 瀏覽器直接幫我們在本地把 http 換成了 https, 而不需要經(jīng)過我們的 redirect.py, 減少了一次不必要的訪問. 這也是 HSTS 帶來的好處之一.


限于篇幅, 本文只說明如何在 http response headers 中加入 HSTS. 如果想了解更多關(guān)于 HSTS 的內(nèi)容, 可以參考這篇博客: HSTS學(xué)習(xí)筆記.


參考資料

wsgiref — WSGI Utilities and Reference Implementation, Python Docs

how-to-redirect-http-to-https-in-flask, Stack Overflow

HSTS學(xué)習(xí)筆記

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/43196.html

相關(guān)文章

  • HSTS進(jìn)一步增強(qiáng)網(wǎng)站安全性

    摘要:網(wǎng)站可以選擇使用策略,來讓瀏覽器強(qiáng)制使用與網(wǎng)站進(jìn)行通信,以減少會話劫持風(fēng)險。谷歌想出了一個辦法把想啟用的所有站點(diǎn)的域名預(yù)先寫進(jìn)瀏覽器代碼不就好了。谷歌維護(hù)了一個名為的網(wǎng)站,專門用于申請讓瀏覽器給各站點(diǎn)內(nèi)置開啟支持。 由于 Lets Encrypt 等免費(fèi)證書的存在,各位站長都可以很容易的加固自己的網(wǎng)站。然而 HTTPS 不是萬能藥,并不是加入 HTTPS 支持就萬事大吉了。 譬如說,就...

    cuieney 評論0 收藏0
  • HSTS進(jìn)一步增強(qiáng)網(wǎng)站安全性

    摘要:網(wǎng)站可以選擇使用策略,來讓瀏覽器強(qiáng)制使用與網(wǎng)站進(jìn)行通信,以減少會話劫持風(fēng)險。谷歌想出了一個辦法把想啟用的所有站點(diǎn)的域名預(yù)先寫進(jìn)瀏覽器代碼不就好了。谷歌維護(hù)了一個名為的網(wǎng)站,專門用于申請讓瀏覽器給各站點(diǎn)內(nèi)置開啟支持。 由于 Lets Encrypt 等免費(fèi)證書的存在,各位站長都可以很容易的加固自己的網(wǎng)站。然而 HTTPS 不是萬能藥,并不是加入 HTTPS 支持就萬事大吉了。 譬如說,就...

    zilu 評論0 收藏0
  • HTTP 狀態(tài)碼

    摘要:狀態(tài)碼有哪些一般大家都知道頁面不存在,服務(wù)器錯誤,重定向,臨時重定向,,未授權(quán)啥的??偨Y(jié)僅僅三個狀態(tài)碼,都可以牽涉到如此豐富的知識,對于狀態(tài)碼,我們不能只是片面的去背誦狀態(tài)碼及對應(yīng)的含義,要去主動挖掘,深入,借助狀態(tài)碼來建立自己的網(wǎng)絡(luò)體系。 之前寫的一些筆記,簡單記錄在這里。 http狀態(tài)碼有哪些? 一般大家都知道404頁面不存在,500服務(wù)器錯誤,301重定向,302臨時重定向,2...

    yuanzhanghu 評論0 收藏0
  • Web 開發(fā)學(xué)習(xí)筆記(3) --- 申請和部署HTTPS證書

    摘要:簡介現(xiàn)在已經(jīng)進(jìn)入的時代證書目前應(yīng)用廣泛發(fā)展迅速相較于明文傳輸?shù)母影踩从捎谄浒踩珜邮褂玫氖且虼艘部梢苑Q為或關(guān)于證書的分類可以參考這篇博客證書需要向國際公認(rèn)的證書證書認(rèn)證機(jī)構(gòu)申請接下來我們將使用自動化證書管理工具為我們的域名申請頒發(fā)的證書然 簡介 現(xiàn)在已經(jīng)進(jìn)入 HTTPS 的時代, HTTPS 證書 目前應(yīng)用廣泛, 發(fā)展迅速. 相較于明文傳輸?shù)?HTTP, HTTPS 更加安全. ...

    gekylin 評論0 收藏0
  • Web 應(yīng)用安全性: 使用這些 HTTP 頭保護(hù) Web 應(yīng)用

    摘要:綜上所述,認(rèn)為沒有提供的保護(hù),用戶會過得更好安全研究人員并不完全反對這一決定。內(nèi)容安全策略是一個額外的安全層,用于檢測并削弱某些特定類型的攻擊,包括跨站腳本和數(shù)據(jù)注入攻擊等。 這是關(guān)于web安全性系列文章的第 三 篇,其它的可點(diǎn)擊以下查看: Web 應(yīng)用安全性: 瀏覽器是如何工作的 Web 應(yīng)用安全性: HTTP簡介 目前,瀏覽器已經(jīng)實(shí)現(xiàn)了大量與安全相關(guān)的頭文件,使攻擊者更難利用漏...

    spademan 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<