MoinEin netter Artikel zu Raceconditions bei Heises:
Secure Coding: CWE-377 – TOCTOU-Race-Conditions in den Griff bekommen
Vorsichtig sein mit Tempfiles soll eins. Damit die nicht missnutzt werden. Jo. Da gibts ne extra Funktion für, die den Scheiss in einem ununterbrochenem Programmteil abwickelt. In multitaskingfähigen und objektorientierten Setups ist kein Programm alleine.
Funktionene zum Erstellen von Tempfiles mensch nicht riskant neu programmieren. Schon gewusst? Das da ist tatsächlich falsch:
File tempFile = new File("/tmp/tempfile.txt"); // Time-of-check: Verify whether the file exists if (!tempFile.exists()) { // Time-of-use: Create the file tempFile.createNewFile(); System.out.println("Temporary file created at: " + tempFile.getAbsolutePath());
Ok, das ist jetzt Java, aber egal. Wo liegt der Fehler?
Da kann ein Bösewicht zwischen den beiden Funktionen die Datei austauschen. Sowas erledigt 1 besser in einem Programmschrit, der nicht unterbrochen werden kann. Gibts extra ne Funktion, die Tempfiles anlegt:
File tempFile = File.createTempFile("tempfile_", ".tmp"); tempFile.deleteOnExit(); System.out.println("Secure temporary file created at: " + tempFile.getAbsolutePath());
File.createTempFile versus new File("/tmp/tempfile.txt").
Weniger Code, weniger Gezergel.
Mit Namen wie "a3816bd1-1651-404d-97e6-6e6cee36f3e8.txt" vs. "kurzmalehm.txt") ists noch ne Nummer dichter.Die Sprache ist da im Prinzpiep egal, wenn so eine sogenannte "atomare" (=ununterbrochene) Funktion zu Verfügung steht, ist es ratsam, sie zu benutzen :)
Gilt auch für vieles im Kontext mit Timern und Zeit.
In multithreaded und objektorientierten Setups ist das notwendig. Think about a virus running on the machine. Du kannst den nicht sehen, aber der hat sich eine Zeitscheibe von der CPU mopsen können, ein paar tausend Taktzyklen, wo das Viech was machen kann. Und diese Zeitscheibe liegt genau zwischen zwei Unterprogrammaufrufen unserer tollen, glitzernden Software. bingoIn Python nimmste dann das da:
import sys, os, tempfile with tempfile.TemporaryFile() as datei: datei.write(b"Bist du Datenstaubichsauger")
Siehe Python Docs: Generate temporary files and directories