国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

Web 開發學習筆記(4) --- 重定向與HSTS

kevin / 1894人閱讀

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

回顧

通過前幾篇文章的內容, 我們已經搭建了基于 Flask 框架的一個簡單的 Web 應用, 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)

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


不過, 我們的網站目前還存在幾個問題:


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

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


監聽 80 端口

考慮我們的目的只是為了進行重定向, 我們不如暫且撇開 Flask, 用 Python 自帶的網絡庫寫一個簡單的 server, 把它當成一個練手的 demo.


結合文檔 wsgiref, 我們可以新建 ~/webapp/redirect.py 并填寫如下內容


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 請求重定向為 https 請求

為了實現重定向(redirect), 我們需要構造這樣一個 http response:


它的 Status Code301 Moved Permanently

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

最后將 response body 設為空即可


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


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

我們可以據此修改 redirect.py 的內容


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"      # 設置 Status Code
    headers =   [ ("Content-length", "0"), ("Location", location) ] # 設置 headers

    start_response(status, headers)
    return b""

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

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


python3 redirect.py

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


開啟 HSTS

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


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

以上內容在提供 https 服務的 server 中添加即可, 因此我們需要修改 ~/webapp/server.py. 首先引入 make_response, 然后在 get() 方法中生成 resp = make_response("It is a GET request"), 以替換原來的生成響應的方法. 接著加上新的 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 之后, 我們運行 server.py


python3 server.py

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


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


限于篇幅, 本文只說明如何在 http response headers 中加入 HSTS. 如果想了解更多關于 HSTS 的內容, 可以參考這篇博客: HSTS學習筆記.


參考資料

wsgiref — WSGI Utilities and Reference Implementation, Python Docs

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

HSTS學習筆記

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/43196.html

相關文章

  • HSTS進一步增強網站安全性

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

    cuieney 評論0 收藏0
  • HSTS進一步增強網站安全性

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

    zilu 評論0 收藏0
  • HTTP 狀態碼

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

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

    摘要:簡介現在已經進入的時代證書目前應用廣泛發展迅速相較于明文傳輸的更加安全即由于其安全層使用的是因此也可以稱為或關于證書的分類可以參考這篇博客證書需要向國際公認的證書證書認證機構申請接下來我們將使用自動化證書管理工具為我們的域名申請頒發的證書然 簡介 現在已經進入 HTTPS 的時代, HTTPS 證書 目前應用廣泛, 發展迅速. 相較于明文傳輸的 HTTP, HTTPS 更加安全. ...

    gekylin 評論0 收藏0
  • Web 應用安全性: 使用這些 HTTP 頭保護 Web 應用

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

    spademan 評論0 收藏0

發表評論

0條評論

kevin

|高級講師

TA的文章

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