指令碼侵入概述和防止指令碼侵入

2021-04-15 00:11:46 字數 2423 閱讀 8078

從瀏覽器的角度來看,網頁只是乙個長字串。瀏覽器會按順序處理這個字串,在此過程中,會顯示某些字元,同時按特殊規則解釋其他字元(如和 )。如果惡意使用者可以將某些特殊字元插入到頁中,則瀏覽器將不知道這些字元不應該處於該位置,將作為頁的一部分處理它們。

4、當第二個使用者的瀏覽器顯示此頁時,它將遇到 塊並執行它。

惡意使用者還可以使用其他方法來利用指令碼。大多數指令碼利用都會要求應用程式接受惡意輸入,並將其插入到頁中(或回顯它),瀏覽器將在該頁中執行它。這種利用帶來的潛在損害取決於所執行的指令碼。它可以是無足輕重的,如在瀏覽器中彈出的煩人的訊息。但是,它也可能會竊取 cookie、竊取使用者輸入(如密碼),甚至在使用者的計算機上執行本機**(如果對 internet 安全性的要求不嚴格),從而造成嚴重的損害。

有關防止指令碼利用的資訊,請參見如何:通過對字串應用 html 編碼在 web 應用程式中防止指令碼侵入。

sql 語句利用

有一種指令碼利用的變體可以導致惡意 sql 語句的執行。如果應用程式提示使用者輸入資訊並將使用者的輸入串聯為表示 sql 語句的字串,則會出現這種情況。例如,應用程式可能提示輸入客戶姓名,目的是為了執行類似如下的語句:

複製**

"select * from customers where customername = " & txtcustomername.value

但是,對資料庫有所了解的惡意使用者可能使用文字框輸入包含客戶姓名的嵌入式 sql 語句,產生類似如下的語句:

複製**

select * from customers where customername = 'a' delete from customers where customername > ''

執行該查詢時,就會危害資料庫。

防止指令碼利用

防止指令碼利用的主要方法就是決不信任來自使用者的資訊。假定從瀏覽器傳送到您的應用程式的任何資料都包含惡意指令碼。

同樣,每次將字串寫入頁時,您都應該假定字串可能包含惡意指令碼(除非您自己以程式設計方式建立了字串)。例如,在從資料庫中讀取字串時,您應該假定它們可能包含惡意指令碼。安全意識很強的開發人員甚至不信任他們自己的資料庫,理由是他們認為惡意使用者可能有辦法篡改資料庫。

asp.net 為您提供了幾種有助於防止指令碼利用的方法:

asp.net 對查詢字串、窗體變數和 cookie 值執行請求驗證。預設情況下,如果當前的 request 包含 html 編碼的元素或某些 html 字元(如表示長破折號的 —),則 asp.net 頁框架將引發乙個錯誤。

如果要在應用程式中顯示字串,但不信任這些字串,可以在響應中回寫字串時將 html 編碼應用於這些字串。例如,進行編碼後,標記將變成。如果您要顯示的字串來自您尚未確定信任其內容的資料庫時,您可能會這樣做。

如果希望應用程式接受某個 html(例如,來自使用者的某些格式設定說明),那麼,在將這個 html 提交給伺服器之前,應在客戶端對其進行編碼。

為了防止 sql 語句利用,決不能串聯字串建立 sql 查詢。相反,使用引數化查詢並將使用者輸入分配給引數物件。有關詳細資訊,請參見資料介面卡命令中的引數。

始終對一組預期值執行窗體輸入驗證以及字串格式設定/型別驗證。例如,如果特定的窗體變數應為整數,則使用 system.int32.tryparse 方法驗證該值是否確實為整數,並使用範圍檢查幫助確保該值位於可接受範圍內。

大多數指令碼利用發生在使用者可以將可執行**(或指令碼)插入您的應用程式時。預設情況下,asp.net 提供請求驗證。只要窗體傳送包含任何 html,該驗證都會引發錯誤。

您可以使用下列方法防止指令碼利用:

對窗體變數、查詢字串變數和 cookie 值執行引數驗證。該驗證應包括兩種型別的驗證:可以將變數轉換為所需型別(如轉換為整數、日期時間等)的驗證,以及所需範圍或格式的驗證。例如,應該使用 system.int32.tryparse 方法來檢查應為整數的窗體傳送變數,以驗證該變數是否確實為整數。而且,還應該檢查得到的整數,以驗證該值是否在所需值範圍之內。

將值寫回響應時,向字串輸出應用 html 編碼。這有助於確保使用者提供的所有字串輸入將以靜態文字形式呈現在瀏覽器中,而不是呈現為可執行的指令碼**或已解釋的 html 元素。

html 編碼使用 html 保留字元轉換 html 元素,以便顯示它們而不是執行它們。

向字串應用 html 編碼

顯示字串之前,呼叫 htmlencode 方法。html 元素會轉換為瀏覽器將顯示(而不解釋為 html)的字串表示形式。

下面的示例說明 html 編碼。在第乙個例項中,在顯示使用者輸入之前對其進行編碼。在第二個例項中,在顯示資料庫中的資料之前對其進行編碼。

注意 

只有通過新增 @ page 屬性 validaterequest="false" 在頁中禁用請求驗證時,此示例才起作用。建議不要在成品應用程式中禁用請求驗證,因此,請確保在檢視本示例之後重新啟用請求驗證。

private void button1_click(object sender, system.eventargs e)

防止全域性鉤子的侵入

windows訊息鉤子一般都很熟悉了。它的用處很多,耳熟能詳的就有 利用鍵盤鉤子獲取目標程序的鍵盤輸入,從而獲得各類密碼以達到不可告人的目的。朋友想讓他的軟體不被別人的全域性鉤子監視,有沒有辦法實現呢?答案是肯定的,不過缺陷也是有的。首先簡單看看全域性鉤子如何注入別的程序。訊息鉤子是由win32子系...

防止全域性鉤子的侵入

防止全域性鉤子的侵入 windows訊息鉤子一般都很熟悉了。它的用處很多,耳熟能詳的就有 利用鍵盤鉤子獲取目標程序的鍵盤輸入,從而獲得各類密碼以達到不可告人的目的。朋友想讓他的軟體不被別人的全域性鉤子監視,有沒有辦法實現呢?答案是肯定的,不過缺陷也是有的。首先簡單看看全域性鉤子如何注入別的程序。訊息...

侵入式和非侵入式的區別

簡單說一下我的理解吧。假設大家都想要把使用者 塞到乙個框架裡。侵入式的做法就是要求使用者 知道 框架的 表現為使用者 需要繼承框架提供的類。非侵入式則不需要使用者 引入框架 的資訊,從類的編寫者角度來看,察覺不到框架的存在。例如 使用struts的時候,我需要繼承一些struts的類,這時strut...