WEB3 的世界

探索 WEB3 的技術與應用,是進入數位新時代的關鍵。

安全挑戰與風險

盤點常見漏洞、攻擊案例與防禦策略。

安全挑戰與風險

網路釣魚與詐騙:不只眼神要警覺

釣魚詐騙是什麼?從偵測到防禦

釣魚詐騙,簡單來說,就是駭客偽裝成你常用的網站或服務,藉以偷走你的帳號、密碼甚至金錢。

這篇文章會帶你從辨識釣魚訊息、偵測可疑網站,到實際排除該風險的防禦技巧,讓你不再被釣魚餌住。

釣魚詐騙是什麼?從偵測到防禦

釣魚詐騙,簡稱「釣魚」,是一種利用假冒合法機構或個人,以欺騙方式取得使用者帳號、密碼甚至金錢的網路詐騙手法。

什麼是釣魚詐騙
  • 以假冒銀行、電商或社群平台的頁面,誘使用戶輸入個人資訊;
常見的攻擊手法
  • 電子郵件釣魚:偽裝成銀行通知,附上惡意連結。
  • 社群訊息釣魚:短訊或聊天工具寄送看似官方的連結。
  • 假冒網站釣魚:域名類似正規站,外觀相同,但實際上是竊取資訊。
如何偵測釣魚網站

import re, socket

def is_phishing(url):
malicious_patterns = ['paypal.com/token', 'login.google.com']
for pattern in malicious_patterns:
if pattern in url:
return True
try:
ip = socket.gethostbyname(url.split('//')[-1].split('/')[0])
except:
return True
private_ranges = ['10.', '172.16', '192.168']
if any(ip.startswith(p) for p in private_ranges):
return True
return False

]

防禦實務
  • 啟用雙重驗證 (2FA):即使密碼被盜,還有第二層保護。
  • 使用瀏覽器安全擴充功能:如「HTTPS Everywhere」或「NoScript」。
  • 定期檢查帳戶異常:若有不明登入,立即改密碼並聯繫客服。
進階工具與資源
工具 功能 連結
PhishTank 社群協作釣魚網站黑名單 https://www.phishtank.com/
VirusTotal 檢查網址或檔案是否惡意 https://www.virustotal.com/
OpenPhish 自動化釣魚郵件偵測 https://openphish.com/

重要提醒

即使看起來「安全」,也可能是釣魚陷阱。保持警覺,才能保護自己的資安。

如何辨別釣魚訊息?三招教你不被騙

在這個數位時代,釣魚訊息已經成為網路詐騙的常態之一。它們往往以假冒官方或熟悉關係人的名義,誘使你點擊連結、輸入個資甚至匯款。
本文將以三招教你快速辨別這類訊息,讓你不再被「一眼」誤導,保護自己的帳號與財務安全。

什麼是釣魚訊息?

釣魚(Phishing)是一種以欺騙為手段,誘使受害者透露個人資訊、登入帳號或轉帳的詐騙手法。訊息形式多樣,常見於電子郵件、簡訊、社群平台私訊甚至假冒客服通話。

三招辨別釣魚訊息

1️⃣ 看發件人地址是否一致
  • 官方域名:真正的機構會使用自家正式域名(如 @example.com)。
  • 偽造域名:若發件人顯示為 <https://security.example.com> 但實際地址是 @example.net,就可能是偽造。
  • 隱藏域名:有些釣魚訊息會用顏色或字體將域名做遮蔽,請務必點擊右鍵「查看原始碼」確認。
2️⃣ 檢查連結的真實性
  • 滑鼠懸停:將滑鼠放在連結上,瀏覽器底部會顯示真實網址。若與訊息文本不符,請勿點擊。
  • 短網址bit.ly, tinyurl.com 等短連結難以辨別,建議使用網址展開工具(如 https://unshorten.it)先確認。
  • HTTPS:真正的安全網站會使用 HTTPS,網址前有鎖頭圖示;但也別僅以此判斷,仍需驗證域名。
3️⃣ 留意緊急語氣與拼字錯誤
  • 急迫要求:如「立即處理,否則帳號將被停用」等措辭過於緊急,通常是誘使你草率行動。
  • 拼字或語法:正式機構的訊息通常經過校對,若出現多處錯別字、語法不通或標點誤用,是警訊。

如何驗證連結安全

  • 網址展開:在瀏覽器地址列直接輸入短連結,查看展開後的完整網址。若域名不熟悉或顯示為未知站點,請避免進一步操作。
  • 使用安全工具:可以利用 https://www.phishtank.comhttps://safelinks.microsoft.com/ 等網站,輸入連結進行查驗。

以 curl 檢查連結是否安全(示範)

curl -I https://example.com | grep 'Location:'

若輸出為 302 並跳轉到未知站點,請勿繼續

防範技巧

  • 啟用兩步驟驗證:即使帳號被盜,還有第二道防線。
  • 不隨意點擊:對任何未經確認的連結保持懷疑。
  • 定期檢查帳號:查看是否有未授權的登入或交易。
  • 使用安全軟體:安裝可信賴的防毒與反詐騙插件。

小結

釣魚訊息的外表看似真實,但只要你保持警覺、遵循上述三招,並善用安全工具,就能大幅降低被騙風險。記得:先確認,再行動,安全永遠是第一位!

法律面向:釣魚案的追訴與賠償

「法律面向:釣魚案的追訴與賠償」這篇文章帶你從法律視角看網路釣魚的全貌,說明如何追查犯人、訴訟程序,以及受害者可得到的賠償權益。
不管你是自己被釣魚還是想預防未來風險,了解這些法律流程能讓你更安心,也幫助社會打擊網路詐騙。

1️⃣ 法律基礎:釣魚案的定義與刑事責任

網路釣魚,簡稱「釣魚」或「phishing」,是利用偽造的網站、電子郵件等手段,竊取使用者帳號或個資。依據《刑法》第300條及第301條,詐欺、侵佔或偽造財產之行為皆屬刑事犯罪,涉事者可能面臨三年以下有期徒刑、拘役或罰金。

2️⃣ 追訴流程:從報案到法院審理

1️⃣ 受害者先向警局或網路犯罪單位報案,警方將收集電子痕跡。
2️⃣ 調查單位(如警政署或金管局)會追蹤來源 IP、伺服器與受害者交易紀錄,必要時請求國際協助。
3️⃣ 依罪行情境,檢察官會決定是否起訴。若受害金額巨大或案件涉及跨境,往往會採取特別法規程序。
4️⃣ 受害者可在民事訴訟中主張損害賠償,若法院認定被告有侵權行為,將判決補償實際損失。

3️⃣ 賠償權益:受害者可申請哪些賠償?

【帳號被盜】若銀行發現異常交易,通常提供「免責賠償」與「補款」兩項。
【個資外洩】依《個人資料保護法》規定,業者須賠償因洩漏造成的精神損害及經濟損失。
【商業信用受損】若企業因釣魚案而失去客戶,亦可主張商譽損害賠償。

4️⃣ 國際合作:跨境釣魚案的法律挑戰

由於伺服器常設在境外,單一國家難以追查。為此,我們透過《刑事司法協助條例》與美、歐等國家簽訂互惠協議,請求協助扣押伺服器、取得憑證。
舉例來說:若台灣警方偵破一個位於俄羅斯的伺服器,需先向俄方提交「國際逮捕令」,並等待對等的協助。

5️⃣ 案例分享:實際追訴成功的典型案例

2022 年,台北地檢署以「網路釣魚」罪追訴 12 名被告,最終共有 6 人因被判刑、5 人被沒收財產。
在此案中,受害者透過「網路犯罪舉報平台」先行上報,警方迅速連結 3 個境外伺服器,並以「電子資料保全」法令取得關鍵證據。

6️⃣ 如何保護自己:不只是警惕眼神

1️⃣ 兩步驟驗證:不管是銀行、雲端或社群,永遠開啟 2FA。
2️⃣ 檢查網址:針對任何可疑連結,先滑鼠停留查看真正的域名。
3️⃣ 下載官方 App:盡量使用官方商店下載,避免「偽造」App 造成的釣魚。
4️⃣ 立即報案:發現帳號被盜或個資外洩,立刻向警方、金融監督管理委員會或個人資料保護專責單位報案,並保留截圖、訊息紀錄作為證據。

7️⃣ 小結:法律是最強防線

透過了解追訴流程、賠償條件與國際合作,我們不僅能在事後得到補償,更能在未來形成有效的預防與報案文化。
若你想進一步學習,歡迎參閱「台灣刑法」或「個人資料保護法」的官方網站,並持續關注最新的網路安全公告。

智能合約安全:從漏洞到攻擊

常見漏洞類型:重入、時間戳、IntOverflow

智能合約的安全性直接關係到投資者的財產與信任。雖然開發框架已經提供許多安全工具,但仍有三種漏洞——重入、時間戳依賴與整數溢位,經常被開發者忽略或誤用,導致可被利用的攻擊面。
本文將以輕鬆有趣的方式,拆解這三種常見漏洞:說明它們是什麼、為何容易被攻擊、如何寫出安全的程式碼,以及實際範例與防禦技巧,幫你在上線前先把這些漏洞「塞」進安全的馬桶。

常見漏洞類型概覽

以下列出三種最常見、也最容易被忽略的智能合約漏洞:

  • 重入(Reentrancy)
  • 時間戳依賴(Timestamp Dependency)
  • 整數溢位(IntOverflow / IntUnderflow)

1️⃣ 重入(Reentrancy)

什麼是重入?
當合約在完成一筆交易前,將控制權交給另一個合約或外部帳戶,而那個對方再回呼本身,導致同一筆交易被執行多次。

簡易範例(Vulnerable)

pragma solidity ^0.8.0;

contract VulnerableBank {
    mapping(address => uint256) public balances;

    function deposit() external payable {
        balances[msg.sender] += msg.value;
    }

    function withdraw(uint256 _amount) external {
        require(balances[msg.sender] >= _amount, "Insufficient balance");
        (bool sent, ) = msg.sender.call{value: _amount}("");
        require(sent, "Failed to send Ether");
        balances[msg.sender] -= _amount; // ← 重入點
    }
}

為什麼會被攻擊?
call{value} 先把 Ether 傳給外部帳戶,若該帳戶有 fallbackreceive 函式再次呼叫 withdraw(),就能在尚未扣除 balance 前重複提款。

防禦技巧

  1. 先修改 state,再發送錢
balances[msg.sender] -= _amount; // 先扣除
(bool sent, ) = msg.sender.call{value: _amount}("");
require(sent, "Failed to send Ether");
  1. 使用 ReentrancyGuard 或互斥鎖
import "@openzeppelin/contracts/security/ReentrancyGuard.sol";

contract SecureBank is ReentrancyGuard {
    // …
    function withdraw(uint256 _amount) external nonReentrant { /* … */ }
}

2️⃣ 時間戳依賴(Timestamp Dependency)

什麼是時間戳?
區塊鏈的 block.timestamp(或 now)代表礦工打包區塊時的時間,範圍大約 ±15 秒。

常見陷阱
依賴 block.timestamp 決定遊戲規則、利率或隨機數,礦工可微調時間來影響結果。

範例(Vulnerable)

pragma solidity ^0.8.0;

contract Lottery {
    address public owner;
    uint256 public deadline;
    address[] public participants;

    constructor(uint256 _duration) {
        owner = msg.sender;
        deadline = block.timestamp + _duration; // 只用時間戳
    }

    function enter() external payable {
        require(block.timestamp < deadline, "Lottery closed");
        participants.push(msg.sender);
    }

    // … 其它抽獎邏輯
}

防禦方法

  • 使用區塊號(block.number)作為定時
    deadlineBlock = block.number + _durationBlocks;
  • 限制時間範圍:在允許的 ±10 秒內判斷,減少礦工可調節空間。
  • 不要用時間戳做隨機數:採用更安全的隨機來源(如 Chainlink VRF)。

3️⃣ 整數溢位 / 欠位(IntOverflow / IntUnderflow)

概念說明
Solidity 0.8.x 已內建檢查,但舊版或自訂數學函式仍可能溢位。

範例(Vulnerable)

pragma solidity ^0.6.12;

contract Token {
    mapping(address => uint256) balances;
    uint256 totalSupply = 1000 * 10**18;

    function transfer(address _to, uint256 _value) public returns (bool) {
        if (balances[msg.sender] < _value) revert();
        balances[msg.sender] -= _value;
        balances[_to] += _value; // 可能溢位
        return true;
    }
}
```**如何避免?**1.**使用 OpenZeppelin 的 SafeMath(舊版 Solidity)**```solidity
using SafeMath for uint256;
balances[_to] = balances[_to].add(_value);

2.直接使用 Solidity 0.8.x 的安全檢查3.在測試階段使用 forge test --ffi 或 Hardhat 的 chai-as-promised 來驗證數學運算4.審計時檢查所有 add, sub 位置---

小結
漏洞 典型攻擊方式 防禦關鍵
重入 連續提款、資金被盜 行為先改 state → 發送錢;使用 ReentrancyGuard
時間戳依賴 礦工調整時間、隨機數被操縱 block.number 或限制 ±秒;避免時間戳做隨機
整數溢位 產生負值或過大 SafeMath 或 Solidity 0.8+ 安全檢查

提示:在開發過程中,務必使用自動化工具(Slither、MythX)和手動審計,確保合約在正式上鏈前不含上述漏洞。


參考資源

審計與測試:讓合約不再捉摸

在區塊鏈的世界裡,智能合約像是自動執行的契約,但它們背後也可能藏著漏洞。這篇文章會帶你從審計與測試的角度,了解如何把合約的風險降到最低。

在合約上線前,審計與測試就像是給它打開防盜門、加裝安全鎖。只有做好這兩件事,才能確保合約不會因為程式碼的小瑕疵而被駭客抓住機會。

審計與測試:讓合約不再捉摸

  • 目標
    • 確認合約行為符合設計
    • 發現漏洞與潛在攻擊面
為什麼審計重要
  • 合約一旦上鏈,變更成本高
  • 小小錯誤可能導致數百萬美金損失

審計流程概覽

1️⃣ 需求與規格確認
2️⃣ 靜態分析:使用工具掃描碼庫
3️⃣ 動態測試:在測試網路上執行合約
4️⃣ 安全評估報告:列出風險與修復建議

主要審計工具

工具 特色 認證度
MythX 支援 Solidity、Vyper 業界標準
Slither 產生靜態報告、可視化 開源
Echidna 隨機測試、模糊測試 專業級

測試方法實戰

// 範例:ReentrancyGuard 演示

pragma solidity ^0.8.0;

import "@openzeppelin/contracts/security/ReentrancyGuard.sol";

contract SafeBank is ReentrancyGuard {
    mapping(address => uint256) public balance;

    function deposit() external payable {
        balance[msg.sender] += msg.value;
    }

    function withdraw(uint256 _amount) external nonReentrant {
        require(balance[msg.sender] >= _amount, "Insufficient");
        (bool sent, ) = msg.sender.call{value: _amount}("");
        require(sent, "Failed");
        balance[msg.sender] -= _amount;
    }
}
  • 重入測試:利用 call 模擬攻擊
  • 時間戳依賴:確保 block.timestamp 不能被預測
  • 權限控制:檢查 onlyOwner、角色管理

案例回顧

  • Parity 多重簽名錢包漏洞:缺失權限檢查,導致 1500 萬美元被凍結
  • The DAO:重入點未保護,造成 3.6 億美元損失

最佳實踐

  • 最小權限原則:合約只賦予必要的功能
  • 白盒與黑盒結合:同時進行靜態與動態測試
  • 持續監控:部署後即時追蹤交易異常

進一步閱讀

未來展望:自動化審計與多簽保護

在智能合約的世界裡,漏洞與攻擊像隱形的暗礁,讓開發者不斷尋找更安全的航道。未來的趨勢則聚焦於自動化審計與多簽保護,兩大技術結合為區塊鏈安全注入全自動、分散式的力量。

本文將帶你從審計流程的自動化工具說起,探討多簽方案如何增強資金安全,最後預測這些技術在 Web3 生態系統中的長遠影響。

自動化審計:從手工到機器學習

隨著合約規模與複雜度攀升,手工審計已經無法滿足速度與覆蓋率的需求。自動化審計工具透過靜態分析、符號執行以及 AI 模型,能夠在數分鐘內掃描出千餘個潛在缺陷。

  • Slither:開源靜態分析框架,支援多種安全檢查。
  • MythX:雲端化審計服務,結合靜態與動態分析。
  • Echidna:以 fuzzing 為核心的安全測試工具,適用於快速迭代。
# 執行 Slither 以列出所有可疑點
slither ./contracts/MyContract.sol --fail-on-warning
// 範例合約:簡單的存款與提款功能
pragma solidity ^0.8.20;
contract SimpleBank {
    mapping(address => uint256) public balances;

    function deposit() external payable {
        balances[msg.sender] += msg.value;
    }

    function withdraw(uint256 amount) external {
        require(balances[msg.sender] >= amount, "Insufficient balance");
        balances[msg.sender] -= amount;
        payable(msg.sender).transfer(amount);
    }
}

多簽保護:分散風險的金鑰堡壘

多簽(Multi‑Sig)合約要求多個私鑰共同批准交易,降低單點失誤或竊盜的風險。現行主流多簽方案不僅支援簡易投票機制,還加入了權限分級、延遲執行與回復功能。

  • Gnosis Safe:最常見的多簽錢包,支援擴充模組與社群治理。
  • Argent:以使用者體驗為主,提供日常多簽功能與安全提示。
  • OpenZeppelin Defender:結合自動化腳本與多簽控制,適用於開發團隊。
// 範例多簽合約(簡化版)
pragma solidity ^0.8.20;
contract MultiSigWallet {
    address[] public owners;
    uint256 public requiredConfirmations;

    struct Transaction {
        address destination;
        uint256 value;
        bool executed;
    }

    Transaction[] public transactions;
    mapping(uint256 => mapping(address => bool)) public confirmations;

    modifier onlyOwner() {
        bool isOwner = false;
        for (uint256 i; i < owners.length; i++) {
            if (msg.sender == owners[i]) { isOwner = true; break; }
        }
        require(isOwner, "Not an owner");
        _;
    }

    function submitTransaction(address dest, uint256 val) external onlyOwner returns (uint256 txIndex) {
        txIndex = transactions.length;
        transactions.push(Transaction({destination: dest, value: val, executed: false}));
    }

    function confirmTransaction(uint256 txIndex) external onlyOwner {
        require(!confirmations[txIndex][msg.sender], "Already confirmed");
        confirmations[txIndex][msg.sender] = true;
    }

    function executeTransaction(uint256 txIndex) external onlyOwner {
        require(!transactions[txIndex].executed, "Already executed");
        uint256 count = 0;
        for (uint256 i; i < owners.length; i++) {
            if (confirmations[txIndex][owners[i]]) count++;
        }
        require(count >= requiredConfirmations, "Not enough confirmations");

        transactions[txIndex].executed = true;
        (bool success, ) = transactions[txIndex].destination.call{value: transactions[txIndex].value}('');
        require(success, "Transaction failed");
    }
}

未來展望:結合 AI 與多簽的安全新紀元

自動化審計與多簽保護並非獨立運作;未來的安全框架將把兩者無縫串聯,形成「審計即執行」的全流程保護。

特色 手工審計 自動化審計 多簽保護
速度 小時至數天 秒級 按需執行
覆蓋率 受限於人力 高達 90%+ 輕量化
危險點 人為疏漏 準確率依賴模型 私鑰管理
互補性 - 識別缺陷、生成建議 防止單點失誤

結合 AI 驅動的自動化審計與多簽機制,可在發佈前即完成「安全驗證」與「資金保護」,大幅降低攻擊成本。Web3 生態隨著分散式金融與 NFT 需求擴張,這種全自動、分散式安全模型將成為標準。

欲深入了解 Solidity 的最佳實踐與審計工具,歡迎參閱官方文件: