# Hook secrets: ตรวจหา secret ที่ฮาร์ดโค้ดไว้

> สแกนโค้ดเบสหาข้อมูลรับรองที่ฮาร์ดโค้ดไว้ได้จากบรรทัดคำสั่ง

Canonical: https://lagune.ai/th-TH/docs/hooks/secrets
ภาษา: th-TH
ต้นฉบับ: https://lagune.ai/docs/hooks/secrets
อัปเดตล่าสุด: 2026-11-07

hook `secrets` ชี้ว่าเป็นปัญหาเมื่อพบ **ข้อมูลรับรองที่ฝังอยู่ในซอร์สโค้ด** แทนที่จะอ่านจาก environment โดยดูจาก **ที่มาของค่า** (ค่า literal หรือการอ่านจาก environment) ไม่ได้ดูจากเนื้อหาของค่า จึงไม่ต้องมีแคตตาล็อก prefix ของผู้ให้บริการแบบครบถ้วน และแทบไม่เกิดผลบวกลวงเลย hook นี้คือเอนจินแบบ deterministic เบื้องหลัง [ความรู้เฉพาะทาง `secrets`](https://lagune.ai/th-TH/docs/catalog)

signature รูปแบบของผู้ให้บริการ ข้อมูลรับรองใน connection string และค่า literal ที่กำหนดให้ identifier ซึ่งชื่อบ่งว่าเป็น secret **ไม่ขึ้นกับภาษา**: สตริงเดียวกันมีความหมายเหมือนกันในทุกไฟล์ ส่วนฮิวริสติกสองแบบที่ขึ้นกับไวยากรณ์ ได้แก่ การอ่าน environment ที่มีค่าเริ่มต้นแบบฮาร์ดโค้ด และ secret ที่ไหลเข้าสู่ log sink นั้น **เข้าใจภาษา** เอนจินจึงไม่มองหา `console.log` ของ JavaScript ในไฟล์ Rust และตรวจ `os.getenv("X", "default")` ของ Python แยกเป็นของภาษานั้นเอง

## การรัน

```bash
npx lagune read secrets                  # scans the whole project
npx lagune read secrets --dir src        # scans a directory
npx lagune read secrets --file config.ts # scans a single file
```

การสแกนพิมพ์ผลออกมาได้สูงสุดสองส่วน **Hardcoded secrets found** คือชุดข้อตรวจพบ (ค่าเริ่มต้นแบบฮาร์ดโค้ดของตัวแปร environment ที่ชื่อบ่งว่าเป็น secret ข้อมูลรับรองที่ฝังอยู่ใน connection string หรือค่าที่ตรงกับรูปแบบของผู้ให้บริการที่คัดสรรไว้) hook จึงจบการทำงานด้วย exit code ที่ไม่ใช่ศูนย์ ส่วน **Secret handling to review manually** คือชุดเบาะแส: ค่า literal ธรรมดาที่กำหนดให้ identifier ซึ่งชื่อบ่งว่าเป็น secret (ระบุที่มาได้ แต่บอกไม่ได้ว่าค่านั้นเป็น secret จริงหรือไม่) และค่าที่ชื่อบ่งว่าเป็น secret ซึ่งไหลเข้าสู่ log sink หรือ response sink การรันที่ไม่พบปัญหาจะพิมพ์ `no hardcoded secrets found`

### ตัวเลือก CLI

| ตัวเลือก | ค่า       | คำอธิบาย                                                             |
| -------- | --------- | -------------------------------------------------------------------- |
| `--dir`  | ไดเรกทอรี | จำกัดการสแกนไว้ที่ไดเรกทอรีเดียว ใช้ซ้ำได้และใช้ร่วมกับ `--file` ได้ |
| `--file` | ไฟล์      | จำกัดการสแกนไว้ที่ไฟล์เดียว ใช้ซ้ำได้และใช้ร่วมกับ `--dir` ได้       |

หากไม่ระบุตัวเลือก hook จะสแกนทั้งโปรเจกต์

### เลือกสิ่งที่จะสแกน

hook นี้ข้ามสิ่งที่ **Git** ละเว้นไว้ หากต้องการข้ามมากกว่านั้น หรือต้องการสแกนสิ่งที่ **Git** ละเว้นไว้ ให้กำหนดการตั้งค่าเฉพาะของ `secrets` เอง:

```bash
npx lagune write add --ignore test/fixtures --checker secrets
```

```json
{
  "checkers": {
    "secrets": { "gitignore": false, "ignore": ["test/fixtures"] }
  }
}
```

[กำหนดค่า hook](https://lagune.ai/th-TH/docs/hooks/configure) อธิบายการตั้งค่าทั้งหมด

### ภาษาที่รองรับ

ข้อตรวจพบเรื่องค่าเริ่มต้นของ environment และเบาะแสเรื่อง log sink อ่านรูปแบบโค้ดที่ต่างกันในแต่ละภาษา จึงครอบคลุมเฉพาะภาษาด้านล่างและไม่แจ้งอะไรในภาษาอื่น ส่วนสัญญาณอีกสามแบบทำงานกับ **ทุก** ไฟล์

| สัญญาณ                      | ภาษา                                                                            |
| --------------------------- | ------------------------------------------------------------------------------- |
| ค่าเริ่มต้นของ environment  | JavaScript/TypeScript, Python, Ruby, PHP, Kotlin, Java, Go (`cmp.Or`), Rust, C# |
| log sink หรือ response sink | JavaScript/TypeScript, Python, Ruby, PHP, Java, Kotlin, Go, Rust, C, C++, C#    |

**นี่เป็นปัญหาด้านนโยบายหรือไม่**

ไม่ใช่ การตรวจหารูปแบบของ secret เพื่อเตือนว่ามีการ commit secret เข้าไปเป็นงานมาตรฐานของเครื่องมือความปลอดภัยเชิงป้องกัน และเป็นการทำงานแบบเดียวกับที่ gitleaks, trufflehog และ GitHub push-protection ทำ hook นี้มาพร้อม signature สำหรับตรวจจับ (**รูปแบบ** ของโทเค็นที่เปิดเผยต่อสาธารณะ) ไม่เคยมี secret จริง และทำหน้าที่ตรวจสอบและอธิบาย ไม่ได้ลักลอบนำข้อมูลออก

## คำถามที่พบบ่อย

### hook secrets หลีกเลี่ยงผลบวกลวงได้อย่างไร

hook นี้ดูจากที่มาของค่า ไม่ได้ดูจากเนื้อหาของค่า รูปแบบที่มีความมั่นใจสูง (โทเค็นของผู้ให้บริการ ค่าเริ่มต้นของ environment และ connection string) เป็นข้อตรวจพบที่ทำให้จบการทำงานด้วย exit code ที่ไม่ใช่ศูนย์ ค่า literal ธรรมดาที่กำหนดให้ identifier ซึ่งชื่อบ่งว่าเป็น secret เป็นเบาะแสให้ตรวจทานและยืนยัน ส่วน identifier เดียวกันที่อ่านค่าจาก process.env นั้น hook จะไม่ทำเครื่องหมายเลย
