Tech Days 2009 筆記 (三) 上集
3 |
【SQL Execution Plan】
關心執行計畫的時機:
- CPU異常飆高,持續在100%高檔完全掉不下來
- 效能不佳,想了解指令執行的作業過程
select * from master.dbo.sysprocesses <-- 找出最忙的SPID
dbcc inputbuffer(SPID) <-- 查出有問題的指令是什麼?
[註: 若SSMS Activity Monitor還可以用,則用GUI查更方便]
<DEMO> 90萬筆對300筆基本資料,ORDER BY 1 -> 13秒,無ORDER BY 1秒,看執行計劃。[註: 展示時用的好像是電信業者的真實資料(有出現"門號"、"申裝書類別"、"銷售點代號"字樣),Query Result Grid一直被小心地遮起來,雖然講師一直強調這是"學員資料",嘿...] 示範用SSMS Include Actual Execution Plan功能,突顯Sort佔了73%成本。
Display Estimated Execution Plan –> 實際執行可能要30分鐘,可以先預測取得執行計劃。
改善Execution Plan:
- 效率: Index Seek > Index Scan > Table Scan (一般原則,非絕對)
- 減少Bookmark(RID or KEY) lookups使用(少用IN)
- SSMS檢視Estimated Execution Plan時就可以提示Missing Index
工具: Database Engine Tuning Advisor,自動找出某個查詢的瓶頸所在,並提供修改建議。
Notes: 對大型資料表建立INDEX會造成資料暫時無法存在取,在Production環境中不可以亂來。
Execution Plan的取得: SSMS圖形顯示(按右鍵可以匯出XML)、SET SHOWPLAN_TEXT ON、SET SHOWPLAN_XML ON(在SSMS裡點擊該XML內容會以圖形方式顯示)。SQL 2008有Programmability/Plan Guides可以用來保存Execution Plan。Keywords: sp_create_plan_guide
Tips: SELECT ... FROM ... WHERE ... OPTION(USE PLAN N'<ShowPlanXML …. >’) 強迫使用某個執行計畫。OPTION (LOOP JOIN), OPTION(MERGE JOIN), OPTION(HASH JOIN) 一般來說SQL最佳化的結果真的都已是"最佳",不太需要另外加提示,除非是用來測試,或是真遇上罕見的異常特例。
TABLE HINT: WITH (NOLOCK), WITH (READPAST) <--正在修改中的不要讀,還提到了Snapshot Isolation
意外收獲: 學會在XML Attribute裡怎麼標示\r\n? --> #xd#xa
【SQL Injection防禦】
2007 OWAST Top 10:
- XSS
- Injection Flaw: SQL Injection, Command Injection
- Malicious File Execution: 放檔案到Web上執行
- Insecure Directory Object Reference: 例如: 當年的../../../boot.ini
- CSRF
- Information Leakage and Improper Error Handling: 例如: 錯誤訊息透漏敏感資訊
- 連線管理不當
- Insecure Cryptographic Storage
- Insecure Communication
- Failure to Restrict URL Access
資安CIA: Confidentiality/Integarity/Availability,費用、風險、效能間的平衡
資安需求: Identification, Authentication, Authorization, Confidentiality, Integarity, Non-Repudiation
國內最早: 91/4/23刑事警察局公告國內九成以上網頁使用SQL指令型資料庫,測試證明九成以上有SQL Injection漏洞(註: 好奇這統計是怎麼做出來的)。SQL Injection的主要問題在於輸入資料沒有做適當的驗證,而Error訊息的不當顯示會讓Hacker在Try-And-Error過程中得到更多珍貴資訊,增加被成功入侵的機率。另,有一項統計是上線後再補漏洞,成本會增加50倍。
範例: 利用登入畫面 得知資料表名稱、DROP TABLE、xp_cmdshell(Web用sa連SQL的人活該)
Tips:
- 過瀘掉不該出現的—, '等符號
- 過瀘輸入資料出現的隱含的SQL指令,如INSERT、SELECT、UPDATE... (註: 呃,這方法好像有點看到黑影就開槍,請小心使用)
- 錯誤訊息不要透露太多細節給End-User
(笑話一則: NT4.0時代,Web出現"CPU過熱錯誤"訊息,叫來硬體工程師,結果發現是Web Developer設計在Requset數太多時導至該自訂訊息網頁) - 縮小連線帳戶的權限,別再用sa了 (講師說他遇到的網站,絕大多數仍在用sa或dbo,比我想得嚴重多了)
- 全面檢視軟體程式碼(Review Source Code)
- 不要用預設路徑,例如: c:\inetpub\wwwroot\,這樣至少不要被低階攻擊工具猜中
- 繪製流程示意圖,掌握程式用到哪些元件、如何溝通,找出可能發生漏洞的點。
- 用最小權限執行程式
- 用On Error Resume Next + If Err.Number <> 0 Then自行處理錯誤<-- (註: 用ASP舉例讓我有點意外,說不定這是因應實務界的需求,哈!)
- 把不用且功能強大的Stored Procedure移除(註: 新版的DB多半預設都不啟用了)
- web.config customError = “On”
- 自己輸入超過256個字元檢測Buffer Overflow(註: 我覺得這點放在ASP/ASPX時有爭議)
- Strong Password, 定期改密碼
- Windows Update 少不了
- 監控系統運作狀況: Network Device、OS、Server
工具:
- 弱點掃描軟體
- Microsoft Baseline Security Analyzer
- 源碼檢查: Fortify Source Code Analysis, Acunetix Web Vulnerability Scanner, CodeScure Enterprise
- Web Application Firewall: MS UAG, Fortinet FortiWeb, Radware Appwall (註: 沒提到阿碼? SmartWAF還不算咖嗎?)
案例: [註: 這部分又挑起我的駭客熱血,很有興趣多瞭解一些,可惜只有兩三句就跳過去了]
- 學生入侵學校主機(SQL Injection)盜取資料
- Hacker集團入侵公司主機盜取學生資料販賣(SQL Injection, Zero Day) (註: 嘿,Hacker用的技巧果然比學生多)
- 兩名學生入侵數十台學校、企業主機 with XSS, Cookie, SQL Injection,受害單位損失近億
工商服務時間:
- Forefont Threat Management Gateway
- Forefront Unified Access Gateway, UAG
#號稱可以防止員工上班時間種菜、開餐廳
#UAG as WAF(Web Application Firewall)
#用戶端健康檢查
#監控機制
#使用網頁時會跳出登入程序,可結合SmartCard
#可用來發佈應用程式
#DirectAccess整合(原本只適用Windows 7 & Win2008 R2,加掛後就可以讓舊OS也支援)
#Load Balance
<DEMO>用UAG防護SQL Injection(果然示範網站用的是ASP),在不改程式的前題下可以產生攔阻惡意Request的效果
【延伸閱讀】ASP.NET防駭指南、你的網站在裸奔嗎?、游擊式的SQL Injection攻擊
Comments
# by Eric
對大型資料表建立INDEX會造成資料暫時無法存在 <-- 打錯囉!! 另外請教黑大,少用IN 的替代方案是? OR ?
# by Jeffrey
to Eric, 感謝,錯字校正囉! 關於Bookmark Lookup那一段,講師只提了少用IN,未再深入解釋。這點我也是第一次聽到,真相如何,要再找時間挖掘一下。
# by Arthur張
in 會自動拆解成多個or 基本上,在Where那邊...使用函數,子查詢,like,in都是極為折磨SQLServer的 (but上述那幾項都要適實際情況而定,有可能在某些特殊情況下,卻是一個最佳解決方案)