CI 묻고 답하기

제목 사용자 파일 접근 제어 (htaccess 설정?)
글쓴이 수경 작성시각 2013/05/26 10:19:36
댓글 : 7 추천 : 0 스크랩 : 0 조회수 : 29712   RSS
너무 기초적인 질문일 수 있어서 부끄럽지만 어제부터 포럼 검색 및 구글링으로 원하는 결과를 얻을 수 없어서 이렇게 질문 남깁니다.

사용자가 업로드한 사진 등 개인파일을 usersdata란 이름의 폴더에 저장하고 있습니다.(이 폴더는 루트 바로 아래 최상단에서 CI의 application, system 폴더와 대등한 위치에 있습니다.) 문제는 무단링크나 주소 직접입력을 통해서 해당파일들에 접근을 할 수 있다는 것입니다. 어제부터 검색해서 알게 된 해결안으로는

1. 웹에서 불가능한 상위폴더에 해당 폴더를 위치시킨다 -> 웹호스팅을 쓰고 있어서 불가능합니다.

2. .htaccess 의 설정을 Deny from all 로 설정한다. -> CI application의 view 파일 등에서 호출을 해도 해당 파일을 불러올 수 없다는 문제가 발생합니다.

3. .htaccess 의 설정을 " Order deny,allow Deny from all Allow from 원하는주소 " 이런식으로 설정한다. -> 여전히 주소로 입력하면 파일이 노출되더군요.

어떻게 하면 될까요?ㅜㅜ 답변 부탁드립니다.

P.S 사실 해당폴더를 application 하에 두고 싶은데 application 의 .htaccess설정이 Deny from all 이 되어 있어서 view의 소스에서 baseurl("application/usersdata/a.gif") 뭐 이런식으로의 접근이 차단되는 것 같더군요. 이것도 어쩔 수 없는 것인지요?ㅠ
 다음글 ci 라이센스? 관련 질문입니다.. (2)
 이전글 인코딩 디코딩 (8)

댓글

/ 2013/05/27 09:36:35 / 추천 0
 

<IfModule mod_rewrite.c>
    RewriteEngine On
 RewriteBase /

RewriteCond %{REQUEST_URI} ^/files/(.*)$
RewriteRule (.*) [F]

 RewriteCond $1 !^(index\.php|images|captcha|data|include|uploads|robots\.txt)
 RewriteCond %{REQUEST_FILENAME} !-f
 RewriteCond %{REQUEST_FILENAME} !-d
 RewriteRule ^(.*)$ /index.php/$1 [L]
</IfModule>

포럼 기본 소스에

특정폴더 접근제한 추가한 파일입니다.

application 하에 두시는 것은

위 소스 조금 변경해서 해당 htaccess 에 적용하셔도 될듯하네요 (접근 거부 항목 추가 나머지 허용)



사월 / 2013/05/27 11:57:30 / 추천 0
 외부 링크 차단이 목적이라면 .htaccess 파일에서 HTTP_REFERER 로 특정 도메인만 허용하도록 설정할 수 있습니다.
pithecus / 2013/05/27 12:22:20 / 추천 0
 http://test.com/userdata/user1/profile.gif 라는 파일에 대한 접근제한 문제로 보입니다. 여러가지 경우로 나뉠 수 있을것 같은데

1. 위 경로의 데이터는 무조건 접근금지를 한다.
  이 경우에는 apache 의 deny from all 로 가능하겠습니다.

2. 조건부로 접근금지를 한다.
  글의 내용으로 봐서는 무조건이 아닌 특정한 경우에는 접근을 허용하는 것 같습니다. 이 특정한 경우에 따라 apache 에서 제어할 지 php 에서 제어할 지 달라질 것 같습니다.

2.1 특정 IP 에서의 허용
  apache 의 allow from 8.8.8.8 이렇게 허용할 수 있겠네요. 대신 ip 는 .htaccess 파일에 저장되어 있으니 허용할 ip 가 자주 변경되어야 한다면 추가적인 방법이 필요하겠네요. 

2.2 특정 URL, Referrer 의 허용
  위의 댓글들처럼 mod_rewrite 로 제어할 수 있겠네요.

만약 접근조건이 복합적이고 유동적으로 바뀌어야 한다면 실제 데이터의 저장경로와 그 데이터를 호출하는 url 을 분리해야 할 것 같습니다. 
수경 / 2013/05/28 08:09:19 / 추천 0

우선 답변주셔서 너무 감사드립니다.

글 작성한 날은 일요일이었고 지금은 이시간부터 또 문제해결하러 앉아있네요.ㅠㅠ

그러저나 제가 질문을 좀 부정확하게 했나봅니다.ㅠㅠ

요지는 특정폴더내의 파일을 CI의 소스에 의해서만 접근이 가능해야 한다는 것입니다.

외부링크 및 주소직접입력으로 해당파일이 접근이 되면 안되는 것이지요.

//사월
제 글의 3번대로 htaccess설정으로 특정도메인을 차단할 수는 있겠는데

그러면 제가 허용한 도메인을 포함한 주소입력으로는 해당파일에 접근이 가능하더군요.ㅠㅠ

제가 호스팅하고 있는 도메인이자 허용한 도메인이 test.com 이면 test.com/a.gif 하면 파일이 열립니다.

//pithecus

제 글의 2번대로

1. deny from all로 설정하면 CI의 소스에서도 해당파일에 접근이 안됩니다.

2-1. 사월님께 드린 답변과 동일합니다.

2-2. 특정 URL에 대한 허용은 사실상 특정IP에서의 허용과 같은 말이 아닌지요?

그리고 특정 Referrer에 대한 허용은 제가 무슨말인지 잘 모르겠는데 지금부터 이 부분을 공부해야겠네요.

//키
말씀해주신대로 루트폴더의 htaccess 설정을 한 후

(사실 RewriteCond $1 !^(img) 요거 한줄만 추가했습니다. - 이게 img 폴더는 허용하겠다 아닌지요?)

해당 img폴더에는 deny from all 을 걸어 놓았더니 여전히 CI 소스내에서도 자료를 불러오지 못하게 되네요.

제가 이해를 못하고 있는 부분이 있는지요?

특정폴더내의 파일들에 대해서,

제가 짠 CI 소스에 의해서만 불러오는 것이 가능하고 다른 모든 접근이 불가능했으면 좋겠습니다.

view파일 내의 php파일들은 load->view에 의해서만 호출이 가능하고 다른 모든 접속이 불가능한 것처럼요.

저도 지금부터 또 공부를 해보겠지만 며칠째 고생하고 있는거라 추가답변 부탁드립니다.ㅠㅠ

/ 2013/05/28 11:10:13 / 추천 0
수경 // 저도 rewrite_rule을 다 알지는 못하지만 (사실 거의 모릅니다.)

cond와 rule은 한 쌍으로 동작합니다.

cond를 작성 (이건 조건문 이라고 봐야겠죠) 하셨다면
rule로 해당 조건을 어떻게 처리 할 것인지도 작성을 해주셔야 됩니다.

적어주신 cond만으로는 허용이나 불가를 표현하지 않습니다.





rewrite로 막게 되면 웹을 통한 엑세스가 불가능해지니 다른 방법으로 불러오셔야 합니다.



view파일들은 상단에 보시면 php 코드로 ci를 통하지 않은 접속을 막는 부분이 있습니다.

그리고 view 파일은 웹을 통한 엑세스로 불러 오는 것이 아니라

include의 개념으로 내용을 불러 오는 것입니다.

이미지 파일과는 제어하는 방식 자체가 다릅니다.


php 파일이라면 이것을 참고해서 작업을 하셔야 하고

만약 이미지 파일이라든지 기타 파일이라면


구글검색을 통해 php로 파일다운로드를 어떻게 구현하는지 참고하셔서 작업하시면 될 것 같습니다.


"php download big file" 이런식으로 검색하면 비슷한 내용들이 좀 보이네요
pithecus / 2013/05/28 16:28:04 / 추천 0
아마도 CI 에서 이미지를 노출시키실때 원글에 있는 baseurl("application/usersdata/a.gif") 처럼 처리하셨을 것으로 보입니다.

데이터는 CI - php - apache - (인터넷) - 브라우저(사용자) 의 단계로 이동하기 때문에
deny from all 은 브라우저와 apache 에 해당하는 영역이지 php(또는 CI) 에는 영향을 줄 수 없습니다.

원글 " 2. .htaccess 의 설정을 Deny from all 로 설정한다. -> CI application의 view 파일 등에서 호출을 해도 해당 파일을 불러올 수 없다는 문제가 발생합니다. " 
<img src="<?=baseurl("userdata/a.gif")?>">
위와 같은 형식의 코드는 사실 CI
 가 해당 파일을 불러온다기 보다는, 브라우저가 test.com/userdata/a.gif 를 http 로 추가로 요청하는 경우 입니다. 이 때 deny from all 일 경우 해당 파일에 접근을 못하게 되는것이죠.

CI 의 코드를 통해서만 userdata 파일에 접근을 할 수 있게 하려면 deny from all 로 일반 접속을 못하게 막고 
//키 님의 댓글처럼 CI
 에서 다운로드를 구현해야 할 것으로 보입니다.

가령 이미지를 불러오는 쪽에서는
<img src="<?=baseurl("/downloads?file=userdata/a.gif")?>">
이렇게 하고 CI 에서는
//file: controller/downloads.php
function index(){
  $file = $this->input->get("file");
  $rawfile = file_get_contents("/fileroot/".$file);
  print $rawfile;
}
(조악한 소스지만) 이렇게 해당 경로의 파일을 직접 읽어서 출력시켜주는것도 하나의 방법일 겁니다.
대신 이런 방식의 경우 파일 크기가 1메가만 넘어가도 부하가 엄청날 수 있을테니 이 부분에 대해서도 추가적인 처리 방법이 필요할거고요.

수경 / 2013/05/30 00:26:15 / 추천 0

키 // 손수 검색할 키워드까지 알려주셔서 너무 감사드립니다.

pithecus // deny from all 이 브라우저와 apache에 해당하는 영역이란 걸 배운 것만으로도 엄청난 도움이 되었습니다. 감사합니다.

다시 작업해봐야겠네요.