··조회 10,101
[re] php파일업로드기능에문제가있는듯합니다..
금지파일을 거르는 부분에는 문제가 없네요.
if(!strcmp($extension,"html") ||
!strcmp($extension,"htm") ||
!strcmp($extension,"php") ||
!strcmp($extension,"inc"))
{
$msg = "업로드가 금지된 파일입니다.";
}
strcmp 함수는 첫번째인자와 두번째 인자가 동일하면 0 을 리턴합니다.
그럼 확장자가 html or htm or php or inc 인 경우 0 이 리턴되겠죠.
그런데 앞에 !(not) 이 붙어있으니 참이 되죠.
따라서 경고창으로 "업로드가 금지된 파일입니다." 라고 뜰껍니다.
소스를 보니 문제가 경고창은 뜨는데 업로드는 된다는 거네요.
저 코딩라인 아래쪽에 보면 파일을 업로드하는 부분이 있습니다.
// 지정된 디렉토리에 파일 저장하는 부분
if(!copy($upfile,$target)) { // false일 경우
$msg = "파일 저장 실패";
}
// 임시 파일을 삭제하는 부분
if(!unlink($upfile)) { // false일 경우
$msg = "임시 파일 삭제 실패";
}
이 부분인데요. 위에서 금지파일을 검사하는 조건문과 파일업로드 하는
조건문이 분리되어 있죠? 그래서 경고창은 경고창대로 뜨고 업로드는
되는 겁니다.
단순히 해결하는 방법은 조건문을 하나로 묶어주는 겁니다.
현재 DJ보드의 파일을 업로드하는 부분을 보면...
금지 파일여부 확인
파일 중복여부 확인
파일 업로드
임시파일 삭제
이런 순서로 되어 있습니다. (현재는 다 단독 조건문으로 되어있죠.)
이걸 하나로 묶는겁니다.
if(금지파일여부 참){
$msg="금지파일";
}else{
if(파일중복 참){
$msg="파일중복";
}else{
if(파일업로드 실패){
$msg="업로드실패";
}
if(임시파일 삭제실패){
$msg="임시파일 삭제실패";
}
}
}
이런식으로 우선 금지파일여부를 체크하고 금지파일이 아닐경우(첫번째 else)에
파일중복체크!! 중복되지도 않았을 경우(두번째 else)에 파일을 업로드하면 되겠죠.
소스만 훑어본거라 맞는지는 모르겠습니다 .해보시고 안되면 다시 질문해주세요~!!
>파일업로드를테스트해보니 문제가있어 질문을드림니다
> up라는폴더를만들고 파일업로드를하면
>그러니까 금지된파일을업로드해도 up폴더에 내용이업로드되더군요;;
>그문제는 어떻게해결해야할지요..
>
>아래와같습니다 참조부탁드림니다
>if( 조건식 )
> {
>if문의형식이 틀린게아닌지요?
>두변수의 값을 || 연산해서 그값을 비교하여 실행하는것인데..
>어떻게해결하면 금지파일이 up폴더에 저장이되지않을까요?
> $filename = explode(".", $upfile_name);
> $extension = $filename[sizeof($filename)-1];
>
> if(!strcmp($extension,"html") ||
> !strcmp($extension,"htm") ||
> !strcmp($extension,"php") ||
>
if(!strcmp($extension,"html") ||
!strcmp($extension,"htm") ||
!strcmp($extension,"php") ||
!strcmp($extension,"inc"))
{
$msg = "업로드가 금지된 파일입니다.";
}
strcmp 함수는 첫번째인자와 두번째 인자가 동일하면 0 을 리턴합니다.
그럼 확장자가 html or htm or php or inc 인 경우 0 이 리턴되겠죠.
그런데 앞에 !(not) 이 붙어있으니 참이 되죠.
따라서 경고창으로 "업로드가 금지된 파일입니다." 라고 뜰껍니다.
소스를 보니 문제가 경고창은 뜨는데 업로드는 된다는 거네요.
저 코딩라인 아래쪽에 보면 파일을 업로드하는 부분이 있습니다.
// 지정된 디렉토리에 파일 저장하는 부분
if(!copy($upfile,$target)) { // false일 경우
$msg = "파일 저장 실패";
}
// 임시 파일을 삭제하는 부분
if(!unlink($upfile)) { // false일 경우
$msg = "임시 파일 삭제 실패";
}
이 부분인데요. 위에서 금지파일을 검사하는 조건문과 파일업로드 하는
조건문이 분리되어 있죠? 그래서 경고창은 경고창대로 뜨고 업로드는
되는 겁니다.
단순히 해결하는 방법은 조건문을 하나로 묶어주는 겁니다.
현재 DJ보드의 파일을 업로드하는 부분을 보면...
금지 파일여부 확인
파일 중복여부 확인
파일 업로드
임시파일 삭제
이런 순서로 되어 있습니다. (현재는 다 단독 조건문으로 되어있죠.)
이걸 하나로 묶는겁니다.
if(금지파일여부 참){
$msg="금지파일";
}else{
if(파일중복 참){
$msg="파일중복";
}else{
if(파일업로드 실패){
$msg="업로드실패";
}
if(임시파일 삭제실패){
$msg="임시파일 삭제실패";
}
}
}
이런식으로 우선 금지파일여부를 체크하고 금지파일이 아닐경우(첫번째 else)에
파일중복체크!! 중복되지도 않았을 경우(두번째 else)에 파일을 업로드하면 되겠죠.
소스만 훑어본거라 맞는지는 모르겠습니다 .해보시고 안되면 다시 질문해주세요~!!
>파일업로드를테스트해보니 문제가있어 질문을드림니다
> up라는폴더를만들고 파일업로드를하면
>그러니까 금지된파일을업로드해도 up폴더에 내용이업로드되더군요;;
>그문제는 어떻게해결해야할지요..
>
>아래와같습니다 참조부탁드림니다
>if( 조건식 )
> {
>if문의형식이 틀린게아닌지요?
>두변수의 값을 || 연산해서 그값을 비교하여 실행하는것인데..
>어떻게해결하면 금지파일이 up폴더에 저장이되지않을까요?
> $filename = explode(".", $upfile_name);
> $extension = $filename[sizeof($filename)-1];
>
> if(!strcmp($extension,"html") ||
> !strcmp($extension,"htm") ||
> !strcmp($extension,"php") ||
>
댓글 4
두리뭉실님께서 말씀하신 것과 같이 하면 아주 쉽게 해결되겠네요. 훨씬 간단하구요.
위에서 제가 설명드린 방식은 그에 비하면 초짜 방식입니다... (괜히 문장만 길어지구요...)
근데.. 병목님 너무 겸손하신거 아니신지... 제가 보기엔 제 방식이 무식해보이는걸요..;;; 플래그를 두는게 더 깔끔해 보여요!!! ㅡㅡ;;; 아하하하(초보티를 팍팍풍기는 뭉실....;;;;))))
저두얼릉 실력을키워서 누구의답변을 좀달라주면좋겠군요
저두 손병목님 두리뭉실님 처럼 누군과의답변을 달라줄만큼 실력이 되는날이 올까요?;;
정말감사드리구요 휴일 즐거운시간보내셔요^^