Bir hook uygulamak
Implementing a hook
Not: yukarıdaki video, Grep’i içeren bu alıştırmanın daha eski bir sürümünü göstermektedir. Güncel sürüm için aşağıdaki metni takip edin.
Hadi Claude’un hassas dosyaları okumasını engelleyen bir hook oluşturalım. Bu, bir PreToolUse hook’unun tool çağrılarını çalışmadan önce nasıl yakalayabileceğine dair pratik bir örnektir.
Bu alıştırmanın kapsamı
Read tool’unun .env dosyasını açmasını engelleyen bir hook yazacaksınız. Bu, bir oturum boyunca environment variable’larınızı korur.
Bu hook’un yalnızca Read’i kapsadığını unutmayın. Grep veya Bash’in aynı dosyaya ulaşmasını engellemek, her tool farklı alanlar gönderdiği için her tool’un input yapısının ayrı ayrı kontrol edilmesini gerektirir. Kapsamlı dosya koruması için bir hook’u "Read(**/.env)" gibi bir permissions.deny kuralı ile birleştirin. Daha kapsamlı bir anlatım için hooks guide’a bakın.
Hook’u yapılandır
.claude/settings.local.json dosyasını açın ve Read tool’unu eşleştiren bir PreToolUse hook ekleyin:
{
"hooks": {
"PreToolUse": [
{
"matcher": "Read",
"hooks": [
{ "type": "command", "command": "node $PWD/hooks/read_hook.js" }
]
}
]
}
}
Hook script’ini yaz
hooks/read_hook.js oluşturun:
process.stdin.setEncoding("utf8");
let input = "";
process.stdin.on("data", (d) => (input += d));
process.stdin.on("end", () => {
const toolArgs = JSON.parse(input);
const readPath = toolArgs.tool_input?.file_path || "";
if (readPath.includes(".env")) {
console.error("You cannot read the .env file");
process.exit(2);
}
process.exit(0);
});
Hook, tool çağrısını stdin’den JSON olarak okur, tool_input.file_path alanını kontrol eder ve çağrıyı engellemek için exit code 2 ile çıkar (stderr’e yazılan her şey Claude’un gördüğü mesaj olur).
Test et
Bir Claude Code oturumunda, Claude’dan .env dosyanızı okumasını isteyin. Şunu görmelisiniz:
You cannot read the .env file
İşte hook, Read çağrısını engelliyor. Claude’dan farklı bir dosya okumasını isteyin ve normal şekilde çalışır.
Neden yalnızca Read?
Her tool farklı bir input yapısı gönderir. Read {"file_path": "..."} gönderir; Grep {"pattern": "...", "path": "..."} gönderir, burada path bir dosya değil, arama dizinidir; Bash ise {"command": "..."} gönderir. file_path üzerinde bir kontrol Read’i yakalar ama API_KEY için proje genelinde bir grep’i veya Bash’teki bir cat .env’i yakalayamaz. Bunları kapsamak için, her tool için ayrı matcher’lar yazıp her birinin özel alanlarını incelemeniz gerekir — veya tool’lar arasında tek tip uygulanan permissions.deny kurallarını kullanın.