Apakah ada keuntungan dalam membuat file sementara dengan cara yang lebih hati-hati
File sementara biasanya dibuat di direktori sementara (seperti /tmp
) di mana semua pengguna dan proses lain memiliki akses baca dan tulis (skrip lain dapat membuat file baru di sana). Oleh karena itu skrip harus berhati-hati dalam membuat file seperti menggunakan dengan izin yang tepat (mis. hanya baca untuk pemilik, lihat:help umask
) dan nama file tidak mudah ditebak (idealnya acak). Kalau tidak, jika nama file tidak unik, itu dapat membuat konflik dengan skrip yang sama dijalankan beberapa kali (mis. Kondisi ras) atau beberapa penyerang dapat membajak beberapa informasi sensitif (mis. Ketika izin terlalu terbuka dan nama file mudah ditebak) atau membuat /mengganti file dengan versi kodenya sendiri (seperti mengganti perintah atau kueri SQL tergantung pada apa yang disimpan).
Anda dapat menggunakan pendekatan berikut untuk membuat direktori sementara:
TMPDIR=".${0##*/}-$$" && mkdir -v "$TMPDIR"
atau file sementara:
TMPFILE=".${0##*/}-$$" && touch "$TMPFILE"
Namun masih dapat diprediksi dan tidak dianggap aman.
Sesuai man mktemp
, kita dapat membaca:
Secara tradisional, banyak skrip shell menggunakan nama program dengan pid sebagai akhiran dan menggunakannya sebagai nama file sementara. Skema penamaan semacam ini dapat diprediksi dan kondisi balapan yang dibuatnya mudah bagi penyerang untuk menang.
Jadi untuk amannya, disarankan menggunakan mktemp
perintah untuk membuat file atau direktori sementara yang unik (-d
).
mktemp(1)
halaman manual menjelaskannya dengan cukup baik:
Secara tradisional, banyak skrip shell menggunakan nama program dengan pid sebagai akhiran dan menggunakannya sebagai nama file sementara. Skema penamaan semacam ini dapat diprediksi dan kondisi balapan yang dibuatnya mudah bagi penyerang untuk menang. Pendekatan yang lebih aman, meskipun masih lebih rendah, adalah membuat direktori sementara menggunakan skema penamaan yang sama. Meskipun hal ini memungkinkan seseorang untuk menjamin bahwa file sementara tidak akan disubversi, ini masih memungkinkan penolakan serangan layanan yang sederhana. Untuk alasan ini disarankan agar mktemp digunakan sebagai gantinya.
Dalam skrip, saya memanggil mktemp sesuatu seperti
mydir=$(mktemp -d "${TMPDIR:-/tmp/}$(basename $0).XXXXXXXXXXXX")
yang membuat direktori sementara tempat saya dapat bekerja, dan di mana saya dapat menamai file sebenarnya dengan aman sebagai sesuatu yang dapat dibaca dan berguna.
mktemp
tidak standar, tetapi memang ada di banyak platform. "X" umumnya akan diubah menjadi beberapa keacakan, dan lebih mungkin akan lebih acak; namun, beberapa sistem (busybox ash, misalnya) membatasi keacakan ini lebih signifikan daripada yang lain
Omong-omong, pembuatan file sementara yang aman penting untuk lebih dari sekadar skrip shell. Itu sebabnya python punya tempfile, perl punya File::Temp, ruby punya Tempfile, dll…
Anda mungkin ingin melihat mktemp
Utilitas mktemp mengambil templat nama file yang diberikan dan menimpa sebagian darinya untuk membuat nama file yang unik. Templat dapat berupa namaberkas apa saja dengan sejumlah 'Xs' ditambahkan padanya, misalnya/tmp/tfile.XXXXXXXXXX. Tanda 'X' di belakangnya diganti dengan kombinasi nomor proses saat ini dan huruf acak.
Untuk detail lebih lanjut:man mktemp
Ya, gunakan mktemp.
Ini akan membuat file sementara di dalam folder yang dirancang untuk menyimpan file sementara, dan itu akan memberi Anda nama yang unik. Ini menampilkan nama file itu:
> mktemp
/tmp/tmp.xx4mM3ePQY
>