Chcę pisać do pliku na podstawie tego, czy ten plik już istnieje, czy nie, pisząc tylko wtedy, gdy jeszcze nie istnieje (w praktyce chciałbym próbować dalej, aż znajdę taki, który nie istnieje).
Poniższy kod przedstawia sposób, w jaki potencjalnie atakujący może wstawić łącze symboliczne, zgodnie z sugestią w tym poście, pomiędzy testem pliku a zapisywanym plikiem. Jeśli kod jest uruchamiany z wystarczająco wysokimi uprawnieniami, może to spowodować nadpisanie dowolnego pliku.
Czy jest jakiś sposób na rozwiązanie tego problemu?
import os
import errno
file_to_be_attacked = 'important_file'
with open(file_to_be_attacked, 'w') as f:
f.write('Some important content!\n')
test_file = 'testfile'
try:
with open(test_file) as f: pass
except IOError, e:
# symlink created here
os.symlink(file_to_be_attacked, test_file)
if e.errno != errno.ENOENT:
raise
else:
with open(test_file, 'w') as f:
f.write('Hello, kthxbye!\n')