PHP에는 기본적으로 활성화되어 있는 허용_url_fopen이라는 구성 옵션이 있습니다. 이를 통해 다양한 유형의 리소스를 가리키고 이를 로컬 파일처럼 처리할 수 있습니다. 예를 들어,
<?php $contents = file_get_contents('http://example.org/'); ?>
URL을 읽어 페이지의 콘텐츠(HTML)를 얻을 수 있습니다.
5장에서 설명한 것처럼 오염된 데이터를 사용하여 include 및 require의 파일을 가리키는 경우 심각한 취약점이 발생할 수 있습니다. 실제로 저는 이 취약점이 공격자가 임의의 코드를 실행할 수 있게 해주기 때문에 PHP 애플리케이션에서 가장 위험한 취약점 중 하나라고 생각합니다.
약간 덜 심각하지만 표준 파일 시스템 기능에서 오염된 데이터를 사용하면 유사한 취약점이 발생할 수 있습니다.
<?php $contents = file_get_contents($_GET['filename']); ?>
이 예에서는 사용자가 file_get_contents( ) 동작을 수행하여 원격 리소스의 콘텐츠를 가져옵니다. 다음과 같은 요청을 고려해 보세요.
http://www.php.cn/… mple.org%2Fxss.html
이는 $content의 값이 오염되는 상황으로 이어진다. 이 값은 간접적으로 얻어지기 때문에 이 사실은 무시될 가능성이 높다. 이것이 바로 심층 방어 원칙이 파일 시스템을 원격 데이터 소스로 취급하고 $content 값을 입력으로 처리하여 필터링 메커니즘이 잠재적으로 상황을 바꿀 수 있는 이유입니다.
$content 값이 오염되었기 때문에 , 이는 크로스 사이트 스크립팅 취약점 및 SQL 주입 취약점을 포함한 다양한 보안 취약점으로 이어질 수 있습니다. 예를 들어 크로스 사이트 스크립팅 취약점의 예는 다음과 같습니다.
<?php $contents = file_get_contents($_GET['filename']); echo $contents; ?>
> 해결책은 오염된 데이터가 있는 파일 이름을 절대로 가리키지 않는 것입니다. 입력 필터링을 고집하고 데이터가 파일 이름을 가리키기 전에 필터링되었는지 확인하세요.
<?php $clean = array(); /* Filter Input ($_GET['filename']) */ $contents = file_get_contents($clean['filename']); ?>
$content의 데이터가 완전히 완벽하다는 보장은 없지만, 이는 읽고 있는 파일이 공격자가 지정한 파일이 아니라 읽으려고 했던 파일과 정확히 일치한다는 합리적인 보장을 제공합니다. 이 프로세스의 보안을 강화하려면 $content를 입력으로 처리하고 사용하기 전에 필터링해야 합니다.
아아앙
위의 프로세스는 다양한 공격을 방지할 수 있는 강력한 방법을 제공하므로 실제 프로그래밍에 사용하는 것이 좋습니다.
위 내용은 PHP 보안-원격 파일 위험에 대한 내용이며, 보다 자세한 내용은 PHP 중국어 홈페이지(www. php.cn)!