隨著B/S模式套用開發的發展,使用這種模式編寫應用程式的程式設計師也越來越多。但是由於程式設計師的水平及經驗也參差不齊,相當大一部分程式設計師在編寫代碼的時候,沒有對用戶輸入數據的合法性進行判斷,使應用程式存在安全隱患。
基本介紹
- 中文名:代碼注入
- 實質:用戶可以提交一段資料庫查詢代碼
- 對象:應用程式的程式設計師
- 目的:獲得某些他想得知的數據
定義,代碼注入的用途,蓄意的用途,非蓄意的用途,避免代碼注入,
定義
用戶可以提交一段資料庫查詢代碼,根
據程式返回的結果,獲得某些他想得知的數據,這就是所謂的SQL Injection,即SQL注入。
代碼注入的用途
蓄意的用途
惡意使用
惡意用途的代碼注入可包括:
- 透過SQL注入(見下文)隨意修改資料庫中的值。影響所及可從某網站外觀損毀,到對敏感數據嚴重的破壞。
- 當用戶拜訪惡意網站時,透過網頁瀏覽器或其外掛程式的漏洞安全隱患,進行代碼注入,以便安裝流氓軟體到用戶機器上。
- 透過PHP或者ASP注入安裝流氓軟體或者運行惡意代碼於服務端。
- 於視窗系統利用Shell注入安全隱患對系統服務做手腳,達成提權到本地端系統使用許可權的目的。
- 從網頁瀏覽器利用HTML/腳本注入(跨網站腳本)進行連線竊取 / cookies竊取進而冒充他人,獲取他人個人敏感數據。
善意使用
某些人可能會出於善意而使用代碼注入。例如,透過代碼注入以改變或者調試某程式或者系統的行為可以"擺弄"系統以某種方式表現其行為而不懷任何惡意。打比方說:
- 代碼注入可以添入某原本搜尋結果頁面設計上沒有的欄位,方便用戶。
- 透過對原本設計默認函式沒有曝光的欄位賦值,代碼注入可提供一個全新的方式來過濾、排序、或者歸類數據。
這些人訴諸此種替代手段大致是下面幾種原因之一:
- 對軟體中希望改進函式進行潤飾的其他方法證明不可能,或者
- 其他對軟體修改的方式代價過高,或者
- 其他對軟體修改的方式過度艱苦。
一般開發社群對以此為目的的代碼注入不表歡迎。他們稱這種行為為三腳貓、半調子、或者駭 / 黑程式。(kludge or hack)
某些開發者允許或者甚至表揚代碼注入的使用來“加強”他們的軟體;通常是因為該方案提供了較不昂貴的方式來實現新的或者特殊化的功能。不幸的是,其副作用與無法列管的蘊含式可能相當危險。
一般來說,即使相當善意的代碼注入使用都不被建議使用。
非蓄意的用途
某些用戶可能會不經意的進行代碼注入,因為他們對程式提供的輸入,沒列在當初開發系統者的考慮中。例如:
- 用戶可能視某個包含表示字元或者字元字元串為合法輸入,而不知該字元被開發者所保留而有特殊意義 (像 "張三 & 李四" 里的 "&" 字元,或者英文約翰的 M&M 朱古力: "John's M&M's"裡頭的單引號)。
- 用戶可能會提交格式錯亂的檔案做為輸入。這種行為對單一程式沒什麼問題,但可能對整個接收系統是災難。
避免代碼注入
要避免代碼注入的種種問題,得充分發揮輸入輸出處理保全,例如:
- 輸入確認。
- 更換危險字元。例如在PHP透過addslashes()函式保護SQL注入。
- 輸入編碼。
- 輸出編碼。
- 採用其他沒有飽受代碼注入漏洞困擾的編程實現,例如“參數化SQL查詢” ("parameterized SQL queries" 又名 "prepared statements" 亦有時稱 "bind variables")