跳到主要内容
返回文章列表

Deno: รัน TypeScript พร้อมกำหนดสิทธิ์เฉพาะที่โปรแกรมต้องใช้

ทดลองรัน TypeScript ด้วย Deno ตั้งค่า deno task และให้สิทธิ์อ่านไฟล์หรือออกเครือข่ายเฉพาะส่วนที่จำเป็น

Deno: รัน TypeScript พร้อมกำหนดสิทธิ์เฉพาะที่โปรแกรมต้องใช้

Deno เป็น runtime สำหรับ JavaScript และ TypeScript ที่รันไฟล์ TypeScript ได้โดยตรง และให้สิทธิ์เข้าถึงระบบเป็นรายด้าน งานทดลองขนาดเล็กจึงเริ่มได้ไว แต่จุดสำคัญที่สุดก่อนนำไปใช้จริงคือกำหนดขอบเขตไฟล์ เครือข่าย ตัวแปรแวดล้อม และ subprocess ให้เหมาะกับโค้ด

รันไฟล์แรก

ติดตั้ง Deno จากเอกสารทางการ แล้วสร้าง main.ts:

console.log("Hello from Deno");

รัน deno run main.ts โปรแกรมนี้ยังไม่ต้องใช้สิทธิ์ I/O เพิ่ม Deno รองรับการเรียก deno main.ts ได้ด้วย แต่ในคู่มือทีมควรเลือกแบบเดียวกันเพื่อให้อ่าน command log ง่ายขึ้น ลอง deno fmt และ deno test ในโปรเจกต์ทดลองเพื่อรู้จักเครื่องมือพื้นฐานก่อนเพิ่ม dependency

ให้สิทธิ์เท่าที่ใช้

หากสคริปต์ต้องอ่านไฟล์ ให้ใช้ --allow-read หรือระบุ path เช่น deno run --allow-read=./data main.ts หากต้องเรียก endpoint ใช้ --allow-net และจำกัด host ตามความจำเป็น เอกสาร permissions ยังมี --allow-write, --allow-env, --allow-run และชนิดอื่น ๆ การให้ --allow-all หรือ -A เปิดสิทธิ์กว้างทั้งหมด จึงไม่เหมาะเป็นค่าเริ่มต้นของสคริปต์ที่ยังไม่ผ่านการตรวจ

ตำแหน่ง flag มีผล: ให้สิทธิ์ต้องมาก่อนชื่อไฟล์ เช่น deno run --allow-net main.ts หากวาง --allow-net หลัง main.ts จะกลายเป็นอาร์กิวเมนต์ของสคริปต์ ไม่ได้เปิดสิทธิ์ให้ runtime เมื่อติดข้อผิดพลาด permission ให้แก้เฉพาะสิทธิ์ที่ขาด ไม่ต้องขยายเป็น -A โดยทันที

เก็บคำสั่งประจำใน deno.json

สำหรับโปรเจกต์ที่ต้องรันซ้ำ ให้สร้าง deno.json:

{
  "tasks": {
    "dev": "deno run --watch --allow-net main.ts",
    "start": "deno run --allow-net main.ts"
  }
}

จากนั้นเรียก deno task dev หรือ deno task start การรวมคำสั่งไว้ใน task ช่วยให้ทีมเห็นว่าโหมดพัฒนาใช้ watch และแอปต้องการสิทธิ์อะไร หากโปรแกรมต้องอ่าน config หรือ secret ให้ระบุสิทธิ์เพิ่มเติมแบบเจาะจงและตรวจว่าข้อมูลไม่หลุดใน log

ตรวจพฤติกรรมก่อนขึ้นระบบจริง

เริ่มด้วยคำสั่งที่ไม่ให้สิทธิ์แล้วสังเกตว่าโปรแกรมต้องการอะไร ค่อยเพิ่ม allow flag ทีละรายการ ทดสอบทั้งทางสำเร็จและทางที่ควรถูกปฏิเสธ โดยเฉพาะการเข้าถึงไฟล์นอกโฟลเดอร์และ host ที่ไม่ได้อนุญาต ในสภาพแวดล้อม CI ซึ่งไม่มี prompt interactive สคริปต์ที่ขาดสิทธิ์จะล้มเหลว จึงต้องกำหนด flags ให้ครบล่วงหน้า

Deno เหมาะกับงานที่อยากเริ่ม TypeScript และตั้งขอบเขต I/O ชัดเจน แต่ permission เป็นเพียงชั้นหนึ่งของการควบคุมความเสี่ยง ยังต้องตรวจ dependency, secret, API และสิทธิ์ของระบบที่รันควบคู่กัน

อ่านเพิ่มเติม: Run code และ Permissions