作法:啟用訊息重新執行偵測
當攻擊者複製兩方之間的訊息資料流,並且對其中一方或多方重新執行資料流時,即表示發生重新執行攻擊。 除非緩解攻擊,否則受到攻擊的電腦會將資料流當成合法訊息來處理,導致發生一連串負面的影響,例如項目的重複排序。
如需偵測訊息重送攻擊的詳細資訊,請參閱偵測訊息重送攻擊。
下列程序示範使用 Windows Communication Foundation (WCF) 時,可用來控制偵測重送攻擊的各種屬性。
若要透過程式碼在用戶端上控制重新執行偵測
建立用於 SecurityBindingElement 的 CustomBinding。 如需詳細資訊,請參閱操作說明:使用 SecurityBindingElement 建立自訂繫結。 下列範例會使用 SymmetricSecurityBindingElement (使用 CreateKerberosBindingElement 類別的 SecurityBindingElement 來建立)。
請使用 LocalClientSettings 屬性將參照傳回 LocalClientSecuritySettings 類別,並在必要時設定下列任何一個屬性:
DetectReplay
. 布林值。 它將控制用戶端是否應該偵測來自伺服器的重新執行。 預設值為true
。MaxClockSkew
. TimeSpan 值。 控制在用戶端與伺服器之間重新執行機制可容許的時間誤差。 安全性機制會檢查傳送的時間戳記並判斷它是否已經傳送出去太久了。 預設值是 5 分鐘。ReplayWindow
.TimeSpan
值。 它會控制訊息在經由伺服器傳送出去 (透過媒介) 並在抵達用戶端之前,可以在網路中存留的時間長短。 用戶端會追蹤於最近ReplayWindow
傳送的訊息簽章,以利進行重新執行偵測。ReplayCacheSize
. 整數值。 用戶端會將訊息簽章儲存到快取中。 這項設定將指定快取可以儲存的簽章數量。 如果最近一次重新執行視窗中傳送的訊息數量到達快取上限,則會等到最早的快取簽章抵達時間限制才會開始接受新的訊息。 預設值為 500000。
若要透過程式碼在服務上控制重新執行偵測
建立用於 SecurityBindingElement 的 CustomBinding。
請使用 LocalServiceSettings 屬性將參照傳回 LocalServiceSecuritySettings 類別,然後如先前所述設定屬性。
若要透過組態來控制用戶端或服務的重新執行偵測
建立 <customBinding>。
建立
<security>
項目。必要時設定
detectReplays
、maxClockSkew
、replayWindow
,和replayCacheSize
的屬性值。 下列範例將同時設定<localServiceSettings>
<localClientSettings> 和<localClientSettings>
項目的屬性。<customBinding> <binding name="NewBinding0"> <textMessageEncoding /> <security> <localClientSettings replayCacheSize="800000" maxClockSkew="00:03:00" replayWindow="00:03:00" /> <localServiceSettings replayCacheSize="800000" maxClockSkew="00:03:00" replayWindow="00:03:00" /> <secureConversationBootstrap /> </security> <httpTransport /> </binding> </customBinding>
範例
下列範例將使用 SymmetricSecurityBindingElement 方法來建立 CreateKerberosBindingElement,並設定繫結的重新執行屬性。
private SecurityBindingElement CreateSymmetricBindingForClient()
{
SymmetricSecurityBindingElement b = SecurityBindingElement.CreateKerberosBindingElement();
b.LocalClientSettings.DetectReplays = true;
b.LocalClientSettings.MaxClockSkew = new TimeSpan(0, 3, 0);
b.LocalClientSettings.ReplayWindow = new TimeSpan(0, 2, 0);
b.LocalClientSettings.ReplayCacheSize = 10000;
return b;
}
Private Function CreateSymmetricBindingForClient() As SecurityBindingElement
Dim b = SecurityBindingElement.CreateKerberosBindingElement()
With b.LocalClientSettings
.DetectReplays = True
.MaxClockSkew = New TimeSpan(0, 3, 0)
.ReplayWindow = New TimeSpan(0, 2, 0)
.ReplayCacheSize = 10000
End With
Return b
End Function
重新執行範圍:僅限訊息安全性
請注意,下列程序僅適用訊息安全性模式。 在 [傳輸] 與 [使用訊息認證的傳輸] 模式中,傳輸機制會偵測重新執行。
安全對話提示
針對可啟用安全對話的繫結,您可以同時對應用程式通道,以及安全對話啟動安裝繫結調整這些設定。 例如,您可以關閉應用程式通道的重新執行,但卻針對可建立安全對話的啟動安裝繫結加以啟用。
如果您並未使用安全對話工作階段,重新執行偵測將無法保證在伺服器陣列案例以及處理序回收期間偵測重新執行。 此情況適用下列系統提供的繫結:
WSHttpBinding,EstablishSecurityContext 屬性設定為
false
。
編譯程式碼
要編譯程式碼時,必須有下列命名空間: