Nginx 限制請求速率 (ngx_http_limit_req_module)
說明本篇文章介紹 Nginx 的限制請求速率模組 ngx_http_limit_req_module,說明可用指令和基本範例。限制請求速率通常用來防止 DDOS 或是暴力破解密碼等惡意攻擊,該模組有以下指令: limit_req_zone limit_req limit_req_dry_run limit_req_log_level limit_req_status 指令limit_req_zone 標題 內容 語法 limit_req_zone key zone=name:size rate=rate [sync]; 預設值 - Context http 這個指令是定義規則,相關的參數如下 key:可以視為符合的條件,例如照 IP、Server Name 或國家等等不同條件,參考最後的範例。 name:唯一名稱。 size:配置多少記憶體。 rate:限制的速率,可以是每秒或是每分多少次。 sync:是商業版的功能,暫時先不討論。 簡單的例子 1limit_req_zone $binary_remote_addr zone=perip ...
Nginx 限制連線數 (ngx_http_limit_conn_module)
說明本篇文章介紹 Nginx 的限制連線數模組 ngx_http_limit_conn_module,說明可用指令和基本範例。限制連線數通常用來防止 DDOS 等惡意攻擊,該模組有以下指令: limit_conn_zone limit_conn limit_conn_dry_run limit_conn_log_level limit_conn_status 指令limit_conn_zone 標題 內容 語法 limit_conn_zone key zone=name:size; 預設值 - Context http 這個指令是定義規則,相關的參數如下 key:可以視為符合的條件,例如照 IP、Server Name 或國家等等不同條件,參考最後的範例。 name:唯一名稱。 size:配置多少記憶體。 簡單的例子 1limit_conn_zone $binary_remote_addr zone=perip:10m; limit_conn 標題 內容 語法 limit_conn zone number; 預設值 - Con ...
Rails + Passenger 解決 Request queue full (configured max. size: 100)
問題透過 Passenger 的相關 HTTP Request 回應 503,出現下面錯誤訊息 1Request queue full (configured max. size: 100) 原因Passenger 使用多個程序 (Process) 來處理 HTTP 請求,預設為 6 個。當大量 Request 進來時,處理不及的會先放在 Queue 等待處理,預設 100 個,當超過 Queue 的上限時會出現這錯誤。 處理請求速度不夠,來不及消化是出現錯誤的原因,然而處理速度不夠的原因就有很多可能,而對應的解決方式也都不同。這邊列出幾個我想得到的原因: 設定問題 程式效能問題 大量 HTTP 請求 程式存在 Bug 底層框架或套件有 Bug 網路上可能會看到有人說去修改 passenger_max_request_queue_size 的設定,來增加 Queue 的大小,但這沒有根本解決問題,還是要找出原因來對做應處理。 設定問題說明比較常見的是 Passenger 使用 ActionCable 時設定沒有正確。ActionCable 使用 Socket 持續連線,所以會常時 ...
Rails ActionCable 效能測試
本篇文章說明連線數上限相關設定,以及實測 ActionCable 預設模式、Standalone 模式和 AnyCable 三種方案的效能比較。 準備首先建立一個 Rails 專案來測試 ActionCable 連線效能,先寫一個簡單的 Channel 12345class MessageChannel < ApplicationCable::Channel def subscribed stream_for 'message_channel' endend 在 config/environments/development.rb 加上 1config.action_cable.disable_request_forgery_protection = true 然後寫一個 Node Client 程式來測試,使用套件 @anycable/web 和 ws 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849imp ...
Solidity 智能合約 - 工廠模式的搶先交易問題 (Front Running)
之前的文章 Solidity 智能合約 - 工廠模式的重組問題 (Reorg) 說明了重組問題和解決方案,但是並不能防止搶先交易 (Front Running)。本篇文章將說明這個安全問題,以及解決方式。 搶先交易 (Front Running)這是區塊鏈常見的一種獲利手法,也可以說是一種攻擊,監控未確認的交易來預知未來將發生的事情,讓自己的交易搶先執行而獲利。例如看到有人要用大單買入 ETH,就搶先買入後抬高價格賣給他。 問題延續上一篇文章的情境: 使用者 A 用 salt 0xabcd... 建立一個多簽錢包 0x9876...。 使用者 A 轉入 ETH 到 0x9876...。 假設使用者 A 先預測了生成的錢包為 0x9876...,並連續送出第二筆交易。這時候在鏈上,存在這兩筆未確認交易,攻擊者看到後搶先送出他的交易: 攻擊者 C 用 salt 0xabcd... 建立一個多簽錢包 0x9876...。 使用者 A 用 salt 0xabcd... 建立一個多簽錢包 0x9876...。已存在,交易失敗。 使用者 A 轉入 ETH 到 0x9876...。 結果 E ...
Solidity 智能合約 - 工廠模式的重組問題 (Reorg)
之前的文章 Solidity 智能合約 - 工廠模式 (Factory Pattern) 和 Solidity 智能合約 - 地址生成規則說明了工廠模式和地址生成的規則。在了解這些之後我們會發現某些情況可能存在重組的問題,本篇文章將說明這個安全問題,以及解決方式。 重組 (Reorg)我們這裡只簡略的說明這個現象,簡單說就是區塊打包的結果有可能發生變動,造成原本執行交易的結果發生變化 問題在工廠模式中採用 create 的地址生成規則的時候,會和執行順序有關。我們考慮以下的模擬情境: 使用者 A 建立一個多簽錢包 0x1234...。 使用者 A 轉入 ETH 到 0x1234...。 使用者 B 建立一個多簽錢包 0x5678...。 由於發生重組,順序改變了: 使用者 B 建立一個多簽錢包 0x1234...。 使用者 A 建立一個多簽錢包 0x5678...。 使用者 A 轉入 ETH 到 0x1234...。 結果使用者 A 的 ETH 跑到使用者 B 建立的 0x1234... 解決方案等待區塊確認如同中心化交易所入金一樣,等待足夠多的區塊確認後再進行下一步,使用者 ...
Solidity 智能合約 - 地址生成規則
之前的文章 Solidity 智能合約 - 工廠模式 (Factory Pattern) 說明了生成智能合約的方法,這篇文章進一步說明智能合約地址生成的規則,包含了 create 和 create2 的差異。 目前產生合約主要有兩種規則: create create2 create我們可以在智能合約中使用這個指令來建立合約,而上一篇文章提到的 new 寫法其實也是使用 create 指令。另外,EOA 錢包部署合約的時候也適用這個規則。這個規則中,影響地址主要是下面兩個參數: 發送者 (sender) nonce 生成的公式如下: 1keccak256(rlp([sender, nonce]))[12:] 後面的 [12:] 表示生成的 hash 取最後 20 bytes。如果是 EOA 錢包部署,sender 為錢包地址,nonce 為錢包發送交易時的 nonce。如果是智能合約中建立其他合約,sender 則為執行建立合約行為的主合約地址,nonce 則為此合約的第幾次執行生成合約,從 1 開始。 例如我在 hardhat 進行測試的時候,預設錢包是:0xf39Fd6e5 ...
Solidity 智能合約 - 工廠模式 (Factory Pattern)
簡介工廠模式 (Factory Pattern) 是一種程式設計的設計模式 (Design Pattern),用來生成物件的一種方式。在智能合約開發中,有些情況會使用到。例如:Uniswap 的交易對或是生成 Token。只需要輸入一些不同的參數,像是名稱、總發行量之類的設定,就可以就快速部署功能相同的合約。我們可以透過智能合約中撰寫一些程式碼來產生新合約,本篇文章會介紹一些方法。 在智能合約中用來建立合約實例的指令有三種寫法: new create create2 而根據實作的方法主要分為兩種: 部署整份合約 使用 Proxy 部署整份合約先假設我們有一個這樣的合約 12345import "@openzeppelin/contracts/token/ERC20/ERC20.sol";contract NormalToken is ERC20 { constructor(string memory name_, string memory symbol_) ERC20(name_, symbol_) {}} ...
新光銀行 OU 數位帳戶任務攻略
最近被 Facebook 廣告台幣活儲最高 6.08% 打到,研究了一下。除了 6.08% 的台幣活存之外,其他同時有些活動覺得還不錯,就記錄一下寫成一篇攻略。前面先整理出目前有的活動進行簡單說明,後面會說明如何操作能拿到各種獎勵。 新光好友邀請函任務 1活動期間:2024 年 1 月 2 日至 2024 年 3 月 31 日。任務獎勵:100 點 LINE POINTS任務內容:透過推薦連結辦理信用卡。其他說明: 申請 OU 數位帳戶的時候會強制要辦一張卡,所以可以考慮先取得推薦辦理信用卡,再去開數位帳戶。 推薦連結似乎要使用 LINE 分享給好友,可以找朋友看有沒有人有,或是使用我從 LINE 裡面抓出來的連結試試:新光 ESG 白金卡 推薦連結。 使用 ESG 白金卡是因為在申請數位帳號的時候可以選這張,這樣似乎就可以只申請一張卡。 任務 2活動期間:2024 年 1 月 2 日至 2024 年 3 月 31 日。任務獎勵:20 點 LINE POINTS任務內容:首次綁定贈 10 點,登入行網銀再贈 10 點。 任務 3活動期間:2024 年 1 月 2 日至 2024 年 ...
在 zkSync 驗證 TransparentUpgradeableProxy 合約
說明zkSync 可以使用 hardhat-zksync-verify 工具,來讓合約在瀏覽器上開源,通常可以使用下面指令進行驗證: 1npx hardhat verify --network zkSync 合約地址 例如使用合約地址 0xdD5AE451A75a654146747235FDB515F06A55D018,為一個 TransparentUpgradeableProxy 的合約,嘗試使用下面指令進行驗證: 1npx hardhat verify --network zkSync 0xdD5AE451A75a654146747235FDB515F06A55D018 結果會出現下面錯誤: 123Error in plugin @matterlabs/hardhat-zksync-verify: The number of constructor arguments you provided (0) does not match the number of constructor arguments the contract has been deployed with (3 ...