2009-06-26 6 views
2

저는 PHP 보안 문제에 초보자입니다. 누군가 내 코드로 보안 문제를보고했지만 세부 사항을 알려주지 않았습니다.Ajax 보안 질문 : JQuery ajax() + PHP scandir() = 보안 문제?

아래 코드는 압축 된 버전입니다. JQuery AJAX 함수를 사용하여 일부 데이터를 PHP scandir() 함수에서 사용하는 서버로 보냅니다.

보안 문제가 있습니까?

HTML 문서

<script 
    src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js"> 
</script> 
<script> 
$.ajax({ 
    type: "POST", 
    url: "example.php", 
    cache: false, 
    data: { 
     foo: "images", 
     bar: "something else", 
      }, 
    success: function(html){ 
    alert(html); 
    } 
}); 
</script> 

PHP 문서

<?php 

$foo = filter_var($_POST["foo"], FILTER_SANITIZE_STRING); 
$bar = filter_var($_POST["bar"], FILTER_SANITIZE_STRING); 

$foo = scandir($foo); 
$bar = (explode(",",$bar)); 

foreach ($foo as $a) { 
    echo "<img src='$foo/$a'>"; 
} 

?> 
당신은 잠재적으로 '갑'라는 악성 값을 게시하여 파일 시스템에있는 모든 파일의 목록을 얻을 수

답변

4

예, 당신의 컴퓨터에있는 모든 파일을 열거 할 수 허용 할 수 있습니다. 그리고 서버가 fopen wrappers을 통해 액세스 할 수있는 다른 컴퓨터 일 수도 있습니다. 이 정보는 더 많은 공격을 목표로 삼을 수 있도록 취약한 실행중인 소프트웨어 또는 중요한 파일을 식별하는 데 도움이 될 수 있습니다.

FILTER_SANITIZE_STRING은 파일 경로 참조가 아닌 HTML을 보호하기 위해 설계되었으므로 여기서는 도움이되지 않습니다. 백엔드 함수를 사용할 때가 아니라 생성 된 HTML에 대한 출력 필터로만 사용해야합니다.

:, @, .., \ 및 /와 같은 위험한 경로 토큰의 사용을 제한하고 싶습니다. 그러나 Tom Haigh의 예제 코드 에서처럼 안전하다고 생각하는 문자 나 값을 허용 목록에 추가하여이 작업을 수행하십시오.

1

- 경우 값 '/' HTML 소스에서 파일 시스템 루트에있는 모든 파일을 볼 수 있습니다. 이것은 open_basedir 제한 사항 때문에 항상 작동하지 않을 수도 있지만 여전히 좋은 생각은 아닙니다.

'foo'매개 변수를 먼저 살균하는 것이 해결책입니다. 특정 문자를 허용하거나에만 허용 디렉토리 이름의 화이트리스트 내에 존재하는 'foo는'값, 예컨대을 :

$foo = filter_var($_POST["foo"], FILTER_SANITIZE_STRING); 

if (!in_array($foo, array('allowed_dir1', 'allowed_dir2'))) { 
    //not valid, not in whitelist 
} 

//or 

if (!preg_match('/^[a-zA-Z0-9+]+$/', $foo)) { 
    //not valid, contains more than just letters and numbers 
} 
+0

"foo"값에 "/"또는 URL의 절대 경로가 포함되기를 바랍니다. 이렇게하면 이미지를 어디에서나 얻을 수 있습니다. 예를 들어 foo를 "http://www.somesite.com/directory/directory"와 같게 만들 수 있습니다. 이 작업을 수행 할 수있는 안전한 방법이 있습니까? 그렇지 않다면, 아마도 JavaScript 객체 & php doc에서 foo를 제거하고, 원하는 디렉토리를 getdir 함수에 직접 코딩 할 것을 요구할 것이다. 내 프로그램을 사용하는 페이지마다 별도의 PHP 파일을 만들어야하므로이 문제를 피하고 싶습니다. – edt

+0

"이 방법은 이미지를 어디에서나 얻을 수 있습니다."- 원격 사용자가 컴퓨터의 "아무 데나"파일을 볼 수있는 기능을 제공하고 싶지는 않습니다. 이미지 파일 만있는 경우. 파일에 이미지 확장명 (예 : "jpg")이 있기 때문에 이미지 데이터가 포함되어있는 것은 아닙니다. 악의적 인 공격자가 다른 취약점을 통해 코드를 남길 수 있습니다. 디자인과 요구 사항에 대해 다시 생각해 보시기 바랍니다. – Cheekysoft