官术网_书友最值得收藏!

2.6.2 輸入驗證

緩解緩沖區溢出的最好方式是防止它們。要做到這點需要開發人員來防止字符串或內存拷貝溢出他們的目標緩沖區。可以通過確保輸入數據不超過用來存儲它的最小的緩沖區的大小來防止緩沖區溢出。例2.15是一個簡單的執行輸入驗證的函數。

例2.15 輸入驗證


1  void f(const char *arg) {
2   char buff[100];
3   if (strlen(arg) >= sizeof(buff)) {
4     abort();
5   }
6   strcpy(buff, arg);
7   /* ... */
8  }

任何到達某個跨越信任邊界的程序接口的數據都需要驗證。這類數據的例子包括main()函數的argv和argc參數、環境變量,以及從套接字、管道、文件、信號、共享內存和設備中讀取的數據。

雖然這個例子只涉及字符串的長度,但還有許多其他類型的驗證可以執行。例如,要被發送到SQL數據庫的輸入,將需要驗證,以檢測和防止SQL注入攻擊。如果輸入最終可能會跳到一個網頁,那么它也應該被驗證,以防止跨站點腳本(Gross-Site Scripting XSS)攻擊。

幸運的是,輸入驗證適用于所有類別的字符串漏洞,但它需要開發人員正確識別和驗證可能會導致緩沖區溢出或其他漏洞的所有外部輸入。因為這個過程很容易產生錯誤,為謹慎起見,這個緩解策略通常需要與其他策略(例如,用更安全的函數替換可疑的函數)結合使用。

主站蜘蛛池模板: 龙门县| 揭东县| 疏附县| 方城县| 即墨市| 华安县| SHOW| 雅江县| 京山县| 彭泽县| 天水市| 西昌市| 永泰县| 广河县| 公安县| 方山县| 株洲县| 蒲城县| 河曲县| 华容县| 游戏| 栖霞市| 西昌市| 卓资县| 磐安县| 平江县| 措勤县| 尼玛县| 新乡市| 兴文县| 沾益县| 德格县| 攀枝花市| 花莲县| 仙居县| 宝应县| 富顺县| 瓮安县| 城固县| 六盘水市| 剑阁县|