2008-09-20 2 views
1

그때 이렇게하는 가장 좋은 방법이 무엇인지 물어 가고,하지만되었다 내가 그것도 필요가 있는지 여부를 질문해야했다. 나는 그것이 JSP 발달에서 한 번도 본 적이 없지만 PHP에서 일반적인 관행 인 것으로 보인다. 이것에 대한 추론은 무엇이며, 내가 이것을 막지 않으면, 무엇을 고려해야할까요?PHP에서는 "이 페이지를 직접로드하지 마십시오"라는 메시지가 실제로 필요합니까?

답변

7

이 다른 유사한 언어와 PHP에서 더 일반적인 이유는 PHP의 역사와 관련이있다. 초기 버전의 PHP는 "register_globals"설정을 기본값으로 사용했습니다 (실제로 초기 버전에서는 설정이되지 않았을 수도 있습니다). Register_globals는 쿼리 문자열에 따라 전역 변수를 정의하도록 PHP에 지시합니다. 그래서 당신은 thusly 히 이러한 스크립트를 조회하는 경우 : ". 바"

http://site.com/script.php?hello=world&foo=bar 

이 ... 스크립트가 자동으로 값 "세상"과 값을 $ foo에와 변수 $ 인사를 정의 할을

이러한 스크립트의 경우 키 변수의 이름을 알고 있으면 쿼리 문자열에 해당 변수를 지정하여 스크립트를 악용 할 수 있습니다. 해결책? 핵심 스크립트에서 일부 마법 문자열을 정의한 다음 모든 부속 스크립트에서 마법 문자열을 확인하고 거기에없는 경우 구제하십시오.

감사하게도 register_variables를 더 이상 사용하지 않는 사람은 거의 없지만 많은 스크립트는 여전히 잘못 작성되어 어리석은 가정을합니다.

필자는 개인적으로 symfony 프레임 워크를 사용하여 모든 것을 피합니다. (최소한 기본 설정에서는 컨트롤러와 템플릿을 웹 루트에서 제외 시켰습니다.) 유일한 진입 점은 전면 컨트롤러입니다.

+0

이것은 훌륭한 정보였습니다. 네이선 감사합니다! –

1

음,이 민감한 직접 웹 서버로 전송되는 것을 포함 방지하는 것입니다. 확실히 포괄적 인 보안 조치는 아니지만 특정 설정에 도움이 될 수 있습니다.

그러나 경우, 사용자는 또한 얼마나 많은 MVC의 PHP하지만 더 단지 보안 기능이 아닙니다 그것은 모든

0

에 도움이되지 않습니다, 자신의 스크립트에서 파일을 포함 할 수있는 위치에 있었다 기반 PHP 사이트 기능. 슈가 CRM의 예를 들어 당신이 모듈 파일을 호출한다면 이렇게 모든 종속성이로드되어 있는지 확인하기 위해, 컨트롤러, 뷰와 모델이 이전에로드되지 않았기 때문에 직접 페이지로드는 실패하고 당신도 어떤 DB를 설정/연결 정보가없는 것 사용자는 알려진 진입 점을 통과해야합니다. 즉, index.php

1

심각한 보안 대책이 아닌 404 페이지를 내보내지만 사이트의 내부 정보, 심지어 이름에 대한 정보 누출이 맘에 들지 않기 때문에 내부 파일들.

그러나 파일이 단지 기능이 포함 된 경우 다음 검사를 생략에 진짜 해가 없습니다

.

0

난 그냥 당신이 IIS, Web.config 파일을 사용하는 경우 아파치 다시 쓰기, .htaccess 파일을 사용하여 PHP에 대한 복제하거나 수있는 닷넷 MVC 시스템의 접근 방법을 발견했다. MVC 패턴으로

직접 영문에 액세스하는 사용자를 필요로 넣은 사람은 아니다 다음은 게재하지 않은 파일 및 404 대신 전송됩니다. 포함 된 파일 "inc.php"에 대한 명명 규칙이있는 경우 예를 들어 특정 폴더에 대해 * .inc.php 요청을 404로 리디렉션 할 수 있습니다. - Apache Rewrite 공급 장치에서 R = 404는 해당 HTTP 상태를 반환합니다. 귀하의 고객에게.

이 예제 중 일부는 도움이 될 수 Apache Rewrite Examples

2

외부 웹 루트의 모든 것을 포함하면 아무런 문제가되지 않습니다. 일 수 있습니다.

+0

index.php를 제외한 모든 것이 doc_root 아래에있는 프레임 워크를 작성했습니다 ... 왜 아무도 이것을하지 않는 이유를 이해할 수 없습니다. 그것의 안전하고 내 청소기를 누른 다음 내 설정 파일 중 하나가 실수로 읽을 수 있다면 걱정할 필요가. – David

+0

동일. 그것은 나에게도 똑같은 생각처럼 보였습니다. 그러나 이것은 제가 혼자이 사이트의 웹 루트 외부에서 포함하는 것을 권고 한 두 번째 시간입니다! – da5id

+0

데이비드 일 필요가 있습니까? :) – David

0

다른 답변에서 이미 언급했듯이이 작업을 수행하지 않아도됩니다. 파일이 웹 서버에 의해 제공되지 않아야한다면, 웹 폴더 안에 파일을 두어서는 안됩니다. Includes는 웹 루트 외부의 디렉토리에 위치해야합니다. 그것은 어려운

header("HTTP/1.0 404 Not Found"); 
exit; 

이렇게하지 않으면 : 그 외에도

는 페이지가 존재하지 않는 사용자에게 적절한 방법은, 사용 상태 (404)를 방출하는 것입니다 비인간 (예 : 검색 엔진)에서 일반 페이지와 비 페이지를 구분할 수 있습니다.

0

이것은 Google 툴바를 실행하는 사이트를 편집하는 경우 내부 PHP 파일을 찾아 검색 결과에 넣기 때문에 매우 중요합니다. 기껏해야 이것은 사용자에게 어색한 경험을 만들지 만, 프로그래머가 실수하면 데이터베이스 연결 정보를 나타낼 수 있습니다.

관련 문제