2010-07-25 8 views
4

피규어 PHP의 이름 바꾸기가 최선의 방법입니다. 나는 상대 URL을 사용하는 방법에 대한 많은 예제를 보지 못 했으므로 다소 공격을 받았다. 어느 쪽이든,이 거부 나에게 권한을 부여 :파일 이동 및 이름 바꾸기

나는이 작업을 수행 할 수 :

$file = "../data.csv"; 
rename("$file", "../history/newname.csv"); 

물론 ../ 스크립트가 실행 된중인 위치에서 다시 한 디렉토리 갈 것 곳.

$file = "data.csv"; 
$path = dirname(realpath("../".$file)); 
rename("$path/$file", "$path/history/newname.csv"); 

내가 (예 역사 폴더가 www가 데이터에 의해 소유되고 권한을 거부 얻고 그러나이 예 data.csv이 : 나는 그래서이 대신했다 ... 방법을 알아낼 수 없었다 www- 데이터 소유). 여전히 권한이 거부되었다 ...

rename('tempfile.txt', 'tempfile2.txt'); 

와 나는 확실히 www가 데이터 tempfile.txt 완벽하게 제어 할 수 있었다했다 : 나는 그래서 간단한 테스트를 시도했다가 이상한 생각했다. 왜? 파일의 이름을 변경해야합니까? linux의 mv처럼 이름을 바꿀 수 있습니까? 그래서 대신 copy() 및 unlink()를 사용 하시겠습니까?

답변

4

"../"에서 "../history/"로 파일을 이동하려면 프로세스에 "../"및 "../history/"에 대한 쓰기 권한이 필요합니다.

예에서 분명히 "../"에 대한 쓰기 권한이 없습니다. 이동중인 파일에 대한 사용 권한은 관련성이 없습니다.

1

소유권뿐만 아니라 파일 사용 권한도 있습니다. 소스 파일과 대상 디렉토리 (예 : chmod 644 data.csv)에 사용 권한이 올바르게 설정되어 있는지 확인하십시오.

www-data은 Apache와 동일한 사용자입니까?

편집 : 테이크 케어 realpath()기존의 절대 경로를을 제공합니다. 또한, 다음의주의 : 파일 ../data.csv이 존재하지 않을 수도 있기 때문, 아무 것도 얻을 수 없을 수도 있습니다

$path = dirname(realpath("../".$file)); 

. 즉, 존재하지 않는 파일의 realpath()의 결과는 false입니다. 그는 요청이 곳으로 이름이 변경되는 파일 조작 변경할 수 있기 때문에,

$file = "data.csv"; 
$path1 = realpath($file); 
$path2 = realpath(dirname($file).'/..').'/history/newname.csv'; 
rename($path1, $path2); 

당신은 $file는 방문자가 편집 할 수없는 것이 매우 조심해야한다 :

여기 당신을 위해 잘 작동 수있는 몇 가지 코드입니다.

+3

CSV 파일을 실행해서는 안되기 때문에 사실 '644'가 좋습니다. –

+0

예 chmod가 644인데, 나는 그것을 작동 시키려고 777을 시도했습니다. 아무것도 작동하지 않습니다. 아파치는 www- 데이터입니다. 다른 물건을 이동시키고 www- 데이터가 필요하기 때문에 이것을 압니다. 플러스 체크를했습니다. – ParoX

+0

data.csv의 전체 경로는 /var/imvu/products/ht/clients/test/data.csv입니다. 여기서/var /는 root가 소유하고 있으며, test는 wwwftp가 소유하고 있습니다. ftp를 루트로). 또한 내가 말했듯이, 그것의가는 (역사)가 www- 데이터에 의해 소유되는 곳. – ParoX