1. ภาพรวม
ในช่วงสองปีที่ผ่านมา ผู้เชี่ยวชาญด้านความปลอดภัยควรให้ความสำคัญกับการโจมตีที่ชั้นแอปพลิเคชันเครือข่ายมากขึ้น เพราะไม่ว่ากฎไฟร์วอลล์ของคุณจะแข็งแกร่งแค่ไหนหรือคุณจะขยันแพทช์แค่ไหน หากนักพัฒนาเว็บแอปพลิเคชันของคุณไม่ปฏิบัติตามโค้ดที่ปลอดภัย ผู้โจมตีจะเข้าสู่ระบบของคุณผ่านทางพอร์ต 80 เทคนิคการโจมตีหลักสองวิธีที่ใช้กันอย่างแพร่หลายคือการโจมตีแบบฉีด SQL [ref1] และ CSS [ref2] การแทรก SQL หมายถึงเทคนิคการแทรกอักขระเมตา SQL (อักขระพิเศษที่แสดงถึงข้อมูลบางส่วน) และคำแนะนำผ่านทางพื้นที่ป้อนข้อมูลทางอินเทอร์เน็ตเพื่อจัดการการดำเนินการของการสืบค้น SQL ส่วนหลัง การโจมตีเหล่านี้มุ่งเป้าไปที่เว็บเซิร์ฟเวอร์ขององค์กรอื่นเป็นหลัก การโจมตี CSS ทำให้แน่ใจว่าโค้ด Javascript ที่เป็นอันตรายทำงานบนเครื่องของเหยื่อโดยการแทรกแท็กสคริปต์ลงใน URL จากนั้นโน้มน้าวผู้ใช้ที่เชื่อถือให้คลิกที่แท็กเหล่านั้น การโจมตีเหล่านี้ใช้ประโยชน์จากความสัมพันธ์ที่เชื่อถือได้ระหว่างผู้ใช้และเซิร์ฟเวอร์ ที่จริงแล้ว เซิร์ฟเวอร์ตรวจไม่พบอินพุตและเอาท์พุต ดังนั้นจึงไม่ปฏิเสธโค้ด JavaScript
บทความนี้กล่าวถึงเทคนิคการตรวจจับช่องโหว่ของ SQL insert และการโจมตี CSS มีการพูดคุยกันมากมายบนอินเทอร์เน็ตเกี่ยวกับการโจมตีบนเว็บทั้งสองประเภทนี้ เช่น วิธีดำเนินการโจมตี ผลกระทบ และวิธีการเตรียมและออกแบบโปรแกรมเพื่อป้องกันการโจมตีเหล่านี้ได้ดียิ่งขึ้น อย่างไรก็ตาม ยังไม่มีการอภิปรายเกี่ยวกับวิธีการตรวจจับการโจมตีเหล่านี้เพียงพอ เราใช้ IDS Snort โอเพ่นซอร์สยอดนิยม [อ้างอิง 3] เพื่อสร้างนิพจน์ทั่วไปตามกฎสำหรับการตรวจจับการโจมตีเหล่านี้ บังเอิญ การตั้งค่ากฎเริ่มต้นของ Snort มีวิธีการตรวจจับ CSS ไว้ด้วย แต่สามารถหลีกเลี่ยงได้อย่างง่ายดาย ตัวอย่างเช่น ส่วนใหญ่ใช้การเข้ารหัสเลขฐานสิบหก เช่น %3C%73%63%72%69%70% 74%3E แทน <script> เพื่อหลีกเลี่ยงการตรวจจับ
ขึ้นอยู่กับความสามารถขององค์กรในระดับหวาดระแวง เราได้เขียนกฎหลายข้อเพื่อตรวจจับการโจมตีเดียวกัน หากคุณต้องการตรวจจับการโจมตีแบบแทรก SQL ที่เป็นไปได้ทั้งหมด คุณจะต้องใส่ใจกับอักขระเมตา SQL ที่มีอยู่ เช่น เครื่องหมายคำพูดเดี่ยว อัฒภาค และขีดกลางคู่ อีกวิธีหนึ่งในการตรวจจับการโจมตี CSS ก็คือระวังวงเล็บเหลี่ยมในแท็ก HTML แต่จะตรวจพบข้อผิดพลาดมากมาย เพื่อหลีกเลี่ยงปัญหานี้ จำเป็นต้องแก้ไขกฎเพื่อให้การตรวจจับแม่นยำยิ่งขึ้น โดยที่ยังคงไม่สามารถหลีกเลี่ยงข้อผิดพลาดได้
ใช้คีย์เวิร์ด pcre (Perl Compatible Regular Expressions) [ref4] ในกฎ Snort และแต่ละกฎสามารถดำเนินการโดยมีหรือไม่มีการดำเนินการกับกฎอื่นๆ ก็ได้ ซอฟต์แวร์สาธารณะสามารถใช้กฎเหล่านี้ได้ เช่น grep (เครื่องมือค้นหาเอกสาร) เพื่อตรวจสอบบันทึกของเซิร์ฟเวอร์เครือข่าย อย่างไรก็ตาม คุณต้องระวังว่าเว็บเซิร์ฟเวอร์จะบันทึกอินพุตของผู้ใช้ในไดอารีเฉพาะเมื่อมีการส่งคำขอเป็น GET เท่านั้น หากคำขอถูกส่งเป็น POST ก็จะไม่ถูกบันทึกลงในไดอารี
2. นิพจน์ทั่วไปสำหรับการแทรก SQL
เมื่อคุณเลือกนิพจน์ทั่วไปสำหรับการโจมตีการแทรก SQL สิ่งสำคัญคือต้องจำไว้ว่าผู้โจมตีสามารถทำการแทรก SQL ได้โดยการส่งแบบฟอร์มหรือผ่านช่องคุกกี้ ตรรกะการตรวจจับอินพุตของคุณควรพิจารณาอินพุตประเภทต่างๆ ที่จัดโดยผู้ใช้ (เช่น ข้อมูลแบบฟอร์มหรือคุกกี้) และหากคุณพบคำเตือนจำนวนมากที่มาจากกฎ ให้มองหาเครื่องหมายคำพูดเดี่ยวหรืออัฒภาค เนื่องจากอักขระเหล่านี้อาจเป็นอินพุตที่ถูกต้องในคุกกี้ที่สร้างโดยเว็บแอปพลิเคชันของคุณ ดังนั้น คุณต้องประเมินแต่ละกฎกับเว็บแอปพลิเคชันเฉพาะของคุณ
ตามที่กล่าวไว้ข้างต้น นิพจน์ทั่วไปโดยละเอียดเพื่อตรวจจับการโจมตีแบบฉีด SQL ควรให้ความสนใจกับอักขระเมตาพิเศษของ SQL เช่น เครื่องหมายคำพูดเดี่ยว (') และเครื่องหมายขยายคู่ (--) เพื่อค้นหาอักขระเหล่านี้และอักขระเหล่านั้น เลขฐานสิบหกเทียบเท่า ใช้นิพจน์ทั่วไปต่อไปนี้:
2.1 นิพจน์ทั่วไปสำหรับการตรวจจับอักขระเมตา SQL
/(%27)|(')|(--)|(%23)|(#)/ix
คำอธิบาย:
ก่อนอื่นเราจะตรวจสอบเลขฐานสิบหกของเครื่องหมายคำพูดเดี่ยวที่เทียบเท่ากัน เครื่องหมายคำพูดเดี่ยวหรือเครื่องหมายคู่ ป้ายขยาย. อักขระเหล่านี้เป็นอักขระ MS SQL Server หรือ Oracle ซึ่งระบุว่าต่อไปนี้เป็นความคิดเห็น และอักขระที่ตามมาทั้งหมดจะถูกละเว้น นอกจากนี้ หากคุณใช้ MySQL คุณจะต้องใส่ใจกับการปรากฏของ '#' และค่าที่เทียบเท่ากันของเลขฐานสิบหก โปรดทราบว่าเราไม่จำเป็นต้องตรวจสอบเลขฐานสิบหกเพื่อดูค่าที่เทียบเท่ากับขีดคู่ เนื่องจากนี่ไม่ใช่อักขระเมตา HTML และเบราว์เซอร์จะไม่เข้ารหัส นอกจากนี้ หากผู้โจมตีจัดการแก้ไขเครื่องหมายขีดคู่เป็นค่าเลขฐานสิบหก %2D ด้วยตนเอง (โดยใช้พร็อกซีเช่น Achilles [อ้างอิง 5]) การแทรก SQL จะล้มเหลว
กฎ Snort ใหม่ที่เพิ่มในนิพจน์ทั่วไปข้างต้นมีดังนี้:
alert tcp $EXTERNAL_NET any -> $HTTP_SERVERS $HTTP_PORTS (msg:"SQL Injection - Paranoid"; flow:to_server,established;uricontent:".pl";pcre: "/ (%27)|(')|(--)|(%23)|(#)/i"; classtype: แอปพลิเคชันโจมตี sid: 9099; rev: 5;
) บทความนี้ ในการสนทนา ค่าของคีย์เวิร์ด uricontent คือ ".pl" เนื่องจากในสภาพแวดล้อมการทดสอบของเรา โปรแกรม CGI เขียนด้วยภาษา Perl ค่าของคีย์เวิร์ด uricontent ขึ้นอยู่กับแอปพลิเคชันเฉพาะของคุณ ค่านี้อาจเป็น ".php" หรือ ".asp" หรือ ".jsp" เป็นต้น จากมุมมองนี้ เราจะไม่แสดงกฎ Snort ที่เกี่ยวข้อง แต่เราจะให้นิพจน์ทั่วไปที่สร้างกฎเหล่านี้ คุณสามารถสร้างกฎ Snort มากมายได้อย่างง่ายดายผ่านนิพจน์ทั่วไปเหล่านี้ ในนิพจน์ทั่วไปก่อนหน้านี้ เราตรวจพบเครื่องหมายขีดกลางคู่เนื่องจากอาจมีจุดแทรก SQL แม้ว่าจะไม่มีเครื่องหมายคำพูดเดี่ยวก็ตาม [อ้างอิง 6] ตัวอย่างเช่น รายการเคียวรี SQL มีเพียงค่าตัวเลขดังต่อไปนี้:
เลือก value1, value2, num_value3 จากฐานข้อมูล
โดยที่ num_value3=some_user_supplied_number
ในกรณีนี้ ผู้โจมตีสามารถดำเนินการคำสั่ง SQL เพิ่มเติมได้ การสาธิตจะส่งอินพุตต่อไปนี้:
3; แทรกค่าลงใน some_other_table
ในที่สุดตัวดัดแปลง pcre จะถูกใช้เพื่อจับคู่ตัวพิมพ์เล็กและใหญ่ ละเว้นช่องว่างตามลำดับ กฎข้างต้นสามารถขยายเพิ่มเติมเพื่อตรวจสอบการมีอยู่ของอัฒภาคได้ อย่างไรก็ตาม อัฒภาคอาจเป็นส่วนหนึ่งของการตอบสนอง HTTP ปกติ เพื่อลดข้อผิดพลาดนี้ และเพื่อป้องกันการเกิดเครื่องหมายคำพูดเดี่ยวและเครื่องหมายขยายคู่ตามปกติ ควรแก้ไขกฎข้างต้นเพื่อตรวจหาการมีเครื่องหมาย = ก่อน อินพุตของผู้ใช้จะตอบสนองต่อคำขอ GET หรือ POST โดยทั่วไป อินพุตจะถูกส่งดังนี้:
ชื่อผู้ใช้=some_user_supplied_value&password=some_user_supplied_value
ดังนั้น ความพยายามในการแทรก SQL จะทำให้อินพุตของผู้ใช้ปรากฏหลังเครื่องหมาย = หรือค่าเลขฐานสิบหกที่เทียบเท่ากัน
2.2 แก้ไขนิพจน์ทั่วไปสำหรับการตรวจหาอักขระเมตา SQL
/((%3D)|(=))[^n]*((%27)|(')|(--)|( %3B)|(:))/i
คำอธิบาย:
ขั้นแรกกฎนี้จะให้ความสำคัญกับเครื่องหมาย = หรือค่าเลขฐานสิบหก (%3D) จากนั้นจึงพิจารณาอักขระใดๆ ที่เป็นศูนย์หรือมากกว่านั้น ยกเว้นการขึ้นบรรทัดใหม่ และสุดท้ายจะตรวจพบเครื่องหมายคำพูดเดี่ยวและเครื่องหมายขีดคู่หรือ อัฒภาค.
การแทรก SQL โดยทั่วไปจะพยายามจัดการคิวรีดั้งเดิมโดยใช้เครื่องหมายคำพูดเดี่ยวเพื่อให้ได้ค่าที่เป็นประโยชน์ โดยทั่วไปจะมีการกล่าวถึงการโจมตีนี้โดยใช้สตริง 1'or'1'='1 อย่างไรก็ตาม การตรวจจับสตริงนี้สามารถหลบเลี่ยงได้อย่างง่ายดาย เช่น การใช้ 1'or2>1 -- อย่างไรก็ตาม ส่วนที่คงที่เพียงอย่างเดียวคือค่าของ อักขระเริ่มต้น ตามด้วยเครื่องหมายคำพูดเดียวแล้วเติม 'หรือ' ตรรกะบูลีนที่ตามมาอาจแตกต่างกันไปในหลากหลายสไตล์ ตั้งแต่ธรรมดาไปจนถึงซับซ้อนมาก การโจมตีเหล่านี้สามารถตรวจจับได้ค่อนข้างแม่นยำโดยใช้นิพจน์ทั่วไปต่อไปนี้ บทที่ 2.3 อธิบาย
2.3 การโจมตีด้วยการฉีด SQL ทั่วไป
/w*((%27)|('))((%6F)|o|(%4F))((%72)|r| (% 52))/ix
คำอธิบาย:
w* - อักขระหรือขีดล่างตั้งแต่ศูนย์ขึ้นไป
(%27)|' - เครื่องหมายคำพูดเดี่ยวหรือค่าเทียบเท่าเลขฐานสิบหก
(%6 F)|o|(%4 F))((%72)|r|-(%52) - กรณีของ 'or' และเทียบเท่ากับเลขฐานสิบหก
คำสั่ง union'SQL ในการแทรก SQL การโจมตียังเป็นเรื่องปกติในฐานข้อมูลต่างๆ หากนิพจน์ทั่วไปก่อนหน้านี้ตรวจพบเพียงเครื่องหมายคำพูดเดี่ยวหรืออักขระเมตา SQL อื่นๆ ก็จะทำให้เกิดข้อผิดพลาดมากมาย คุณควรแก้ไขแบบสอบถามเพิ่มเติมเพื่อตรวจจับเครื่องหมายคำพูดและคีย์เดียว นอกจากนี้ยังสามารถขยายเพิ่มเติมด้วยคำหลัก SQL อื่น ๆ เช่น 'select', 'insert', 'update', 'delete' ฯลฯ
2.4 การตรวจจับการแทรก SQL, นิพจน์ทั่วไปของคำหลักในการสืบค้น UNION
/ ((%27)|(') )union/ix
(%27)|(') - เครื่องหมายคำพูดเดี่ยวและค่าเทียบเท่าฐานสิบหก
union - คีย์เวิร์ด union
ยังสามารถใช้เพื่อปรับแต่งนิพจน์สำหรับการสืบค้น SQL อื่นๆ เช่น >เลือก แทรก อัปเดต ลบ ปล่อย ฯลฯ
หากในขั้นตอนนี้ ผู้โจมตีพบว่าเว็บแอปพลิเคชันมีการแทรก SQL ช่องโหว่เขาจะพยายามใช้ประโยชน์จากมัน หากเขารู้ว่าเซิร์ฟเวอร์แบ็คเอนด์คือเซิร์ฟเวอร์ MS SQL เขามักจะพยายามเรียกใช้พื้นที่จัดเก็บข้อมูลที่เป็นอันตรายและขยายขั้นตอนการจัดเก็บ โดยทั่วไปขั้นตอนเหล่านี้เริ่มต้นด้วยตัวอักษร 'sp' หรือ 'xp' โดยทั่วไปแล้ว เขาอาจพยายามเรียกใช้ขั้นตอนการจัดเก็บแบบขยาย 'xp_cmdshell' (ซึ่งดำเนินการคำสั่ง Windows ผ่าน SQL Server) สิทธิ์ SA ของเซิร์ฟเวอร์ SQL มีสิทธิ์ดำเนินการคำสั่งเหล่านี้ ในทำนองเดียวกัน พวกเขาสามารถแก้ไขรีจิสทรีผ่าน xp_regread, xp_regwrite และขั้นตอนที่เก็บไว้อื่นๆ
2.5 คำอธิบายของนิพจน์ทั่วไป
/exec(s|+)+(s|x)pw+/ix
สำหรับการตรวจจับการโจมตีแบบฉีด SQL Server ของ MS SQL:
exec - คีย์เวิร์ดที่ร้องขอการดำเนินการของขั้นตอนการจัดเก็บที่เก็บไว้หรือขยาย
(s|+)+ - ช่องว่างตั้งแต่หนึ่งช่องขึ้นไปหรือค่า http ที่เทียบเท่ากัน
(s|x) ตัวอักษร p- 'sp' หรือ 'xp' ใช้เพื่อระบุการจัดเก็บหรือขั้นตอนการจัดเก็บเพิ่มเติม
w+ - อักขระหรือขีดล่างตั้งแต่หนึ่งตัวขึ้นไปเพื่อให้ตรงกับชื่อของขั้นตอน
3. นิพจน์ทั่วไปสำหรับการเขียนสคริปต์ข้ามไซต์ (CSS)
เมื่อเริ่มการโจมตี CSS หรือตรวจพบช่องโหว่ของเว็บไซต์ ผู้โจมตีอาจสร้างแท็ก HTML แบบง่าย ๆ ก่อน เช่น < b> (ตัวหนา), <i> (ตัวเอียง) หรือ <u> (ขีดเส้นใต้) หรือเขาอาจลองใช้แท็กสคริปต์ง่ายๆ เช่น <script>alert("OK")</script> เพราะสิ่งพิมพ์ส่วนใหญ่และนี่คือ ใช้เป็นตัวอย่างในการตรวจสอบว่าเว็บไซต์มีช่องโหว่ CSS ที่เผยแพร่ผ่านทางอินเทอร์เน็ตหรือไม่ ความพยายามเหล่านี้สามารถตรวจพบได้ง่าย อย่างไรก็ตาม ผู้โจมตีที่ฉลาดสามารถแทนที่สตริงทั้งหมดด้วยค่าเลขฐานสิบหกของมันได้ ด้วยวิธีนี้ แท็ก <script> จะปรากฏเป็น %3C%73%63%72%69%70%74%3E ในทางกลับกัน ผู้โจมตีอาจใช้เว็บพร็อกซีเซิร์ฟเวอร์ เช่น Achilles เพื่อแปลงอักขระพิเศษบางตัว เช่น < เป็น %3C, > เป็น %3E โดยอัตโนมัติ เมื่อเกิดการโจมตีดังกล่าว วงเล็บเหลี่ยมมักจะถูกแทนที่ด้วยค่าเลขฐานสิบหก ใน URL
นิพจน์ทั่วไปต่อไปนี้จะตรวจจับข้อความใด ๆ ที่มี <, > ใน html มันจะตรวจจับความพยายามในการใช้ <b>, <u> หรือ <script> regex นี้ควรละเว้นตัวพิมพ์เล็กและตัวพิมพ์ใหญ่ เราจำเป็นต้องตรวจจับทั้งวงเล็บมุมและค่าเทียบเท่าฐานสิบหก (% 3C|<) ในการตรวจจับสตริงทั้งหมดที่แปลงเป็นเลขฐานสิบหก เราต้องตรวจจับตัวเลขและเครื่องหมาย % ที่ผู้ใช้ป้อน นั่นคือ ใช้ [a-z0-9%] นี่อาจทำให้เกิดข้อบกพร่องบางอย่าง แต่ไม่ใช่ส่วนใหญ่จะตรวจจับการโจมตีจริงได้
3.1 นิพจน์ทั่วไปสำหรับการโจมตี CSS ทั่วไป
/((%3C)|<)((%2F)|/)*[a-z0-9%]+((%3E)|>)/ix
อธิบาย : :
((%3C)|<) - ตรวจสอบ < และเทียบเท่าเลขฐานสิบหก
((%2F)|/)* - แท็กปิด/ หรือเทียบเท่าเลขฐานสิบหก
[a-z0-9%]+ - ตรวจสอบตัวอักษรในแท็กหรือเทียบเท่าเลขฐานสิบหก
((%3E)|>) - ตรวจสอบ > หรือ
กฎ Snort ที่เทียบเท่ากับเลขฐานสิบหก:
alert tcp $EXTERNAL_NET any -> $HTTP_SERVERS $HTTP_PORTS (msg:"NII Cross-site scripting allowance"; flow:to_server,established; pcre:"/((%3C)|<)((%2F)| /)*[a-z0-9%]+((%3E)|>)/i"; classtype:Web-application-attack; sid:9000; rev:5;)
การเขียนสคริปต์ข้ามไซต์อาจเป็น ใช้แล้ว< img src=>เทคโนโลยี กฎการสนอร์ตเริ่มต้นปัจจุบันสามารถหลีกเลี่ยงได้อย่างง่ายดาย
ส่วนที่ 3.2 ระบุวิธีการป้องกันเทคนิคนี้
3.2 "<img src" โจมตี CSS นิพจน์ทั่วไป
/((%3C)|<)((%69)|i|(%49))((%6D)|m|(%4D) ) ((%67)|g|(%47))[^n]+((%3E)|>)/I
คำอธิบาย:
(%3 C)|<) -<หรือเทียบเท่าเลขฐานสิบหก
(%69)|i|(%49))((%6D)|m|(%4D))((%67)|g|(%47) -'img' ตัวอักษรหรือมัน การรวมกันของรูปแบบที่เทียบเท่าเลขฐานสิบหกตัวพิมพ์ใหญ่และตัวพิมพ์เล็ก
[^n]+ - อักขระใดๆ ที่ตามหลัง <img ยกเว้นขึ้นบรรทัดใหม่
(%3E)|>) -> หรือเทียบเท่ากับเลขฐานสิบหก
3.3 CSS Attack Extreme Regular Expression
/((%3C)|<)[^n]+((%3E)|>) /I
คำอธิบาย:
นี่ กฎเพียงค้นหา <+อักขระใดๆ ยกเว้นอักขระขึ้นบรรทัดใหม่+> ขึ้นอยู่กับสถาปัตยกรรมของเว็บเซิร์ฟเวอร์และเว็บแอปพลิเคชันของคุณ กฎนี้อาจก่อให้เกิดข้อผิดพลาดบางประการ แต่รับประกันว่าจะตรวจจับการโจมตีที่คล้ายกับ CCS หรือ CSS
สรุป:
ในบทความนี้ เราได้เสนอกฎนิพจน์ทั่วไปประเภทต่างๆ เพื่อตรวจจับการโจมตีแบบแทรก SQL และการเขียนสคริปต์ข้ามไซต์ กฎบางข้อนั้นเรียบง่ายและสุดขั้ว และการโจมตีที่อาจเกิดขึ้นจะทำให้คุณตื่นตัว แต่กฎเกณฑ์สุดโต่งเหล่านี้อาจทำให้เกิดข้อผิดพลาดเชิงรุกได้ ด้วยเหตุนี้ เราจึงปรับเปลี่ยนกฎง่ายๆ เหล่านี้เพื่อใช้สไตล์เพิ่มเติมเพื่อให้สามารถตรวจสอบได้แม่นยำยิ่งขึ้น ในการตรวจจับการโจมตีบนแอปพลิเคชันเครือข่ายเหล่านี้ เราขอแนะนำให้ใช้สิ่งเหล่านี้เป็นจุดเริ่มต้นในการดีบัก IDS ของคุณหรือวิธีวิเคราะห์บันทึก หลังจากแก้ไขเพิ่มเติมอีกสองสามครั้ง คุณควรพร้อมที่จะตรวจจับการโจมตีเหล่านั้นหลังจากที่คุณได้ประเมินการตอบสนองที่ไม่เป็นอันตรายต่อส่วนธุรกรรมเครือข่ายตามปกติ
ข้อมูลอ้างอิง
1. SQL Injection
http://www.spidynamics.com/papers/SQLInjectionWhitePaper.pdf
2. คำถามที่พบบ่อยเกี่ยวกับการเขียนสคริปต์ข้ามไซต์ http://www.cgisecurity.com/articles/xss -
faq.shtml
3. Snort IDS http://www.snort.org
4. นิพจน์ทั่วไปที่เข้ากันได้กับ Perl (pcre) http://www.pcre.org
5. พร็อกซีแอปพลิเคชันเว็บ Achilles http://achilles.mavensecurity.com
3. การฉีด SQL ขั้นสูง
http://www.nextgenss.com/papers/advanced_sql_injection.pdf
7. การเขียนโปรแกรมอย่างปลอดภัย HOWTO, David Wheeler www.dwheeler.com
8. ภัยคุกคามและมาตรการรับมือ, MSDN, Microsoft