วิธีตรวจช่องโหว่ความปลอดภัยในโค้ดก่อนส่ง Pull Request ด้วย DevSkim

8 นาที 11 views บันทึกเป็น PDF
วิธีตรวจช่องโหว่ความปลอดภัยในโค้ดก่อนส่ง Pull Request ด้วย DevSkim

ไม่อยากให้โค้ดมีช่องโหว่หลุดไปถึงมือทีมงาน? มาเรียนรู้วิธีใช้ DevSkim และ Git hooks ช่วยตรวจโค้ดอัตโนมัติก่อนบันทึกงาน เพื่อเป็นโปรแกรมเมอร์ที่เขียนโค้ดปลอดภัย

ทำไมเราต้องตรวจความปลอดภัยโค้ดก่อนส่งงาน

ลองนึกภาพว่าคุณกำลังเขียนจดหมายสำคัญที่เต็มไปด้วยความลับ แล้วเผลอแปะโพสต์อิทที่มีรหัสผ่านบ้านไว้ที่หน้าซองก่อนส่งให้คนอื่นดู ในการเขียนโปรแกรมก็เหมือนกันครับ บางครั้งเราอาจเผลอเขียนโค้ดที่ดูเหมือนจะใช้งานได้ดี แต่มีช่องโหว่ซ่อนอยู่ เช่น การใส่รหัสผ่านไว้ในโค้ดโดยตรง หรือการเขียนคำสั่งที่เปิดช่องให้คนร้ายเข้ามาขโมยข้อมูลได้ง่ายๆ

การรอให้คนอื่นมาตรวจเจอตอนที่เราส่งงานไปแล้ว หรือที่เรียกว่า Pull Request (การส่งโค้ดที่เราเขียนไปให้ทีมงานตรวจและรวมเข้ากับโปรเจกต์หลัก) มักจะสายเกินไปครับ เพราะเราต้องเสียเวลาแก้โค้ดใหม่ทั้งหมด แถมยังเสี่ยงต่อการที่ข้อมูลสำคัญหลุดออกไปสู่สาธารณะก่อนที่เราจะรู้ตัว การหาวิธีตรวจโค้ดตั้งแต่เนิ่นๆ จึงเป็นทักษะสำคัญของโปรแกรมเมอร์มืออาชีพ

วิธีที่ง่ายและได้ผลดีคือการใช้ Static Application Security Testing (การตรวจสอบความปลอดภัยของโค้ดโดยไม่ต้องรันโปรแกรมจริง) หรือเรียกสั้นๆ ว่า SAST โดยเราจะติดตั้งตัวช่วยตรวจจับช่องโหว่ไว้ในเครื่องของเราเองผ่านสิ่งที่เรียกว่า Git pre-commit hooks (คำสั่งที่ให้คอมพิวเตอร์ทำงานอัตโนมัติก่อนที่เราจะบันทึกการเปลี่ยนแปลงโค้ด) เพื่อให้เราได้รับคำเตือนทันทีที่เขียนโค้ดไม่ปลอดภัยครับ

รู้จักกับ DevSkim ผู้ช่วยตรวจโค้ดในเครื่องคุณ

DevSkim เป็นเครื่องมือประเภท Security Linter (โปรแกรมช่วยตรวจสอบข้อผิดพลาดด้านความปลอดภัยในโค้ด) ที่พัฒนาโดย Microsoft ครับ หน้าที่ของมันคือการคอยสแกนไฟล์โค้ดของคุณเพื่อหาจุดที่อาจเป็นอันตราย เช่น การใช้คำสั่งที่เก่าและไม่ปลอดภัย หรือการตั้งค่าที่อ่อนแอเกินไป ซึ่งช่วยให้คุณเรียนรู้การเขียนโค้ดที่ปลอดภัยไปพร้อมๆ กับการทำงานจริงได้เลย

เครื่องมือนี้ไม่ได้แค่บอกว่าตรงไหนผิด แต่ยังอธิบายด้วยว่าทำไมมันถึงเสี่ยงและควรแก้ให้ถูกต้องอย่างไร มันทำงานได้เร็วและทำงานในเครื่องคอมพิวเตอร์ของเราได้เลยโดยไม่ต้องเชื่อมต่ออินเทอร์เน็ตตลอดเวลา เหมาะมากสำหรับมือใหม่ที่อยากฝึกนิสัยการเขียนโค้ดให้สะอาดและปลอดภัยตั้งแต่วันแรกที่เริ่มหัดเขียนโปรแกรมครับ

อย่างไรก็ตาม DevSkim ไม่ใช่เครื่องมือสำหรับหา Hardcoded Secrets (รหัสผ่านหรือกุญแจเข้าถึงข้อมูลที่ถูกเขียนค้างไว้ในโค้ด) โดยตรง แม้จะพอตรวจพบได้บ้างแต่ก็ไม่แม่นยำเท่าเครื่องมือเฉพาะทาง ทีมพัฒนาซอฟต์แวร์ส่วนใหญ่จึงมักใช้คู่กับเครื่องมือที่ชื่อว่า Gitleaks เพื่อทำหน้าที่สแกนรหัสผ่านโดยเฉพาะ ซึ่งจะทำให้ระบบป้องกันของคุณสมบูรณ์แบบมากขึ้นครับ

เตรียมตัวติดตั้งเครื่องมือให้พร้อมใช้งาน

ก่อนจะเริ่มต้น คุณต้องมีเครื่องมือพื้นฐานในเครื่องก่อน ได้แก่ Git (โปรแกรมจัดการเวอร์ชันโค้ด), Python (ภาษาโปรแกรมที่ใช้รันสคริปต์เสริม) และ .NET SDK (ชุดเครื่องมือสำหรับรันโปรแกรมจาก Microsoft) หากใครยังไม่มีให้ไปดาวน์โหลดจากเว็บไซต์ทางการของแต่ละเครื่องมือได้เลยครับ

หลังจากติดตั้งเสร็จแล้ว ให้เปิดหน้าจอ Terminal (หน้าจอพิมพ์คำสั่งสั่งงานคอมพิวเตอร์) ขึ้นมาเพื่อติดตั้งเครื่องมือหลักของเราผ่านคำสั่งดังนี้ครับ

# ติดตั้งตัวจัดการคำสั่งก่อนส่งโค้ด
pip install pre-commit

# ติดตั้ง DevSkim ผ่านตัวจัดการของ .NET
dotnet tool install --global Microsoft.CST.DevSkim.CLI

คำสั่ง pip install pre-commit จะเป็นการนำเครื่องมือที่ช่วยรันการตรวจสอบอัตโนมัติมาลงในเครื่องเรา ส่วนคำสั่ง dotnet tool install จะเป็นการดึงโปรแกรม DevSkim มาติดตั้งเพื่อให้เราเรียกใช้คำสั่ง devskim ได้จากทุกที่ในคอมพิวเตอร์ครับ ผลลัพธ์ที่ควรเห็นคือข้อความแจ้งเตือนว่าติดตั้งสำเร็จ หรือถ้าพิมพ์ devskim --version แล้วมีเลขเวอร์ชันขึ้น แสดงว่าคุณพร้อมลุยต่อแล้วครับ

ตั้งค่าให้ระบบตรวจโค้ดอัตโนมัติก่อนบันทึก

เพื่อให้ระบบทำงานทุกครั้งที่เราบันทึกงาน เราต้องสร้างไฟล์คอนฟิก (ไฟล์ตั้งค่า) ขึ้นมาครับ โดยปกติ DevSkim จะตรวจทีละไฟล์ แต่การตั้งค่าผ่าน Pre-commit ต้องการสคริปต์ตัวกลางเล็กน้อย เพื่อให้มันทำงานกับไฟล์ที่เรากำลังแก้ไขอยู่ได้แม่นยำ ให้สร้างไฟล์ชื่อ scripts/run-devskim.py ไว้ในโฟลเดอร์โปรเจกต์ของคุณครับ

เนื้อหาในสคริปต์นี้จะทำหน้าที่วนลูปไล่ตรวจไฟล์ที่เราแก้ไขทีละไฟล์ หากพบช่องโหว่โปรแกรมจะหยุดการทำงานและแจ้งเตือนคุณทันที นี่คือตัวอย่างโค้ดสำหรับสคริปต์ตัวกลางครับ

import subprocess
import sys

# รับชื่อไฟล์ที่ถูกแก้ไขเข้ามาตรวจสอบ
for filename in sys.argv[1:]:
    # รันคำสั่งตรวจความปลอดภัย
    result = subprocess.run(["devskim", "analyze", "-I", filename])
    if result.returncode != 0:
        sys.exit(1) # แจ้งว่าพบปัญหาและหยุดการบันทึก

โค้ดด้านบนใช้ subprocess (โมดูลสำหรับเรียกใช้คำสั่งภายนอก) เพื่อส่งชื่อไฟล์ไปให้ DevSkim ตรวจสอบทีละรายการ ถ้า result.returncode ไม่เป็นศูนย์ แสดงว่ามีการตรวจพบความเสี่ยง ระบบจะสั่ง sys.exit(1) เพื่อหยุดการทำงานของ Git commit (การบันทึกโค้ดเข้าสู่ระบบ) ทันที เพื่อให้คุณกลับไปแก้ไขก่อนที่จะส่งโค้ดออกไปครับ

ทดสอบระบบด้วยโจทย์จำลอง

เมื่อตั้งค่าเสร็จแล้ว เรามาลองทดสอบกันว่ามันทำงานจริงไหม ให้คุณสร้างไฟล์ใหม่ชื่อ test.js แล้วลองเขียนโค้ดที่ดูไม่ปลอดภัย เช่น การใช้ฟังก์ชันเข้ารหัสที่ล้าสมัยอย่าง MD5 (อัลกอริทึมแปลงข้อมูลแบบเก่าที่ถูกเจาะได้ง่าย) ลงไปในไฟล์นั้นเพื่อดูว่าระบบจะแจ้งเตือนเราอย่างไร

เมื่อคุณสั่ง git commit หรือรันคำสั่ง pre-commit run ระบบจะตรวจสอบไฟล์ของคุณทันที หากพบจุดที่ต้องแก้ไข หน้าจอจะแสดงข้อความเตือนพร้อมบอกชื่อกฎที่ละเมิด ทำให้คุณรู้ว่าต้องแก้ตรงไหนและแก้ยังไงโดยไม่ต้องรอให้คนอื่นมาบอกครับ

นี่คือตัวอย่างโค้ดที่ระบบจะตรวจเจอว่าไม่ปลอดภัยครับ

const crypto = require("crypto");
// การใช้ MD5 ถือว่าไม่ปลอดภัยในปัจจุบัน
const hash = crypto.createHash("md5").update("password").digest("hex");

เมื่อรันคำสั่งตรวจสอบ ระบบจะรายงานผลลัพธ์ประมาณว่า Failed - hook id: devskim พร้อมบอกรายละเอียดของกฎที่ละเมิด ให้คุณเปลี่ยนไปใช้ฟังก์ชันที่ปลอดภัยกว่า เช่น SHA-256 แทน เมื่อแก้แล้วให้ลองรันคำสั่งเดิมอีกครั้ง ถ้าไม่มีข้อความเตือนขึ้นแสดงว่าโค้ดของคุณผ่านเกณฑ์ความปลอดภัยแล้วครับ

สรุป: สร้างนิสัยโปรแกรมเมอร์ที่ใส่ใจความปลอดภัย

การใช้เครื่องมือตรวจความปลอดภัยในเครื่องไม่ใช่เรื่องไกลตัวหรือยากเกินไปครับ สำหรับมือใหม่ที่กำลังฝึกเขียนโค้ด การสร้างนิสัยให้ระบบตรวจงานเราตั้งแต่ตอนที่ยังอยู่ในเครื่องตัวเอง จะช่วยให้คุณประหยัดเวลาแก้บั๊ก (ข้อผิดพลาดในโค้ด) ในอนาคตได้มหาศาล และยังช่วยให้คุณดูเป็นโปรแกรมเมอร์ที่มีความเป็นมืออาชีพตั้งแต่วันแรกที่เริ่มทำงาน

จำไว้ว่าไม่มีเครื่องมือใดป้องกันได้ 100% แต่การที่คุณมี DevSkim และ Gitleaks คอยเฝ้าระวังอยู่เบื้องหลัง จะช่วยลดความผิดพลาดที่เกิดจากความเผลอเรอได้ดีที่สุดครับ ลองนำไปปรับใช้กับโปรเจกต์ส่วนตัวของคุณตั้งแต่วันนี้ แล้วคุณจะพบว่าการเขียนโค้ดที่ปลอดภัยไม่ใช่เรื่องน่ากลัว แต่มันคือมาตรฐานที่ใครๆ ก็ทำได้

ลองเริ่มจากโปรเจกต์เล็กๆ ในเครื่องคุณดูครับ ติดตั้งเครื่องมือเหล่านี้ให้ครบ แล้วลองเขียนโค้ดทิ้งไว้สัก 1-2 จุดที่ตั้งใจให้พลาดดู คุณจะเห็นพลังของมันทันที และเมื่อคุณชินกับคำเตือนของมันแล้ว คุณจะเริ่มเขียนโค้ดอย่างระมัดระวังโดยอัตโนมัติ ซึ่งนี่แหละคือจุดเริ่มต้นของการเป็นโปรแกรมเมอร์ที่เก่งและรอบคอบครับ


ที่มา: How to Catch Security Vulnerabilities in Code Before They Reach Your Pull Requests — freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More

แชร์บทความ

Facebook X LINE

บทความที่เกี่ยวข้อง

จัดการเซิร์ฟเวอร์ผ่าน VS Code ให้ง่ายขึ้นด้วย Easy SSH พร้อมฟีเจอร์โหลดไฟล์ผ่านคลิกเดียว

จัดการเซิร์ฟเวอร์ผ่าน VS Code ให้ง่ายขึ้นด้วย Easy SSH พร้อมฟีเจอร์โหลดไฟล์ผ่านคลิกเดียว

เบื่อไหมที่ต้องสลับหน้าจอไปมาเพื่อจัดการเซิร์ฟเวอร์? มาลองใช้ Easy SSH ปลั๊กอิน VS Code ที่ช่วยให้คุณรีโมทผ่าน Terminal ได้สะดวก แถมโหลดไฟล์ได้ง่ายแค่กด Ctrl+click

ที่มา: DEV Community

4 hours ago 11 นาที
3 views
วิธีดึงข้อมูลราคาจาก Google Hotels ด้วย API สำหรับนักพัฒนา

วิธีดึงข้อมูลราคาจาก Google Hotels ด้วย API สำหรับนักพัฒนา

อยากทำแอปท่องเที่ยวแต่ดึงข้อมูลราคาจาก Google Hotels ไม่ได้? มาดูวิธีใช้ Apify Actor ช่วยดึงข้อมูลแบบอัตโนมัติด้วย Python ง่ายๆ ไม่ต้องกลัวเว็บพัง

ที่มา: DEV Community

7 hours ago 8 นาที
5 views
วิธีเช็กความพร้อมโปรเจกต์ก่อนปล่อยงานจริงด้วย ReleaseReady

วิธีเช็กความพร้อมโปรเจกต์ก่อนปล่อยงานจริงด้วย ReleaseReady

เคยไหม? โค้ดรันได้ในเครื่องแต่พอปล่อยจริงกลับพัง! มาดูวิธีตรวจสอบความพร้อมของโปรเจกต์ก่อนอัปขึ้น GitHub ด้วยเครื่องมือ ReleaseReady กัน

ที่มา: DEV Community

11 hours ago 9 นาที
5 views