IT

설치에 존재하지 않는 경우에만 고용주 파일 생성

lottoking 2020. 9. 14. 21:23
반응형

설치에 존재하지 않는 경우에만 고용주 파일 생성


해당 파일이 이미 존재하는지 여부에 따라 파일에 쓰고, 이미 존재하지 않는 경우에만 작성하고 싶습니다 (실제로 존재하지 않는 파일을 때까지 파일을 계속 시도하고 싶습니다).

다음 코드는 링크 인 공격자가 파일 테스트와 작성중인 파일 사이 에이 게시물 에서 제안한 것처럼 보이게 보여줍니다 . 코드가 충분히 높은 권한으로 실행하면 임의의 파일을 설치 쓸 수 있습니다.

이 문제를 해결하는 방법이 있습니까?

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')

편집 : Dave Jones의 답변 참조 : Python 3.3에서 플래그 x사용 open()하여이 기능을 제공 할 수 있습니다 .

아래의 원래 답변

예,하지만 Python의 표준 open()호출을 사용하지 않습니다 . 대신 사용 하여 기본 C 코드에 플래그를 사용할 수 있습니다.os.open()

특히 O_CREAT | O_EXCL. 내 유닉스 시스템의 open(2)아래 O_EXCL, 대한 사람이 페이지에서 :

이 호출이 파일을 생성하는지 확인합니다.이 플래그가와 함께 O_CREAT지정 open()하면 경로 이름이 이미 존재하지 않습니다. 지정 O_EXCL되지 않은 경우 의 동작 은 정의되지 않았습니다 O_CREAT.

이 두 플래그가 지정 될 기호 링크를 사용합니다. 경로 이름이 기호 링크이면 open()기호 링크가 위치에 관계없이 실패합니다.

O_EXCL2.6 이상에서 NFSv3 이상을 사용하는 경우 NFS에서만 지원됩니다. NFS O_EXCL지원이 제공되지 않는 환경에서는 잠금 작업을 수행하기 위해 NFS 지원에 의존하는 프로그램에 경쟁 조건이 포함됩니다.

하지만 AFAIK는 경쟁 조건을 피할 수있는 가장 가까운 방법입니다.

편집 : os.open()대신 사용하는 다른 규칙 open()여전히 적용됩니다. 특히, 읽기 또는 쓰기에 반환 된 파일 설명 자를 사용하려면 O_RDONLY, O_WRONLY또는 O_RDWR플래그 중 하나가 필요 합니다.

모든 플래그 O_*는 Python의 os모듈에 있으므로 등을 import os사용합니다 os.O_CREAT.

예 :

import os
import errno

flags = os.O_CREAT | os.O_EXCL | os.O_WRONLY

try:
    file_handle = os.open('filename', flags)
except OSError as e:
    if e.errno == errno.EEXIST:  # Failed as the file already exists.
        pass
    else:  # Something unexpected went wrong so reraise the exception.
        raise
else:  # No exception, so the file must have been created successfully.
    with os.fdopen(file_handle, 'w') as file_obj:
        # Using `os.fdopen` converts the handle to an object that acts like a
        # regular Python file object, and the `with` context manager means the
        # file will be automatically closed when we're done with it.
        file_obj.write("Look, ma, I'm writing to a new file!")

참고로 Python 3.3 은이 사용 사례를 다루기 'x'위해 open()함수에 모드를 구현합니다 (만들기 만, 파일이 있으면 실패). 점을 유의 'x'모드가 자체적으로 지정됩니다. 'wx'결과를 중복 ValueError으로 사용 'w'하는 경우 (호출이 성공하면 할 수있는 유일한 일은 파일에 쓰는 것입니다. 호출이 성공하면 존재할 수 없습니다) :

>>> f1 = open('new_binary_file', 'xb')
>>> f2 = open('new_text_file', 'x')

Python 3.2 이하 (Python 2.x 포함)의 경우 허용 된 답변을 참조하십시오 .


이 코드는 FILE이없는 경우 쉽게 생성합니다.

import os
if not os.path.exists('file'):
    open('file', 'w').close() 

참고 URL : https://stackoverflow.com/questions/10978869/safely-create-a-file-if-and-only-if-it-does-not-exist-with-python

반응형