2010-03-18 3 views
5

이 접근 방식에 보안 결함이 있는지 궁금합니다. 나는 사용자가 파일을 업로드하고 다른 파일을 다운로드하도록 허용하는 코드를 작성 중이다. 이 파일들은 무엇이든 될 수 있습니다.이 코드 접근 방식의 보안 결함

  1. 사용자가 파일 (.php 파일을 포함한 모든 파일)을 업로드하면 사용자 이름이 md5 해시 (확장명이 제거됨)로 변경되고 서버에 저장됩니다. 해당하는 mySQL 항목이 작성됩니다.
  2. 파일을 다운로드하려는 사용자는 download.php를 사용하여 md5 파일이 전송 된 파일 (원래 이름)을 다운로드합니다.

누군가 위의 시나리오를 악용 할 수 있습니까?

+0

서버의 보안에 관심이 있으십니까? 아니면 고객의? 또는 (선호) 둘 다요? 실행 파일의 업로드/다운로드를 허용하면 수행 할 수있는 작업이 많지 않습니다 (확인, 어쩌면 바이러스 검색 프로그램). 그러나 예를 들어 스크립트? – VolkerK

+1

누군가가 .php 스크립트를 업로드하고 서버가 손상 될까봐 걱정됩니다. 클라이언트가 정말로 바이러스를 다운로드하는지 상관하지 않습니다. –

+1

download.php 스크립트가 직접 다운로드를 시작하는지 확인하십시오. 즉, 브라우저가 download.php_의 내용이 다운로드되는 파일의 내용과 정확히 일치해야한다는 것을 브라우저가 보는 방식입니다. 위에서 설명한 바와 같이 설명을하면, 어리석은 실수를 저 지르지 않는 한 괜찮을 것입니다. – Cam

답변

3

음, 이론적으로는 없습니다. 해당 시스템을 악용 할 수있는 방법이 없어야합니다. 그러나, 당신이 생각하지 못했을지도 모르는 몇 가지 것이 있습니다.

먼저 파일이 PHP 파일 (적절한 헤더가있는 readfile()이라고 가정)을 통해 다운로드되므로 사용자가 액세스 할 수없는 장소에 파일을 배치해야합니다. 아파치 서버에서 일반적으로 가장 쉬운 방법은 .htaccess 파일을 업로드 디렉토리에 넣고 "deny from all"을 사용하여 외부 액세스를 방지하는 것입니다. 사용자가 처음부터 외부에서 파일에 액세스 할 수 없다면 문제가되는 파일 확장자에 대해 실제로 걱정할 필요가 없습니다. (저장 목적으로 변경하면 여전히 좋은 아이디어입니다.)

두 번째로 해시 파일은 훌륭한 아이디어가 아닐 수도 있습니다. 결국 충돌이 발생할 수 있기 때문입니다. 두 파일의 해시가 같은 경우 어떻게할까요? 말할 필요도없이 해시를 계산하는 것은 느린쪽에, 특히 더 큰 파일 (이름이 아니라 파일 내용에서 계산 된 경우)에 조금 있습니다. 데이터베이스에 항목을 저장하기 때문에 auto_increment 필드와 같은 일종의 기본 키가 있다고 가정합니다. 해당 ID 번호를 충돌을 피하기위한 저장소의 파일 이름으로 사용하는 것이 좋습니다 (모름이있는 경우 마지막 삽입시 ID가 mysql_last_insert_id()을 통해 얻을 수 있음)

물론 문제가있을 수 있습니다. 파일을 다운로드하는 컴퓨터를 감염시킬 수있는 바이러스가 포함 된 파일이 있지만 실제로는이 질문의 범위를 벗어나며 서버 자체에는 아무런 영향을 미치지 않습니다.

+0

파일 크기 자체가 크거나 작 으면 파일 이름을 해싱하려고합니다. 예, 충돌이있을 수 있지만 파일 이름을 해시하면 테이블에 항목을 저장하지 않아도됩니다. –

+1

파일 이름을 해시하는 경우 동일한 파일 이름을 가진 두 파일이 서로 덮어 쓰게됩니다. 이것이 문제가되는지 아닌지는 당신이하려는 일에 달려 있습니다. 명심할 것. – Rithiur

+0

해쉬 (hash)하기 전에 파일 이름에'datetime'을 추가하는 것을 고려하십시오. 그러면 기존 파일을 덮어 쓸 가능성이 크게 줄어 듭니다. –

1

include/require 개 국어 파일의 경우 별도의 구멍 이므로 해시를 예측할 수 있습니다. 예.

그래서 기본적으로 아니오입니다. :-)

+0

+1, 무작위 또는 소금을 해시에 추가하는 것이 좋습니다. –

1

아무도 서버에서 파일을 실행하지 않는 한 꽤 안전하다고 보입니다.

+0

서버는 확장명없이 파일을 실행할 수 있습니까? .php 확장자가없는 PHP 파일이 있다고 가정하면이 파일을 실행할 수있는 서버가 있습니까? –

+0

"모든 서버"... 그래서, 얼마나 멀리 가져 왔는지 한 가지 예이면 충분할 수 있습니까? 그런 다음 http://httpd.apache.org/docs/2.2/mod/mod_mime_magic.html을 살펴보십시오. – VolkerK

+0

왜 그들은 개조를합니까? : –

0

기본 실행 파일이 아니며 임의의 해시가있는 다른 확장 프로그램 인 경우 악용 가능성이 없음을 보장합니다. PHP를 확장 기능에 할당하지 않도록하십시오.

+1

또한 웹에서 액세스 할 수없는 디렉토리에 파일을 저장하십시오 (따라서 download.php를 통해 이동해야 함). 또는 해당 디렉토리의 서버 구성에 NoExec 플래그도 설정하십시오. – Paolo

+1

동의. HTAcess에서는 다음과 같이 도움이 될 수 있습니다. RemoveHandler cgi-script .myextension – JonnyLitt

0

파일 확장명을 비 실행 파일로 변경하여 보안상의 허점이 있고 일부 파일에 액세스 할 수 있어도 파일 확장명을 실행할 수 없도록하는 것이 좋습니다. 그 외에도 어떤 방법으로 보안을 손상시킬 수있는 방법이 보이지 않습니다.

+0

그는 이미 확장 프로그램을 제거하겠다고 말했습니다. – janmoesen

1

예상대로 다운로드가 작동하려면 MIME 유형을 저장하고 Content-Disposition 헤더에 적절한 확장자를 가진 파일 이름을 생성해야합니다.이것은 또한 다운로드가 PHP에 의해 중재되어야 함을 의미합니다 (따라서 open_base_dir 외부에 삽입 할 수 없습니다).

코드를 검토하여 업로드 된 파일이 포함될 수 있는지 확인해야합니다.

관련 문제