【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:

    1. XSS
    2. Injection Flaw: SQL Injection, Command Injection
    3. Malicious File Execution: 放檔案到Web上執行
    4. Insecure Directory Object Reference: 例如: 當年的../../../boot.ini
    5. CSRF
    6. Information Leakage and Improper Error Handling: 例如: 錯誤訊息透漏敏感資訊
    7. 連線管理不當
    8. Insecure Cryptographic Storage
    9. Insecure Communication
    10. 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上述那幾項都要適實際情況而定,有可能在某些特殊情況下,卻是一個最佳解決方案)

Post a comment


89 - 4 =