mktemp
Tahmin edilemeyen bir adla geçici bir dosya oluşturmak için yardımcı programı kullanın . POSIX tarafından standartlaştırılmamıştır, ancak Linux'un yanı sıra * BSD'de de mevcuttur.
> /tmp/predictable.$RANDOM
iyi bir seçim değildir çünkü çoğunlukla tahmin edilebilirdir¹, bu da komut dosyanızı saldırganın komut dosyanızı yazma erişimine sahip olduğunuz bir dosyanın üzerine yazması veya geçici dosyaya erişmesi için kandırabileceği bir saldırıya açar. Bu, güvenli olmayan geçici bir dosya güvenlik açığıdır. mktemp
bu güvenlik açığı bulunmaz çünkü dosyayı güvenli bir şekilde oluşturur (sembolik bağlantılar olsa bile mevcut bir dosyanın üzerine yazmaz) ve hizmet reddinden kaçınmak için yeterince öngörülemeyen bir ad kullanır.
Bir geçici dosya oluşturmak ve onunla çalışmak yeterince iyi değilse, ile geçici bir dizin oluşturun mktemp -d
ve orada çalışın.
mktemp
$TMPDIR
değişken ayarlanmışsa, ayarlanmamışsa geri düşmeye de özen gösterir /tmp
.
Giderek daha fazla dağıtım TMPDIR
özel bir dizin olarak ayarlandı , örneğin UID'niz /run/1234/tmp
nerede 1234
. Bu, geçici dosyaları güvenlik açıkları riskini ortadan kaldırır, maliyetler artık kullanıcılar arasında geçici dosyaları paylaşamayacaktır (bu bazen yararlıdır, ancak çok sık değildir; /tmp
hala mevcut değildir, sadece mevcut değildir TMPDIR
).
Yeniden üretilebilir bir dosya adına ihtiyacınız varsa, kullanıcının ana dizini altında iyi tanımlanmış bir ada sahip (rastgele bir bileşeni olmayan) bir dosya oluşturun. Modern kural XDG kullanıcı dizini belirtimidir . Dosya veri kaybına neden olmadan kaldırılabilirse XDG_CACHE_HOME
, varsayılan olarak ortam değişkenini kullanın ~/.cache
. Muhtemelen uygulamanızın adını taşıyan bir alt dizin oluşturmalı ve orada çalışmalısınız.
CACHE_DIR="${XDG_CACHE_HOME:-"$HOME/.cache"}"/Wildcard-scripts
[ -d "$CACHE_DIR" ] || mkdir -p -- "$CACHE_DIR"
CACHE_FILE="$CACHE_DIR/tmpfileformyscript"
¹ Sadece gelmez $RANDOM
sadece 32767 olası değerleri alır, ama hatta birçok değerleri denemeden tahmin etmek kolaydır. Bash'ın rasgele sayı üreteci, PID ve ilk kullanım zamanı ile tohumlanan bir LCG'dir . Zsh's, platformun rand
başlangıç zamanına göre ekildi. ATT Ksh's, platformun rand
PID tarafından tohumlandığını gösteriyor. Mksh, daha karmaşık ama yine de güvenlik kalitesinde bir tohumu olmayan bir LCG'dir. Hepsi oldukça büyük bir başarı şansı olan başka bir süreçle tahmin edilebilir.
$TMPDIR
ve~/.cache
tam da ihtiyacım olan şey bu. Biraz daha düşündükten sonra, bunun olmasını istediğim tek nedenin/tmp
bölümleme olduğunu fark ettim - böylece önbellek/home
bölümü dolduramadı . Ancak bu kullanım durumu için bu tam bir sorun değil, bu yüzden bir alt dizin~/.cache
ihtiyaçlarıma mükemmel bir şekilde uyuyor ve güvenlik sorununu önlüyor.