C# 如何防止重放攻擊

来源:http://www.cnblogs.com/similar/archive/2017/05/05/6776921.html
-Advertisement-
Play Games

重放攻擊 重放攻擊是指黑客通過抓包的方式,得到客戶端的請求數據及請求連接,重覆的向伺服器發送請求的行為。 比如你有一個 “購買” 的操作,當你點擊購買按鈕時,向伺服器發送購買的請求。而這時黑客對你的請求進行了抓包,得到了你的傳輸數據。 因為你填寫的都是真實有效的數據,是可以購買成功的,因此他不用做任 ...


重放攻擊

      重放攻擊是指黑客通過抓包的方式,得到客戶端的請求數據及請求連接,重覆的向伺服器發送請求的行為。 比如你有一個 “購買” 的操作,當你點擊購買按鈕時,向伺服器發送購買的請求。而這時黑客對你的請求進行了抓包,得到了你的傳輸數據。 因為你填寫的都是真實有效的數據,是可以購買成功的,因此他不用做任何改變,直接把你的數據再往伺服器提交一次就行了。這就導致了,你可能只想購買一個產品的,結果黑客重放攻擊,你就購買了多次。如果是用戶操作的話,肯定就會莫名奇妙:怎麼購買了那麼多同樣的產品,我只買了一個啊? 所以,重放攻擊的危害還是挺大的,特別是涉及到金錢交易時,因此防重放攻擊在電商項目中是必不可少的。

 

解決方案

時間戳(tamp) + 數字簽名(sign)。 也就是說每次發送請求時多傳兩個參數,分別為 tamp 和 sign。比如

原先請求為 http://127.0.0.1/api/buyproduct

修改之後為 http://127.0.0.1/api/buyproduct?tamp=1403149835&sign=945bf36r046bd84df2985ad625c9f92415eccd1w

      數字簽名的作用是為了確保請求的有效性。因為簽名是經過加密的,只有客戶端和伺服器知道加密方式及Key,所以第三方模擬不了。我們通過對sign的驗證來判斷請求的有效性,如果sign驗證失敗則判定為無效的請求,反之有效。 但是數字簽名並不能阻止重放攻擊,因為黑客可以抓取你的tamp和sign(不需做任何修改),然後發送請求。這個時候就要對時間戳進行驗證。

      時間戳的作用是為了確保請求的時效性。我們將上一次請求的時間戳進行存儲,在下一次請求時,將兩次時間戳進行比對。如果此次請求的時間戳和上次的相同或小於上一次的時間戳,則判定此請求為過時請求,無效。因為正常情況下,第二次請求的時間肯定是比上一次的時間大的,不可能相等或小於。

      有人會問,我直接用時間戳不就行了,為什麼還要數字簽名?因為黑客可能對請求進行抓包,然後修改時間戳為有效的時間戳值。我們的數字簽名採用 tamp+key 進行組合加密,即使黑客修改了 tamp ,但是由於黑客不知道key,所以 sign 驗證這步就成功的阻止了黑客的請求。

 

實例代碼

加密方式採用 SHA1,SHA1加密方法進行了封裝,寫成了string的擴展方法。

/// <summary>
/// 數字簽名
/// </summary>
/// <param name="tamp">時間戳(由客戶端傳入)</param>
 /// <param name="key">Key</param>
/// <returns></returns>
private string Sign(string tamp, string key)
{
      string txt = tamp + "|" + key; //在每個參數中間加了個 "|" ,增加複雜度
      string sign = txt.GetSha1();
      return sign;
}

 

驗證方法, 客戶端的加密方式和服務端是一樣的,如果兩者的加密結果不一致,則驗證失敗。 如果客戶端是js,一定要對js做代碼混淆,禁止右鍵等。因為我是用Session存儲上一次請求的時間戳的,而Session是會過時的,當Session過時時黑客再進行攻擊,就會得手,所以限制請求有效期為30秒。

/// <summary>
/// 檢查請求是否有效,防重放
/// </summary>
/// <param name="tamp">時間戳(由客戶端傳入)</param>
/// <param name="key">Key</param>
/// <param name="sign">驗簽(由客戶端傳入)</param>
/// <returns></returns>
private bool CheckRequest(string tamp, string key, string sign)
{
     //驗簽(比對客戶端的加密結果和服務端的加密結果,如果不相等,則驗簽失敗)
     if (sign.ToUpper() != Sign(tamp, key).ToUpper()) return false;

     //得到當前時間戳
     DateTime DateStart = new DateTime(1970, 1, 1, 8, 0, 0);
     int nowTamp = Convert.ToInt32((DateTime.Now - DateStart).TotalSeconds);
   if ((nowTamp - int.Parse(tamp)) > 30) return false; //因為Session可能過時,所以限定請求有效時間為30秒

//
得到上一次的時間戳 string prevTamp = Session["tamp"] as string;
//判斷是否為空,為空說明是第一次請求
if (!string.IsNullOrWhiteSpace(prevTamp)) { if (int.Parse(tamp) > int.Parse(prevTamp)) { Session["tamp"] = tamp; return true; } else { return false; } } else { Session["tamp"] = tamp; return true; } }

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • C#獲取操作系統相關的信息,如記憶體大小,CPU大小,機器名,環境變數等操作系統軟體、硬體相關信息 ...
  • 效果圖: 大致代碼: 1 <script type="text/javascript"> 2 $(function () { 3 LoadOrderDetailList(); 4 }); 5 function AddToOrderDetailInfo() { 6 $("#AddToOrderDeta ...
  • 1.8.0更新的內容有 破壞性更新 更新ZKWeb.System.Drawing到3.0.0 請修改源代碼中的 到`System.DrawingCore` 現在已經不再需要使用 選項,因為使用這個選項也不能完全防止衝突 一般更新 添加IActionParameterProvider 可以自定義獲取a ...
  • MVC HtmlHelper擴展類(PagingHelper) 後臺Controller代碼 前臺頁面代碼 最終效果圖: 作者:長毛象 微博:http://weibo.com/5567742196/info 博客:http://www.cnblogs.com/xiangyisheng/ 本文版權歸作 ...
  • 練習使用angularjs實現一個select下拉列表: <div ng-app="selectApp" ng-controller="selectController"> <select ng-model="mySelect" ng-options="sd for sd in selectData ...
  • https://developer.xamarin.com/samples/xamarin-forms/Navigation/MasterDetailPage/ https://blog.xamarin.com/material-design-for-your-xamarin-forms-andro... ...
  • /// <summary> /// 加密 /// </summary> /// <param name="Text"></param> /// <returns></returns> public static string Encrypt(string Text) { return Encrypt ...
  • C 訪問修飾符 分類 C 訪問修飾符一共有五種,分別為private, internal, protected, protected internal, public。 它們都可以用來修飾類中的成員,如欄位,屬性,方法,事件等。對於修飾class,enum,struct,嵌套類,及其各自預設修飾符的 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...