2013-05-07 1 views
1

해당 PHP manual entry에 명시된 바와 같이 업로드가 post_max_size 제한을 초과하는 경우 PHP는 $_POST$_FILES을 삭제합니다.post_max_size를 초과하면 CakePHP blackholes 파일 업로드

나는 다음과 같은 형태를 가지고 있고, 나는 Security 구성 요소를 사용하고 있습니다 : 나는 큰 파일을 업로드 할 때 이제

echo $this->Form->create(false, array('type' => 'file', 'action' => '...')); 
echo $this->Form->file('documentFile'); 
echo $this->Form->end('Upload'); 

을 제한, 나는 "요청이 검은 전진하고있다"얻을 말했다 초과 CSRF 유효성 검증 실패로 인해 - 놀라운 일은 아닙니다. PHP가 $_POST을 지우면 CSRF 보호 토큰도 제거되기 때문입니다.

이 문제를 해결하기 위해 Security->unlockedActions을 사용할 수 있지만 이상적이지는 않습니다 (CSRF 보호 기능을 잃게됩니다). 이 경우 블랙 홀딩을 방지 할 수있는 방법이 있습니까?

편집 : 블랙 홀링을 트리거하는 데 필요한 파일 크기가 증가하지만 핵심 문제는 해결되지 않습니다.

+0

post_max_size를 늘리십시오. –

+0

@nathanhayfield하지만 해결 방법이 더 많습니다. 맞습니까? –

+0

큰 파일을 업로드하는 것이 목표가 아닌 경우 –

답변

2

좋아, 해결책을 찾았습니다.

if (
    ($this->request->isPost() || $this->request->isPut()) && 
    empty($_POST) && empty($_FILES) 
) { 
    $this->Security->csrfCheck = false; 
} 

아마이 다른 사람에게 소용이 :

나는 내 AppController::beforeFilter()에 다음을 추가했다.

0

하나의 가능한 문제점은 PHP.ini에서 upload_max_filesize가 너무 낮습니다. 너무 낮 으면 CSRF 오류가 발생하고 pr ($ this-> request-> data) 일 때 빈 배열이 생깁니다.

합리적인 것으로 제한을두면이 문제가 해결되었습니다.

+0

그래도 이것이 완벽한 해결책은 아닙니다. 제한을 2Gb로 설정한다고 가정 해 보겠습니다. 사용자는 계속해서> 2Gb (스크립트 실행 시간 제한 설정 등을 따로 설정)의 파일을 업로드하려고 시도 할 수 있습니다. 그러면 스크립트가 다시 실행됩니다. 그것은 오히려 가설적인 것입니다. 그러나 저는 확실한 해결책을 찾고 있었고 그것을 발견했습니다. (제 대답을보십시오). –