2010-01-23 2 views
2

false를 반환는 is_writable() 나는 PHP 함수에 fwrite()에 문제를 기대하고 있습니다

$filename = 'rss.xml'; 

if (file_exists($filename)) { 
    echo "The file $filename exists"; 
} 

if (is_writable($filename)) { 
    $fp = fopen($filename, 'w'); 
    fwrite($fp, $feed); 
    fclose($fp); 
} 
else{ 
    echo '<br />not writable..'; 
    if(!is_readable($filename)){ 
    echo ' and not readable!'; 
    } 
} 

일단 스크립트 수익을 실행 꺼져있다.

(dv)에서 (mt) mediatemple.com에서 주최되고 (gs) 솔루션에서 호스팅되었을 때 스크립트가 제대로 작동했습니다.

내가 잘못 찾을 수없는 =/

+0

파일을 삭제하면 다시 만들 수 있습니까? (PHP가 실행중인 파일과 다른 사용자가 현재 파일을 소유하고있을 가능성이 있습니다.) –

답변

-1

CHMOD 0755는 파일 소유자 만이 쓸 수 있다는 것을 의미합니다 (그룹 및 다른 사용자가 읽고 실행할 수 있음). PHP의 사용자/그룹에 따라 CHMOD를 0775 또는 0777로 변경해야합니다.

+8

IMHO 설정 777은 보안상의 문제입니다. 사람들은 프로그래머가 파일 파마를 설정하게하는 hosters를 피해야합니다 777. 맞습니까? – Dan

+0

@Dan에 동의해야합니다.이 방법은 좋지 않습니다. –

+0

이 답변에서 녹색 체크 표시를 제거 할 수 있습니까? 이것은 올바른 해결책이 아니므로 사람들은 프로덕션 서버에서이 작업을 수행해서는 안됩니다. – pfrenssen

3

755 의미 :

  • rwx : 읽기, 쓰기,
  • r-x 소유자
  • 에 대한 실행 : 읽기,
  • r-x 그룹
  • 에 대한 실행 : 읽기, 다른 사람의 실행

따라서 누구나 파일 (및 실행)을 읽을 수 있지만 소유자 만 쓸 수 있습니다.

아마 파일을 소유 한 사용자가 PHP 스크립트를 실행하는 사용자가 아니겠습니까? 즉 귀하의 스크립트가 Apache 사용자에 의해 실행되는 동안 파일은 누구에게나 속할 수 있습니다 (종종 www-data)?


첫 번째 아이디어는 파일을 삭제하는 것입니다. 스크립트가 파일을 다시 만들려고합니다. 제대로 다시 생성 된 경우 (즉, Apache가 해당 지시어에 대해 write 권한을 필요로 함을 의미 함), 그 후에 수정할 수 있어야합니다.

그렇지 않으면 write 특권을 other으로 지정해야합니다. 스크립트가 파일 소유자가 아닌 다른 사용자에 의해 실행되고있는 경우; chmod o+w rss.xml 트릭을해야합니다.

0

755는 파일의 소유자가 수정할 수 있지만 다른 사람은 수정할 수 없음을 의미합니다. 소유자는 아마도 웹 서버가 아니라 자신 (귀하의 FTP 계정입니까?)이므로 PHP가 수정할 수 없습니다. 더 넓은 관점을 부여하십시오. 775로 시작하고 작동하지 않는 경우 777을 시도하십시오.

FTP 서버 계정과 동일한 사용자로 웹 서버를 실행하는 일부 웹 호스트가 있으므로 파일 사용 권한과 관련하여 지원 질문을받지는 못합니다. 내 생각에 이것은 큰 보안 구멍이다. Mediatemple은 웹 서버를 FTP 계정으로 실행하지 않는 것이 옳다고 생각합니다.

0

편집 : 파스칼 마틴과 다른 사람들이 지적했듯이, 755는 파일이 합법적으로 쓰기 가능하지 않다는 것을 의미 할 수도 있으며 사용자가 777이나 소유자를 변경해야 할 수도 있음을 간과했습니다. 모든 것이 올바르게 설정되어 있고 is_writable()이 여전히 false를 반환 할 경우에 대비하여이 대답을 남겨두고 있습니다. 이는 내가 가정하고있는 것입니다.

홀수 is_writable User Contributed Notes에는 이에 대한 간단한 토론이 있습니다. 거기에 게시하는 사람의 경우 PHP 5로 전환하면 해결됩니다 (서버/PHP/프로세스가 어떤 사용자 문제로 실행되는지는 의심 스럽지만).

당신이 시도 할 수있는 부분

  • posix_getuid()
  • 변경 당신이 정확한 사용자에 에 기록하려는 파일의 소유자 (다만 사용으로 실행되는 것을 사용자 PHP 찾아 group)
  • 이것이 작동한다면, 아마도 일종의 결함 일 수 있으며 fopen()을 시도하고 실패 할 경우 오류 메시지를 가로 챌 생각을해야 할 수도 있습니다.

물론 : 파일을 실제로 fwrite() 할 수 있습니까? 수표를 무시할 때 ?? 다른 hostings에

0

는 PHP가 실행 파일에 액세스 중 하나

OWNER 또는

그룹으로 또는

세계 최초의 변종 당신을위한 최선

보안.

이 지난 경우 파일 파마 (644)를 설정해야합니다 경우

- 666

왜 777을 설정하고 거기에만 데이터를 저장하면 경우 파일을 실행하게하는?

0

0777 권한으로 파일을 보관할 폴더를 만든 다음 낮은 권한 수준 0644로 파일을 저장합니다. 모든 본문에 폴더에 대한 액세스 권한이 있지만 모든 사람이 파일을 변경할 수있는 것은 아닙니다 (0644) = 그 것입니다. 내가 가장 좋은 해결책을 찾았습니다. 다른 덜 안전한 솔루션은 폴더를 만들지 않고 파일 권한을 666으로 변경하거나 일부 사람들이 좋아하는 것입니다. 777 = 좋지 않은 보안 솔루션