2012-05-10 5 views
8

는 내가하고 있어요 : 나는 기본적으로 한 번 로그인 PHP로 작성된 로그인 페이지로 보안 웹 사이트를 만들 필요가안전하게 서버에 파일을 저장하는 방법

, 당신은 검색 창을 가질 수 읽기 정수로 변환하고 데이터를 이름으로 숫자를 가진 이미지를 검색하는 PHP 스크립트로 보냅니다.

(내가 검색 할이 서버에 수천 이미지를 저장됩니다 - 재고 이미지)

- 나는 도움이 필요 무엇

: 내 연구에서

, I 속도와 비효율 때문에 실제 이미지를 저장하기 위해 MySQL과 같은 데이터베이스를 사용하지 않는다는 것을 이해하십시오. 데이터베이스에 저장하지 않고 제안 된대로 서버의 파일 시스템에 남겨 두는 경우 누군가가 주소 표시 줄에 직접 URL을 입력하면 내 서버의 파일로 가져 오지 않겠습니까?

어떻게 보호합니까? 로그인 페이지를 성공적으로 통과하지 않고도 내 서버에서 파일을 볼 수있는 파일이 없습니다.

어떤 도움을 주셔서 감사합니다. 통찰력이나 제안 사항을 보내 주시면 감사하겠습니다. 앞으로는 더욱 복잡한 정보가 추가 될 것이므로이 점이 중요합니다.

+2

HTTP를 통해 액세스 할 수없는 디렉토리가있을 수 있으며 사용자가 로그온했는지 여부를 확인하는 PHP 스크립트를 사용할 수 있습니다. 그렇다면 지정된 디렉토리에서 파일을 읽고 출력합니다. –

+0

"public_html"폴더 외부에 파일을 남기고 읽었습니다. http에서 완전히 액세스 할 수 없습니까? 내 PHP 스크립트는 어떻게 파일에 액세스 할 수 있습니까? – DMor

+0

'public_html'은 대개 cPanel에서 Apache를 사용할 때 파일이 제공되는 디렉토리입니다. 즉,'http : // yoursite.com'을 입력하면 데이터는'/ var/www/username/public_html'에서 가져옵니다. 즉, URL에 입력 한 내용이 있으면,/var/www/username은 ** 접근 할 수 없다는 것을 의미합니다. 또한'/ var/www/username/files'와 같이 거기에 생성 할 디렉토리도 접근 할 수 없다는 것을 의미합니다. PHP 스크립트에서'file_get_contents ('/ var/www/username/files/imagename.extension');와 같은 것으로 접근 할 수 있습니다. –

답변

6

A는 방법 O를 권장 PHP (또는 다른 스크립트)를 통한 파일 다운로드 처리는 소위 'X-Sendfile'응답 헤더를 사용하는 것입니다.

PHP 스크립트가 인증을 처리하고 유효성 검증이 완료되면 웹 서버에 파일을 전달하도록 지시하는 'X-Sendfile'과 함께 몇 개의 응답 헤더를 설정합니다. 스크립트가 끝나고 웹 서버가 인계합니다.

http://www.jasny.net/articles/how-i-php-x-sendfile/

+1

이것에 대해 살펴 보겠습니다. 감사합니다. – DMor

0

당신이 그것을 자원 쓰기 이런 식으로 할 수는 출력 데이터를 이미지 파일을 읽고, 당신은 RequestID가 얻을 및 데이터베이스의 실제 링크 (로컬 링크)를 읽을 해당 파일이

image.php?requestid=..... 

으로 PHP에서 봉사 브라우저

$id = $_GET['requestid']; 
$link = get_local_link_from_id($id); // return /images/file1.png...... 
$data = file_get_contents($link); 
header('Content-Type', 'image/png'); 
echo $data; 

하지만 난 그냥 무작위로 파일의 이름을 변경하고 많이 만들고, 그렇게하지한다고 생각합니다 ....

+0

그들은 원래 번호를 유지해야합니다. 그것은 제 시스템이 아니고, 저를 고용 한 사람이 요청한대로입니다. 그리고 이것은 충분히 안전합니까? 내 PHP 스크립트가 요청을 필터링하는 한 정확합니까? – DMor

+0

GET은 안전하지 않으며 POST도 보안을 위해 충분하지 않을 수도 있습니다. – ilhnctn

+0

@ilis - 의견이 무엇입니까? GET 및 POST는 HTTP에서 사용되는 메소드이며 사용자 입력을 해석 할 때 오용 될 경우에만 "안전하지 않습니다". –

1

이 당신의 situtation에 대한 잔인한 수도 있지만, 내가 내가 개발하고 응용 프로그램에 그 일에 대해 생각하고 어떻게는 다음과 같습니다 :

간단한 예를 들어 여기를 참조하십시오

처음 누군가가 웹 서버에 요청을 보낼 때 서버 4 대, 웹 서버, 미들웨어 서버 및 데이터 서버가 있습니다.

웹 서버는 미들웨어 서버에 연결하여 파일을 요청하고 세션 키와 요청 된 파일과 같은 사용자 자격 증명. 미들웨어는 db에 연결하고 사용자가 해당 파일에 권한을 부여한 세션을 검증합니다. 오류가 있거나 액세스 할 수있는 경우 이진 데이터를 반환합니다. 웹 서버와 미들웨어 서버 모두에서 출력 버퍼링을 해제하면 미들웨어 서버에서 웹 서버로 100K 블록을 보내고 웹 서버는 두 번째 블록을 수신하는 동안 첫 번째 블록을 출력합니다.

파일 자체가 FTP, SFTP를, 또는 다른 파일 공유를 통해 데이터베이스 서버에 저장할 수 있습니다

확실히 X-에 sendfile을 사용하는 것만 큼 효율적 아니지만, 누군가가 당신의 웹 서버를 PWN 수 있다면, 그들은 것이다 여전히 파일에 대한 액세스 권한이 없습니다. 위의 시나리오에서 그렇습니다. 웹 서버는 유일한 공개 서버이므로 나머지 서버는 사설 네트워크에 연결해야합니다.

당신은 또한 암호화/사람이, 내가 관심이 개선하는 방법에 대한 아이디어가있는 경우 실제 파일 데이터

의 암호를 해독 할 암호화 데이터를 서버로 보낼 수 있습니다.

+0

흥미 롭군요. 그러나 이것은 필자가 필요로하는 것보다 확실히 더 복잡합니다. (그러나 읽는 것은 흥미 롭습니다). 솔직히 .htaccess에 대해 몰랐고 전체 폴더를 보는 것을 차단할 수 있습니다. 나는 이미 이것을 구현했다. 나는 데이터를 취하는 HTML 로그인 폼을 가지고 유효성이 확인되면 사용자를 검색 페이지로 보내는 사용자의 유효성을 검사하는 처리 스크립트로 보낸다. 사용자는 항목 #을 입력하고 파일 경로 및 기타 정보를 보유하고있는 번호를 기본 키로 사용하여 데이터베이스에 액세스하는 다른 처리 스크립트로 전송됩니다. 존재하는 경우, 파일 경로 – DMor

+0

을 가져옵니다. 이미지 폴더는 .htaccess ("DENY FROM ALL")로 보호됩니다. 나는 또한 SSL을 사용하고 MySQL DB에있는 이미지에 관한 다른 정보를 저장한다. – DMor

관련 문제