Gibt es einen Vorteil darin, eine temporäre Datei sorgfältiger zu erstellen
Die temporären Dateien werden normalerweise im temporären Verzeichnis (z. B. /tmp
), wo alle anderen Benutzer und Prozesse Lese- und Schreibzugriff haben (jedes andere Skript kann dort die neuen Dateien erstellen). Daher sollte das Skript beim Erstellen der Dateien darauf achten, die Dateien mit den richtigen Berechtigungen zu verwenden (z. B. nur lesen für den Besitzer, siehe:help umask
) und Dateiname sollten nicht leicht zu erraten sein (idealerweise zufällig). Andernfalls, wenn die Dateinamen nicht eindeutig sind, kann es zu Konflikten kommen, wenn dasselbe Skript mehrmals ausgeführt wird (z. B. Race Condition), oder ein Angreifer könnte entweder einige vertrauliche Informationen entführen (z. B. wenn die Berechtigungen zu offen sind und der Dateiname leicht zu erraten ist) oder erstellen /Ersetzen der Datei durch ihre eigene Version des Codes (wie das Ersetzen der Befehle oder SQL-Abfragen, je nachdem, was gespeichert wird).
Sie könnten den folgenden Ansatz verwenden, um das temporäre Verzeichnis zu erstellen:
TMPDIR=".${0##*/}-$$" && mkdir -v "$TMPDIR"
oder temporäre Datei:
TMPFILE=".${0##*/}-$$" && touch "$TMPFILE"
Es ist jedoch immer noch vorhersehbar und wird nicht als sicher angesehen.
Gemäß man mktemp
, können wir lesen:
Traditionell nehmen viele Shell-Skripte den Namen des Programms mit der PID als Suffix und verwenden diesen als temporären Dateinamen. Diese Art von Namensschema ist vorhersehbar und die Race-Condition, die sie erzeugt, ist für einen Angreifer leicht zu gewinnen.
Sicherheitshalber wird daher die Verwendung von mktemp
empfohlen Befehl zum Erstellen einer eindeutigen temporären Datei oder eines Verzeichnisses (-d
).
Die mktemp(1)
Manpage erklärt es ziemlich gut:
Traditionell nehmen viele Shell-Skripte den Namen des Programms mit der PID als Suffix und verwenden diesen als temporären Dateinamen. Diese Art von Benennungsschema ist vorhersehbar, und die dadurch geschaffene Rennbedingung ist für einen Angreifer leicht zu gewinnen. Sicherer, wenn auch immer noch schlechter, ist es, ein temporäres Verzeichnis mit demselben Namensschema zu erstellen. Während dies einem garantiert, dass eine temporäre Datei nicht unterwandert wird, ermöglicht es dennoch einen einfachen Denial-of-Service-Angriff. Aus diesen Gründen wird empfohlen, stattdessen mktemp zu verwenden.
In einem Skript rufe ich mktemp so etwas wie
aufmydir=$(mktemp -d "${TMPDIR:-/tmp/}$(basename $0).XXXXXXXXXXXX")
die ein temporäres Verzeichnis erstellt, in dem ich arbeiten kann, und in dem ich den eigentlichen Dateien sicher einen lesbaren und nützlichen Namen geben kann.
mktemp
ist kein Standard, aber auf vielen Plattformen vorhanden. Die "X"s werden im Allgemeinen in eine gewisse Zufälligkeit umgewandelt, und mehr wird wahrscheinlich zufälliger sein; Einige Systeme (zum Beispiel Busybox Ash) schränken diese Zufälligkeit jedoch stärker ein als andere
Übrigens ist die sichere Erstellung temporärer Dateien nicht nur für Shell-Scripting wichtig. Deshalb hat Python tempfile, Perl hat File::Temp, Ruby hat Tempfile, etc…
Vielleicht möchten Sie sich mktemp
ansehen
Das Dienstprogramm mktemp nimmt die angegebene Dateinamenvorlage und überschreibt einen Teil davon, um einen eindeutigen Dateinamen zu erstellen. Die Vorlage kann ein beliebiger Dateiname mit einer Reihe von angehängten 'X' sein, zum Beispiel /tmp/tfile.XXXXXXXXXX. Die abschließenden „X“ werden durch eine Kombination aus der aktuellen Prozessnummer und zufälligen Buchstaben ersetzt.
Für weitere Details:man mktemp
Ja, mktemp verwenden.
Es erstellt eine temporäre Datei in einem Ordner, der zum Speichern temporärer Dateien vorgesehen ist, und garantiert Ihnen einen eindeutigen Namen. Es gibt den Namen dieser Datei aus:
> mktemp
/tmp/tmp.xx4mM3ePQY
>