그때 이렇게하는 가장 좋은 방법이 무엇인지 물어 가고,하지만되었다 내가 그것도 필요가 있는지 여부를 질문해야했다. 나는 그것이 JSP
발달에서 한 번도 본 적이 없지만 PHP
에서 일반적인 관행 인 것으로 보인다. 이것에 대한 추론은 무엇이며, 내가 이것을 막지 않으면, 무엇을 고려해야할까요?PHP에서는 "이 페이지를 직접로드하지 마십시오"라는 메시지가 실제로 필요합니까?
답변
이 다른 유사한 언어와 PHP에서 더 일반적인 이유는 PHP의 역사와 관련이있다. 초기 버전의 PHP는 "register_globals"설정을 기본값으로 사용했습니다 (실제로 초기 버전에서는 설정이되지 않았을 수도 있습니다). Register_globals는 쿼리 문자열에 따라 전역 변수를 정의하도록 PHP에 지시합니다. 그래서 당신은 thusly 히 이러한 스크립트를 조회하는 경우 : ". 바"
http://site.com/script.php?hello=world&foo=bar
이 ... 스크립트가 자동으로 값 "세상"과 값을 $ foo에와 변수 $ 인사를 정의 할을
이러한 스크립트의 경우 키 변수의 이름을 알고 있으면 쿼리 문자열에 해당 변수를 지정하여 스크립트를 악용 할 수 있습니다. 해결책? 핵심 스크립트에서 일부 마법 문자열을 정의한 다음 모든 부속 스크립트에서 마법 문자열을 확인하고 거기에없는 경우 구제하십시오.
감사하게도 register_variables를 더 이상 사용하지 않는 사람은 거의 없지만 많은 스크립트는 여전히 잘못 작성되어 어리석은 가정을합니다.
필자는 개인적으로 symfony 프레임 워크를 사용하여 모든 것을 피합니다. (최소한 기본 설정에서는 컨트롤러와 템플릿을 웹 루트에서 제외 시켰습니다.) 유일한 진입 점은 전면 컨트롤러입니다.
음,이 민감한 직접 웹 서버로 전송되는 것을 포함 방지하는 것입니다. 확실히 포괄적 인 보안 조치는 아니지만 특정 설정에 도움이 될 수 있습니다.
그러나 경우, 사용자는 또한 얼마나 많은 MVC의 PHP하지만 더 단지 보안 기능이 아닙니다 그것은 모든
에 도움이되지 않습니다, 자신의 스크립트에서 파일을 포함 할 수있는 위치에 있었다 기반 PHP 사이트 기능. 슈가 CRM의 예를 들어 당신이 모듈 파일을 호출한다면 이렇게 모든 종속성이로드되어 있는지 확인하기 위해, 컨트롤러, 뷰와 모델이 이전에로드되지 않았기 때문에 직접 페이지로드는 실패하고 당신도 어떤 DB를 설정/연결 정보가없는 것 사용자는 알려진 진입 점을 통과해야합니다. 즉, index.php
심각한 보안 대책이 아닌 404 페이지를 내보내지만 사이트의 내부 정보, 심지어 이름에 대한 정보 누출이 맘에 들지 않기 때문에 내부 파일들.
그러나 파일이 단지 기능이 포함 된 경우 다음 검사를 생략에 진짜 해가 없습니다
.난 그냥 당신이 IIS, Web.config 파일을 사용하는 경우 아파치 다시 쓰기, .htaccess 파일을 사용하여 PHP에 대한 복제하거나 수있는 닷넷 MVC 시스템의 접근 방법을 발견했다. MVC 패턴으로
직접 영문에 액세스하는 사용자를 필요로 넣은 사람은 아니다 다음은 게재하지 않은 파일 및 404 대신 전송됩니다. 포함 된 파일 "inc.php"에 대한 명명 규칙이있는 경우 예를 들어 특정 폴더에 대해 * .inc.php 요청을 404로 리디렉션 할 수 있습니다. - Apache Rewrite 공급 장치에서 R = 404는 해당 HTTP 상태를 반환합니다. 귀하의 고객에게.이 예제 중 일부는 도움이 될 수 Apache Rewrite Examples는
외부 웹 루트의 모든 것을 포함하면 아무런 문제가되지 않습니다. 은 일 수 있습니다.
다른 답변에서 이미 언급했듯이이 작업을 수행하지 않아도됩니다. 파일이 웹 서버에 의해 제공되지 않아야한다면, 웹 폴더 안에 파일을 두어서는 안됩니다. Includes는 웹 루트 외부의 디렉토리에 위치해야합니다. 그것은 어려운
header("HTTP/1.0 404 Not Found");
exit;
이렇게하지 않으면 : 그 외에도
는 페이지가 존재하지 않는 사용자에게 적절한 방법은, 사용 상태 (404)를 방출하는 것입니다 비인간 (예 : 검색 엔진)에서 일반 페이지와 비 페이지를 구분할 수 있습니다.
이것은 Google 툴바를 실행하는 사이트를 편집하는 경우 내부 PHP 파일을 찾아 검색 결과에 넣기 때문에 매우 중요합니다. 기껏해야 이것은 사용자에게 어색한 경험을 만들지 만, 프로그래머가 실수하면 데이터베이스 연결 정보를 나타낼 수 있습니다.
- 1. urllib2.urlopen()이 페이지를 실제로 가져 옵니까?
- 2. 실제로 Singleton이 필요합니까?
- 3. 관계 테이블이 실제로 필요합니까?
- 4. 이러한 DIV가 실제로 필요합니까?
- 5. CGI의 대안이 있습니까 (실제로 필요합니까)?
- 6. C# - 실제로 디버그 빌드가 필요합니까?
- 7. Ninject.MVC3에서 App_Start 콘텐츠가 실제로 필요합니까?
- 8. 이 메시지가 무엇입니까?
- 9. 이 구조체는 실제로 무엇을합니까?
- 10. Java에서 클래스 리포지토리를 만들고 실제로 필요합니까?
- 11. WinForms에 프레임 워크, 사용자 정의 메시지가 필요합니까?
- 12. GLES2 glBindAttribLocation()이 필요합니까?
- 13. 이 상황에서 컨트롤러가 필요합니까?
- 14. 무효로 변환 **이 필요합니까?
- 15. Parallel.ForEach에는 AsParallel()이 필요합니까?
- 16. 이 반복이 필요합니까?
- 17. 이 코드에는 MemoryBarrier가 필요합니까?
- 18. 이 계약을 증명하기 위해서는 무엇이 필요합니까? 필요합니까?
- 19. pom.xml의 maven "dependencies"가 실제로 필요합니까?
- 20. FSM을 구현하기 위해 함수 포인터가 실제로 필요합니까?
- 21. BlackBerry 푸시 알림 : TomCat/MySQL이 실제로 필요합니까?
- 22. JavaScript "window.onload"- "window"가 실제로 필요합니까?
- 23. Entity Framework에서 작업 단위 패턴이 실제로 필요합니까?
- 24. 하지만 실제로 텍스트 영역에 htmlentities가 필요합니까?
- 25. ASP.NET 레이블에 실제로 Text 특성이 필요합니까?
- 26. SQL Server - 실제로 몇 명의 사용자가 필요합니까?
- 27. PHP에서는 PDO :: PDOStatement-> bindParam()이 예상대로 작동합니까?
- 28. 이 pthread가 실제로 어떻게 작동합니까?
- 29. 이 테스트는 실제로 가치를 추가합니까? ...?
- 30. 이 코드는 실제로 다중 스레드입니까?
이것은 훌륭한 정보였습니다. 네이선 감사합니다! –