2019寒假訓練營第二次做業

學習視頻課程(20')

  • 學習福州大學網絡課程 網絡空間安全概論,造成學習筆記,發佈專門博客,至少完成第一章、第四章的視頻學習。
  • 或學習密歇根大學的網絡課程Internet history,造成學習筆記,另外發布專門的博客。至少完成第一週的視頻學習。
  • 以上兩門課程二選一便可。

博客地址:http://www.javashuo.com/article/p-hzgqbpox-gp.htmlhtml


程序題(80'+50')

背景

大學期間,你老是點子不少,你利用申請的專利,開了一家互聯網公司,爲客戶提供高效、快捷的服務。有一天,訂單量忽然大漲,欣喜之餘,祕書卻告訴你,今天的營業額跌到谷底,客服電話被打爆。你發現,看似不少的訂單請求,其實只是給你發了一個「hello」而已,服務器忙於應付大量的hello, 已經沒辦法給原有用戶提供正常的服務了,基本處於癱瘓的狀態。通過討論,多是受到了黑客的DDos(分佈式拒絕服務)攻擊。黑客經過發送大量的無用的請求信息,佔用你的服務器資源,讓服務器無法給用戶提供正常的服務。c++

作法

當務之急,是先恢復服務器,把攻擊你的黑客都拉進黑名單,讓服務器不要理會這些請求。第一步,就是要把黑客檢測出來。你須要對請求進行審查,找出其中有問題的請求,而後把發送方拉黑。這些請求長這個樣子:發送方的名字由4個小寫英文字母組成,後面跟着接收方和請求信息的大小,你能夠經過請求信息的大小推測請求的內容。git

表格

你的服務器就是那個可憐的Bob,而發送方有不少,有的是普通用戶,而有的就是黑客了。很明顯,黑客在短期給你發了大量的信息,發送方中的 abcd 就頗有多是黑客,由於他在短期內給你發了不少信息量很小的請求(64,極可能只有hello),並且這些請求值總值已經超過了1500。本着寧錯殺一千,不放過一個的原則,只要總的請求信息的大小超過T=1500,就把它拉黑。github

描述

編程語言不限編程


熱身題(20')

學習基本的文件讀寫
讀提供的文件Request.txt
把裏面的內容寫到output.txt安全

基本題(60')

根據提供請求的輸入Request.txt,把全部請求和對應的信息大小都存下來。
統計每一個發送方的總請求大小S,S超過T的就認定爲黑客,把他們的名字存進你的黑名單裏。
輸出黑客的個數,和這些黑客的名字。
例如:示例中有28個請求,其中abcd發了25個請求,這些請求的總和S是1600>1500=T,因此abcd被認爲是黑客,就把abcd加到你的黑名單裏去。服務器

開放題(50')

如今你已經暫時恢復了服務。但你發現,1的方法很笨,例如:把全部請求都存下來,再統計總值,花費了你大量的存儲空間。這裏麪包含了不少沒必要要的操做,有不少缺點。
吐槽1方法,找到這個方法的問題。給出你的方法,不必定是完美的,說出方法的優缺點,只要能自圓其說。(能夠從速度、佔用的空間、準確率等方面思考)
選作:實現你的方法。網絡


輸入:
名字和信息大小用一個空格隔開,每條信息用一個換行隔開編程語言

lhyy bob 100
hzrr bob 700
cyxx bob 364
lhyy bob 700
lhyy bob 800
zzyy bob 300
zzyy bob 800
zzyy bob 600

輸出:
第一行輸出黑客的總個數,第二行輸出黑客名,每一個黑客名用一個換行隔開分佈式

2
lhyy
zzyy

實現思路:

  • 使用C++中stl庫的map,定義map<string, int> request_sum記錄每一個發送方向服務器提交的總請求大小。
  • 讀取全部的請求,加入request_sum中。
  • 遍歷request_sum,輸出記錄值大於T的用戶。

思路改進(開放題):

  • 注意到,若是黑客發送的信息總量大於int時會致使程序崩潰
  • 改進策略:一、開大數據範圍(治標不治本)二、忽略記錄總值大於T的發送請求
  • 所以咱們採用方法2,方法2的優點:
    • 減小服務器須要存儲的數據,保證每一個用戶的數據量不大於T
    • 經過動態調整T的大小,減小誤殺提升準確度。
    • 避免了大量數據的讀取,節省了時間。
  • 第二個問題是,有的雖然只提交了一兩次請求但數據量大於T的發送方會被「誤殺」,「錯殺一千」可能就錯過了重要的訂單。
  • 改進策略:新建map<string, int> request_max記錄每一個發送方向服務器提交的最大單次請求大小。
  • 當記錄總值大於T且最大單次大小小於M時,忽略該發送請求。減小誤殺提升準確度。
  • 缺點:黑客發送一次數據量大等於M的請求,便可繞開後續檢測。

實現代碼:

#include<bits/stdc++.h>
using namespace std;

const int T=1500;

int main(){
    freopen("Request.txt","r",stdin);
    freopen("output.txt","w",stdout);
    
    map<string, int> request_sum;
    
    string request_name,server_name;
    int request_num,blacklist_size=0;
    
    while (cin>>request_name>>server_name>>request_num)
    {
        if (request_sum[request_name]<=T)
        {
            request_sum[request_name]+=request_num;
            if (request_sum[request_name]>T)
            {
                blacklist_size++;
            }
        }
    }
    
    map<string, int>::iterator it;
    
    printf("%d\n",blacklist_size);
    for (it=request_sum.begin(); it!=request_sum.end(); it++)
    {
        if ((it->second)>T)
        {
            cout<<it->first<<'\n';
        }
    }
    
    fclose(stdin);
    fclose(stdout); 
    return 0;
}

GitHub:https://github.com/Echohat/031802319/tree/master/second

相關文章
相關標籤/搜索