[php] htaccess로 폴더 및 파일에 대한 직접 액세스 거부

시나리오는 다음과 같습니다.

  • index.php루트 폴더에 파일 이 있습니다
  • 일부 파일은 폴더 index.php에 포함되어 있습니다 includes.
  • 1 개의 다른 파일 ( submit.php)이 양식 제출 조치를위한 루트 폴더에 있습니다.

includeshtaccess 로 폴더 의 파일에 대한 직접 사용자 액세스를 제한하고 싶습니다 . 또한 submit.php. 그러나 include는 index.php파일에서 작동 합니다. 마찬가지로 사용자가을 입력 www.domain.com/includes/somepage.php하면이를 제한합니다 (오류 페이지로 리디렉션 될 수 있음).



답변

includes폴더를 웹 루트 외부 로 이동 하지만 전체 includes폴더에 대한 직접 액세스를 차단하려는 경우 다음 .htaccess을 포함 하는 파일을 해당 폴더에 넣을 수 있습니다 .

deny from all

그렇게하면 해당 폴더에서 파일을 열 수는 없지만 아무런 문제없이 PHP에 포함시킬 수 있습니다.


답변

이것은 순수한 mod_rewrite기반 솔루션입니다.

RewriteRule ^(includes/|submit\.php) - [F,L,NC]

URI 중 하나가 포함 된 경우이 사용을 금지 오류가 표시됩니다 /includes/또는/submit.php


답변

Files 지시문을 사용하여 모든 파일에 대한 액세스를 허용하지 않은 다음 다시 사용하여 액세스 가능한 파일을 설정하십시오.

<Files ~ "^.*">
  Deny from all
</Files>

<Files ~ "^index\.php|css|js|.*\.png|.*\.jpg|.*\.gif">
  Allow from all
</Files>


답변

1 라이너 mod_alias 기반 솔루션 :

RedirectMatch 403 ^/folder/file.php$

/folder/file.php에 대해 금지 된 오류가 표시됩니다


답변

올바르게 이해하면 include 폴더에 대한 액세스를 거부하고 싶습니까?

include 폴더에 ‘DENY FROM ALL’지시문이있는 .htaccess가 트릭을 수행합니다.


답변

귀하의 Q는 jeroen과 anubhava의 솔루션이 파트 I에서 작동하여 / include에 대한 액세스를 거부하는 두 부분으로 구성됩니다. anubhava는 파트 II에도 적용됩니다. DOCROOT/.htaccess어쨌든 사용하기 때문에 후자를 선호 하며 이것은 모든 제어를 하나의 파일로 유지합니다.

그러나 내가 논의하고 싶지 않은 것은 “접근 거부”라는 개념이다 submit.php. 사용하지 않으려면submit.php 왜 DOCROOT에 있습니까? 여기에 대한 답변은 일부 양식에서 작업 대상으로 사용하고 스팸봇과 같이 양식이 직접 제출되지 않고 제출 될 때만 실행되기를 원한다고 생각합니다.

이것이 사실이라면 아누 바바의 파트 II를 사용할 수 없으므로 양식이 실패 할 수 있습니다. 여기서 할 수있는 일은 (i) .htaccess리퍼러가 자신의 색인 페이지인지 확인하기 위해 확인하는 것입니다.

RewriteCond %{HTTP_REFERRER} !=HTTP://www.domain.com/index.php   [NC]
RewriteRule ^submit\.php$    -                                   [F]

그리고 (ii) PHP index.php 양식 생성기에는 타임 스탬프 및 유효성 검사를위한 숨겨진 필드가 포함되어 있습니다. 유효성 검사는 타임 스탬프의 MD5의 첫 10 자이며 일부 내부 비밀 일 수 있습니다. 제출을 처리하면 (i) 타임 스탬프와 유효성 검사가 일치하는지 검증하고 (ii) 타임 스탬프가 현재 시간의 15 분 이내인지 확인할 수 있습니다.

이렇게하면 스패머가 유효한 타임 스탬프 / 검증 쌍을 얻을 수있는 유일한 실질적인 방법으로 스팸을 방지 할 수 있지만이 스크랩은 수명이 15 분에 불과합니다.


답변

더 높은 수준으로 설정된 다른 옵션에 따라 include 디렉토리의 .htaccess 파일에 다음을 넣어야 할 수도 있습니다.

Satisfy all
Order deny,allow
Deny from all

나는 상위 디렉토리가 라인을 포함하여 기본 인증을 정의했을 때 이것에 부딪쳤다.

Satisfy any

이로 인해 사용자가 인증되었으므로 거부가 모두 적용되지 않았습니다.