Claire_S
    • Create new note
    • Create a note from template
      • Sharing URL Link copied
      • /edit
      • View mode
        • Edit mode
        • View mode
        • Book mode
        • Slide mode
        Edit mode View mode Book mode Slide mode
      • Customize slides
      • Note Permission
      • Read
        • Only me
        • Signed-in users
        • Everyone
        Only me Signed-in users Everyone
      • Write
        • Only me
        • Signed-in users
        • Everyone
        Only me Signed-in users Everyone
      • Engagement control Commenting, Suggest edit, Emoji Reply
    • Invite by email
      Invitee

      This note has no invitees

    • Publish Note

      Share your work with the world Congratulations! 🎉 Your note is out in the world Publish Note

      Your note will be visible on your profile and discoverable by anyone.
      Your note is now live.
      This note is visible on your profile and discoverable online.
      Everyone on the web can find and read all notes of this public team.
      See published notes
      Unpublish note
      Please check the box to agree to the Community Guidelines.
      View profile
    • Commenting
      Permission
      Disabled Forbidden Owners Signed-in users Everyone
    • Enable
    • Permission
      • Forbidden
      • Owners
      • Signed-in users
      • Everyone
    • Suggest edit
      Permission
      Disabled Forbidden Owners Signed-in users Everyone
    • Enable
    • Permission
      • Forbidden
      • Owners
      • Signed-in users
    • Emoji Reply
    • Enable
    • Versions and GitHub Sync
    • Note settings
    • Note Insights New
    • Engagement control
    • Transfer ownership
    • Delete this note
    • Save as template
    • Insert from template
    • Import from
      • Dropbox
      • Google Drive
      • Gist
      • Clipboard
    • Export to
      • Dropbox
      • Google Drive
      • Gist
    • Download
      • Markdown
      • HTML
      • Raw HTML
Menu Note settings Note Insights Versions and GitHub Sync Sharing URL Create Help
Create Create new note Create a note from template
Menu
Options
Engagement control Transfer ownership Delete this note
Import from
Dropbox Google Drive Gist Clipboard
Export to
Dropbox Google Drive Gist
Download
Markdown HTML Raw HTML
Back
Sharing URL Link copied
/edit
View mode
  • Edit mode
  • View mode
  • Book mode
  • Slide mode
Edit mode View mode Book mode Slide mode
Customize slides
Note Permission
Read
Only me
  • Only me
  • Signed-in users
  • Everyone
Only me Signed-in users Everyone
Write
Only me
  • Only me
  • Signed-in users
  • Everyone
Only me Signed-in users Everyone
Engagement control Commenting, Suggest edit, Emoji Reply
  • Invite by email
    Invitee

    This note has no invitees

  • Publish Note

    Share your work with the world Congratulations! 🎉 Your note is out in the world Publish Note

    Your note will be visible on your profile and discoverable by anyone.
    Your note is now live.
    This note is visible on your profile and discoverable online.
    Everyone on the web can find and read all notes of this public team.
    See published notes
    Unpublish note
    Please check the box to agree to the Community Guidelines.
    View profile
    Engagement control
    Commenting
    Permission
    Disabled Forbidden Owners Signed-in users Everyone
    Enable
    Permission
    • Forbidden
    • Owners
    • Signed-in users
    • Everyone
    Suggest edit
    Permission
    Disabled Forbidden Owners Signed-in users Everyone
    Enable
    Permission
    • Forbidden
    • Owners
    • Signed-in users
    Emoji Reply
    Enable
    Import from Dropbox Google Drive Gist Clipboard
       Owned this note    Owned this note      
    Published Linked with GitHub
    • Any changes
      Be notified of any changes
    • Mention me
      Be notified of mention me
    • Unsubscribe
    ## HTTP協定 ### 1. 運作方式 * 客戶端發出請求(Request) -> 伺服器給出回應(Response) * 流程: * 使用者在瀏覽器中輸入網址 -> 瀏覽器送出一個Request給網站伺服器 -> 伺服器收到後處理,送回一個response -> 瀏覽器根據回應內容顯示網頁 如果是要打開一個網頁: ![image](https://hackmd.io/_uploads/SkvzEvGDxe.png) | 欄位 | 說明 | | ------------------- | ---------------------------------------------------- | | **Request URL** | 請求的網址:`http://127.0.0.1:5000/home`(本機伺服器 `/home` 頁面) | | **Request Method** | HTTP 方法為 `GET`,表示取得頁面 | | **Status Code** | `200 OK`:伺服器成功處理請求 | | **Remote Address** | 伺服器地址:127.0.0.1:5000(本機) | | **Referrer Policy** | `strict-origin-when-cross-origin`:跨來源時只送出 origin 資訊 | - Response | 欄位 | 說明 | | ------------------- | ---------------------------------------------------- | | **Connection** | `close`:伺服器請求完後關閉連線 | | **Content-Length** | `510`:回應的內容長度(byte 數) | | **Content-Type** | `text/html; charset=utf-8`:網頁內容,UTF-8 編碼 | | **Date** | 回應的時間:2025/07/26 14:16:48 GMT | | **Server** | Werkzeug/3.1.3 Python/3.10.11(Flask 預設的開發用伺服器) | | **Vary** | `Cookie`:根據不同 cookie 值可能回傳不同內容(通常用於快取控制) | ![image](https://hackmd.io/_uploads/HJa74vzPlg.png) - Request | 欄位 | 說明 | | ----------------------------- | ----------------------------------------------------- | | **Accept** | 告訴伺服器可接受哪些格式,像 HTML、圖片等 | | **Accept-Encoding** | 指定壓縮方式(gzip、br 等)以節省流量 | | **Accept-Language** | 優先語言:中文(台灣) > 中文 > 英文(美國) | | **Cache-Control** | `max-age=0`:告訴伺服器不要使用快取 | | **Connection** | `keep-alive`:希望保持連線不關閉(節省建立新連線的成本) | | **Cookie** | 包含 session ID:`session=eyJ1c2VyIjoi...`,用於識別登入狀態 | | **Host** | 主機資訊:127.0.0.1:5000 | | **Referer** | 前一頁是:[http://127.0.0.1:5000/](http://127.0.0.1:5000/) | | **Sec-CH-UA / Sec-Fetch-XXX** | 安全性相關的 HTTP Client hints,用來識別瀏覽器、平台等 | | **User-Agent** | 瀏覽器資訊:Chrome 138 on Windows 10 | ```python @app.route('/home') def home(): if 'user' in session: # ← session 仍存在,允許顯示頁面 return render_template('home_page.html', user=session['user']) else: return redirect(url_for('index')) # 若無 session 則跳轉回登入 ``` 登入指令: ![image](https://hackmd.io/_uploads/HyAE4PGwel.png) | 欄位 | 說明 | | ------------------- | ---------------------------------------------------------------------------------- | | **Request URL** | 請求登入的 URL:`http://127.0.0.1:5000/login` | | **Request Method** | POST:提交登入表單 | | **Status Code** | `302 FOUND`:伺服器重新導向至 `/home`(登入成功的典型行為) | | **Remote Address** | 127.0.0.1:5000 | | **Referrer Policy** | `strict-origin-when-cross-origin` | | **Connection** | close | | **Content-Length** | 197 | | **Content-Type** | `text/html; charset=utf-8` | | **Date** | 回應時間 | | **Location** | `/home`:告訴瀏覽器重導向至此頁 | | **Set-Cookie** | 設定 session cookie:`session=eyJ1c2VyIjoi...; HttpOnly; Path=/`,表示登入成功並儲存使用者 session | | **Vary** | Cookie:同上,用來控制快取行為 | ![image](https://hackmd.io/_uploads/ry5BVwfveg.png) | 欄位 | 說明 | | ---------------------------------------------- | ------------------------------------------ | | **Accept / Accept-Encoding / Accept-Language** | 同上 | | **Connection** | `keep-alive` | | **Content-Length** | 28:提交的表單資料長度 | | **Content-Type** | `application/x-www-form-urlencoded`:常見表單格式 | | **Origin** | `http://127.0.0.1:5000`:來源頁面與目標相同(同源請求) | | **Referer** | `http://127.0.0.1:5000/`:前一頁為登入頁 | | **Host / Sec-CH-UA / User-Agent** | 同上 | ```python @app.route('/login', methods=['POST']) def login(): account = request.form.get('account') # ← 對應 request body 的帳號欄位 password = request.form.get('password') # ← 對應 request body 的密碼欄位 if account in users and users[account] == password: session['user'] = account # ← 對應伺服器回應中的 Set-Cookie(session) return redirect(url_for('home')) # ← 對應 status code: 302 和 Location: /home else: error = '帳號或密碼錯誤' return render_template('login_page.html', error=error) ``` ### 2. 常見的HTTP method |名稱|主要意義|例子| |----|----|----| |GET|取得後端資源(請求獲取資料)|打開網頁| |POST|提交資料,通常用於新增資料|送出表單、登入帳號| |PUT|送出檔案至伺服器上(更新指定資料)|修改個人資料| |DELETE|刪除資料|刪除文章| ### 3. HTTP 狀態碼 |Status Code|意義| |----|----| |1XX|Information| |2XX|Success| |3XX|Redirection| |4XX|Client Error| |5XX|Server Error| ### 4. HTTP&HTTPS 的差異 |協定|安全性|說明| |----|----|----| |HTTP|不安全|資料是明文傳輸,容易被攔截| |HTTPS|加密|加了SSL/TLS加密,較為安全| * SSL&TLS |名稱|全名|| |----|----|----| |SSL|Secure Sockets Layer|已淘汰,被TLS取代| |TLS|Transport Layer Security|現行加密方式| * TLS做了什麼事: > 在 SSL/TLS handshake之前,傳輸層上還有一個廣泛使用的協定 'TCP' 有提到一開始建立連線的方法是 Three-way-Handshake。 時序如下: ```plantuml @startuml A -> B: SYN A <- B: SYN-ACK A -> B: ACK @enduml ``` 包含三件事情: 1. Client傳送連線請求 2. Server回應確認並同意連線 3. Client傳送最終確認 那在TCP Three-way Handshake 完成之後,如果 A 有希望使用 TLS 加密時就會開始做 TLS Handshake,這包含三件事情: 1. 雙方交換憑證 2. 用非對稱加密傳交換密鑰 3. 之後用對稱加密通訊 ```plantuml @startuml A -> B: (1) hello note left Highest SSL version Cipher supported Data Compression Method etc. end note A <- B: (2) hello note right Selected SSL version Selected Cipher Selected Data Compression Method Certificate etc. end note A -> A: (3) Validate Certificate A -> B: (4) Certificate B -> B: (5) Validate Certificate A -> B: (6) Key exchange A -> B: (7) Change Cipher Spec A -> B: (8) Finished A <- B: (9) Change Cipher Spec A <- B: (10) Finished A <-> B: (11) Encrypted Data Transfer @enduml ``` 1. A 跟 B 要求要用 TLS 加密,A 先跟 B 說他支援什麼版本跟相關資訊。 2. B 如果有支援的話,就會回傳他選的版本,同時把憑證丟給 A。 3. A 拿到憑證之後,會先要看看是不是合法的,不合法的話會提出警告訊息給使用者。 4. B 也可以要求 A 提出憑證,有的話就回傳給 B。 5. B 拿到憑證之後,一樣要看看是不是合法的,不合法的話會提出警告訊息給使用者。 6. 金鑰交換,隨機產生一組作為對稱式加密使用的密鑰。 7. A 會跟 B 說好接下來要用什麼方法來做資料加密。 8. B 收到訊息並確認這是 A 發出來的。 9. B 也會發訊息通知 A 要用什麼方法做資料加密。 10. A 拿到訊息,也確認完成。 11. 可以開始使用加密資料傳輸了。 * 加密方式 |種類|說明| |----|----| |對稱加密|雙方共用一把密鑰| |非對稱加密|一把公開鑰,一把私密鑰| ## 安全設計準則 ### 1. External Systems are Insecure 預設所有來自外部的資料都是不安全的。 實務上來說: - 所有外部API的輸入都要進行驗證跟消毒。 - 不信任HTTP request headers,例如X-User_ID,要由Server端驗證Session。 - 連接第三方金流服務時,一定要驗證簽章與回乎網址是否正確。 ### 2. Minimize Attack Surface Area 只開放必要的介面與功能,減少攻擊點。 實務: - 只對外開放必要的API - 管理後臺路徑如admin應限制IP白名單或加二階段認證。 - 使用HTTPS,關閉沒有在使用的port。 ### 3. Secure Defaults 預設設定即為安全狀態,讓使用者無需額外設置。 - 使用者預設註冊開啟Email驗證。 - Cookie預設設定為HTTPSonly(443)。 - 密碼需預設強度高的密碼。 ### 4. Least Privilege 每個使用者/模組只能存取最小必要權限。 - 前端使用[JWT token](https://ithelp.ithome.com.tw/articles/10225398)時,token裡面只含必要的role,不應該包含敏感資料。 - 前後端每個路徑都要檢查權限,不只是檢查登入狀態。 - 後臺帳號分等級(管理員/編輯者/檢視者)。 ### 5. Separation of Duties 不同操作由不同角色執行,防止濫權(分權的概念) - 一人申請資料刪除,另一人審核。 - CI/CD管理與原始碼審查由不同人員負責。 - Web系統中的角色權限不能疊加,防止出現超級管理員。 ### 6. Defense in Depth 多層防護,層層保護。 - HTTPS+身分驗證(JWT)+WAF+[CSRF](https://blog.csdn.net/qq_40558345/article/details/130629334) Token。 - 資料加密(資料庫層)+存取控制(應用層)+日誌審核(監控層)。 ### 7. Fail Securely 系統錯誤時不要洩漏資訊,且回到安全狀態。 - 不顯示錯誤堆疊給使用者,只顯示generic error。 - 資料處理錯誤時,應回滾交易或封鎖流程。 ### 8. Do not trust Security through Obscurity 不靠把資訊藏起來作為唯一防線。 - 後臺路徑藏起來也要加身分驗證。 - API key不應該藏在前端程式碼中(可能會被反編譯)。 ### 9. Simplicity 系統越簡單,越容易管理與安全。 - 前後端溝通設計單純(RESTful API 遵循實例)。 - 不需要的功能盡量不要加,減少維護與風險。 - 權限控管系統清晰易懂。 ## OWASP 2025版將會在2025的夏天或是秋初發布。 ### 對照表(修改版): Top 10 - 2017 vs 2021 |2017 Rank|2021 Rank|2021名稱|名稱解釋|預防措施| |---|---|---|---|---| |A04<br>A05|**A01**| 權限控制失效 | CSRF、預設權限沒設好<br>例如偷改URL、用自訂API工具繞過檢查、改個參數就能偷看或偷改他人資料、更改cookie拿到權限等等。|- 非公開資料預設拒絕存取<br>- 禁止在網頁顯示網站資料夾功能,避免中繼資料(如.git)及備份資料留在 Web 根目錄<br>- JWT 登出後應要在伺服器端強制失效| |A03|**A02**| 加密機制失效 | 避免明碼傳輸、淘汰老舊加密演算法與強度不足的金鑰、驗證頻證有效性等等。| - 對系統涉及的資料進行分類,識別哪些是敏感資料,對不同分類採行不同的管控措施。<br>- 非必要不保存敏感資料,不得不存時考慮使用資料記號化(Tokenization)或截斷(Truncation)<br>- 確保所有靜態敏感資料有加密,且使用新版且夠強的加密演算法,並妥善保存金鑰<br>- 使用TLS加密傳輸<br>- 網頁包含敏感資料時禁用Cache| |A01<br>A07|**A03**| 注入式攻擊 | SQL、OS指令、表達式語言等等的注入都算| - [源碼檢測](https://hackmd.io/@ClaireS/H1BXOjzYel)是有效的發現手段<br>- 把命令跟資料徹底分開;以SQL Injection來說,外界輸入內容依慮使用Dbparameter傳送,或改用EF、ORM技術<br>- 考慮使用白名單在伺服器端驗證輸入資料<br>- 使用LIMIT或TOP限制筆數,萬一受到攻擊時可以減少洩漏資料量| ||**A04**| 不安全設計 | 設計的時候沒想好<br>例如演唱會搶票網站沒加CAPTCHA防機器人驗證 | - 設計階段找專家參與評估及審核<br>- 對關鍵認證、存取控制、商業邏輯與關鍵缺陷進行威脅分析 | |A06|**A05**| 安全設定缺陷 | 指程式設計及系統架構上的不當設計與設定<br>例如不必要的 Port、帳號或權限、未改掉預設帳號密碼、錯誤訊息曝露程式檔資訊 | - 平台上不要夾帶用不到的功能、套件、工具等等<br>- 落實變更管理,依據資安公告、安全更新、弱點資訊進行安全審核<br>- 採用可分割的應用程式架構,達成管理及安全上的隔離。| |A09|**A06**| 易受攻擊和已淘汰的組件 | | - 刪除不必要的相依套件、不需要的功能<br> - 盤點客戶端及伺服器端組件及相依套件版本,持續監控與通報<br> - 管控組件來源,一律由官方下載、選擇有數位簽章的更新包| |A02|**A07**| 認證及驗證機制失效 | 因防禦不足被由其他來源取得帳密名單,允許強度不足的密碼、使用脆弱的忘記密碼或重設密碼機制、密碼以明碼/加密或強度不足的雜湊儲存、缺乏多因素認證、URL 洩漏 Session ID、未正確註銷 Session | - 阻擋脆弱密碼,制定密碼強度要求、定期更換政策<br>- 使用模糊回應避免攻擊者蒐集資訊<br>- 隨機化Session ID,確實註銷登出、閒置、逾時的Session| ||**A08**| 軟體及資料完整性失效 | CDN夾帶惡意程式庫、透過系統自動更新散佈惡意程式 |- 用數位簽章及完整性檢查防止檔案被加料或竄改<br>- 使用軟體供應鏈安全工具確保元件沒有已知弱點<br>- 在CI/CD流程加入必要檢查| |A10|**A09**| 資安紀錄及監控失效 | 未紀錄登入成功/失敗/重要交易之稽核事件、警告或錯誤未留下日誌或保存的訊息不足、未監控程式或API日誌汁可以活動防毒工具未發揮效果,未能偵測及通告進行中的攻擊,導致種損失。 | - 記錄登入、存取失敗記錄,日誌應包含足夠資訊並保留一定期限供日後鑑識需求<br>- 確保日誌正確編碼,防止日誌/監控系統被注入或攻擊<br>- 重要交易需保留稽核軌跡,防止竄改或刪除(設計只允許新增不能更改的資料表)| ||**A10**|伺服器端請求偽造| Server-Side Request Forgery,攻擊者操縱請求內容,成功克服防火牆、VPN 或存取控管,控制網站發送假的請求給對非預期對象。 |- 轉送請求到後方系統時,步將原始回應直接傳給使用者,已麵讓攻擊者得以推測IP、服務狀態<br>- 停止使用HTTP重新導向| 對照表(原) : OWASP Top 10 — 2017 vs 2021 | 2017 Rank | 2017 名稱 | 2021 Rank | 2021 名稱 | 變化說明 | | --------- | --------------------------------- | --------- | ------------------------------------------ | ----------------------------------- | | A1 | Injection | **A3** | Injection | 名次下降,但仍存在。納入 SQL, OS, 等類型 | | A2 | Broken Authentication | A7 | Identification and Authentication Failures | 名稱擴充,加入 MFA、Session 管理錯誤等 | | A3 | Sensitive Data Exposure | **A2** | Cryptographic Failures | 重新命名與聚焦密碼學保護失敗,不只是資料外洩 | | A4 | XML External Entities (XXE) | - | - | 合併到 A5 | | A5 | Broken Access Control | **A1** | Broken Access Control | 名次上升,實際攻擊風險大幅上升 | | A6 | Security Misconfiguration | A5 | Security Misconfiguration | 名次提升 | | A7 | Cross-Site Scripting (XSS) | - | - | 移除為獨立項目,併入 A3\:Injection | | A8 | Insecure Deserialization | A8 | Software and Data Integrity Failures | 擴充概念,包括 CI/CD 破壞、供應鏈攻擊 | | A9 | Using Components with Known vulnerabilities | A6 | Vulnerable and Outdated Components | 名稱更具描述性,聚焦過時元件 | | A10 | Insufficient Logging & Monitoring | A9 | Security Logging and Monitoring Failures | 名次提升,增加事件響應觀念 | ### 2021新增的類別 |編號|名稱|說明| |----|----|----| |A4|Insecure Design|強調「設計層級」的風險,像是缺乏威脅建模、安全預設| |A8|Software and Data Integrity Failures|包含供應鏈攻擊、不安全的 CI/CD、自動更新未驗證簽章等| |A10|Server-Side Request Forgery| 雖在過去不常見,但近年攻擊上升(例如Cloud Metadata窺探)| ### 主要變化總結分析: |面向|差異與趨勢| |----|----| |名稱更精確|2021版用更「技術精準」的名詞(如 Cryptographic Failures、Integrity Failures)| |實務導向|根據 500,000 筆+ 真實漏洞資料分析,風險排名更反映實際情況| |設計 vs 實作|新增「Insecure Design」,提醒安全要從架構階段開始考量| |加入供應鏈風險|隨著 open source 爆發、CI/CD 普及,2021 新增完整面向處理| |調整名次|Broken Access Control 升為第一名,反映其高嚴重性與普遍性| |刪除老問題|CSRF、Unvalidated Redirects 等因防禦技術成熟被移除或併入| > OWASP 2021 更貼近實務與現代應用環境,加入設計階段與供應鏈風險,刪除過時議題,更強調「整體安全流程與架構」

    Import from clipboard

    Paste your markdown or webpage here...

    Advanced permission required

    Your current role can only read. Ask the system administrator to acquire write and comment permission.

    This team is disabled

    Sorry, this team is disabled. You can't edit this note.

    This note is locked

    Sorry, only owner can edit this note.

    Reach the limit

    Sorry, you've reached the max length this note can be.
    Please reduce the content or divide it to more notes, thank you!

    Import from Gist

    Import from Snippet

    or

    Export to Snippet

    Are you sure?

    Do you really want to delete this note?
    All users will lose their connection.

    Create a note from template

    Create a note from template

    Oops...
    This template has been removed or transferred.
    Upgrade
    All
    • All
    • Team
    No template.

    Create a template

    Upgrade

    Delete template

    Do you really want to delete this template?
    Turn this template into a regular note and keep its content, versions, and comments.

    This page need refresh

    You have an incompatible client version.
    Refresh to update.
    New version available!
    See releases notes here
    Refresh to enjoy new features.
    Your user state has changed.
    Refresh to load new user state.

    Sign in

    Forgot password

    or

    By clicking below, you agree to our terms of service.

    Sign in via Facebook Sign in via Twitter Sign in via GitHub Sign in via Dropbox Sign in with Wallet
    Wallet ( )
    Connect another wallet

    New to HackMD? Sign up

    Help

    • English
    • 中文
    • Français
    • Deutsch
    • 日本語
    • Español
    • Català
    • Ελληνικά
    • Português
    • italiano
    • Türkçe
    • Русский
    • Nederlands
    • hrvatski jezik
    • język polski
    • Українська
    • हिन्दी
    • svenska
    • Esperanto
    • dansk

    Documents

    Help & Tutorial

    How to use Book mode

    Slide Example

    API Docs

    Edit in VSCode

    Install browser extension

    Contacts

    Feedback

    Discord

    Send us email

    Resources

    Releases

    Pricing

    Blog

    Policy

    Terms

    Privacy

    Cheatsheet

    Syntax Example Reference
    # Header Header 基本排版
    - Unordered List
    • Unordered List
    1. Ordered List
    1. Ordered List
    - [ ] Todo List
    • Todo List
    > Blockquote
    Blockquote
    **Bold font** Bold font
    *Italics font* Italics font
    ~~Strikethrough~~ Strikethrough
    19^th^ 19th
    H~2~O H2O
    ++Inserted text++ Inserted text
    ==Marked text== Marked text
    [link text](https:// "title") Link
    ![image alt](https:// "title") Image
    `Code` Code 在筆記中貼入程式碼
    ```javascript
    var i = 0;
    ```
    var i = 0;
    :smile: :smile: Emoji list
    {%youtube youtube_id %} Externals
    $L^aT_eX$ LaTeX
    :::info
    This is a alert area.
    :::

    This is a alert area.

    Versions and GitHub Sync
    Get Full History Access

    • Edit version name
    • Delete

    revision author avatar     named on  

    More Less

    Note content is identical to the latest version.
    Compare
      Choose a version
      No search result
      Version not found
    Sign in to link this note to GitHub
    Learn more
    This note is not linked with GitHub
     

    Feedback

    Submission failed, please try again

    Thanks for your support.

    On a scale of 0-10, how likely is it that you would recommend HackMD to your friends, family or business associates?

    Please give us some advice and help us improve HackMD.

     

    Thanks for your feedback

    Remove version name

    Do you want to remove this version name and description?

    Transfer ownership

    Transfer to
      Warning: is a public team. If you transfer note to this team, everyone on the web can find and read this note.

        Link with GitHub

        Please authorize HackMD on GitHub
        • Please sign in to GitHub and install the HackMD app on your GitHub repo.
        • HackMD links with GitHub through a GitHub App. You can choose which repo to install our App.
        Learn more  Sign in to GitHub

        Push the note to GitHub Push to GitHub Pull a file from GitHub

          Authorize again
         

        Choose which file to push to

        Select repo
        Refresh Authorize more repos
        Select branch
        Select file
        Select branch
        Choose version(s) to push
        • Save a new version and push
        • Choose from existing versions
        Include title and tags
        Available push count

        Pull from GitHub

         
        File from GitHub
        File from HackMD

        GitHub Link Settings

        File linked

        Linked by
        File path
        Last synced branch
        Available push count

        Danger Zone

        Unlink
        You will no longer receive notification when GitHub file changes after unlink.

        Syncing

        Push failed

        Push successfully