>백엔드 개발 >PHP 튜토리얼 >PHP 보안-소스코드 노출 (2)

PHP 보안-소스코드 노출 (2)

黄舟
黄舟원래의
2017-02-20 09:40:271751검색



소스코드 노출

귀하의 웹 서버는 귀하의 소스 코드를 읽고 실행할 수 있어야 합니다. 이는 누군가가 작성한 코드가 서버에 의해 실행될 때 귀하의 소스 코드도 읽을 수 있음을 의미합니다. 공유 호스팅에서 가장 큰 위험은 WEB 서버가 공유되기 때문에 다른 개발자가 작성한 PHP 코드가 임의의 파일을 읽을 수 있다는 것입니다.

아아앙


소스 코드가 있는 호스트에서 위 스크립트를 실행하면 공격자는 파일 값을 전체 경로 및 파일 이름으로 지정하여 웹 서버가 모든 파일을 읽고 표시하도록 할 수 있습니다. 예를 들어 스크립트 이름이 file.php이고 호스트 example.org에 있다고 가정하면 /path/to/source.php 파일의 내용은 다음 링크에 액세스하여 노출될 수 있습니다.

http://www.php.cn/

물론 이 간단한 코드가 작동하려면 공격자는 소스 코드가 어디에 있는지 정확히 알아야 하지만 공격자는 전체 파일 시스템을 탐색할 수 있는 더 복잡한 스크립트를 작성할 수도 있습니다. 이러한 스크립트에 대해서는 이 장 뒷부분의 예를 참조하십시오.

이 문제에 대한 완벽한 해결책은 없습니다. 5장에서 논의한 것처럼, 홈 웹 디렉토리 외부에 저장된 코드를 포함하여 모든 소스 코드가 공개라는 점을 고려해야 합니다.

가장 좋은 방법은 모든 민감한 데이터를 데이터베이스에 보관하는 것입니다. 이는 일부 코드 작성에 복잡성을 더해 주지만 민감한 데이터가 노출되는 것을 방지하는 가장 좋은 방법입니다. 불행히도 또 다른 문제가 있습니다. 데이터베이스 액세스 비밀번호를 저장하는 방법은 무엇입니까?

웹사이트 메인 디렉토리 외부에 저장된 db.inc 파일을 살펴보세요:

 <?php
 
  header(&#39;Content-Type: text/plain&#39;);
  readfile($_GET[&#39;file&#39;]);
 
  ?>


파일 경로가 알려지거나 추측되는 경우 서버의 다른 사용자가 해당 파일에 액세스하여 데이터베이스 액세스 권한을 얻게 되어 데이터베이스에 저장한 모든 데이터가 노출될 가능성이 있습니다.

이 문제에 대한 가장 좋은 해결책은 시스템 관리자만 읽을 수 있는 파일에 데이터베이스 액세스 권한을 다음 형식으로 저장하는 것입니다.

 <?php
 
  $db_user = &#39;myuser&#39;;
  $db_pass = &#39;mypass&#39;;
  $db_host = &#39;localhost&#39;;
 
  $db = mysql_connect($db_host, $db_user,
$db_pass);
 
  ?>


SetEnv는 Apache 명령입니다. 위 파일은 데이터베이스 사용자 이름과 비밀번호를 각각 나타내는 두 개의 Apache 환경 변수를 생성한다는 의미입니다. 물론 이 트릭의 핵심은 시스템 관리자만 파일을 읽을 수 있다는 것입니다. 시스템 관리자로 로그인할 수 없는 경우 위와 유사한 보호 방법인 본인만 파일을 읽을 수 있도록 제한할 수 있습니다.

아아앙


이는 악의적인 스크립트가 데이터에 액세스하는 것을 효과적으로 방지하므로 데이터베이스에 보관된 민감한 데이터의 보안에 심각한 위험이 없습니다.

이 파일이 작동하려면 PHP를 통해 해당 데이터에 액세스할 수 있어야 합니다. 이 목표를 달성하려면 httpd.conf에 다음 포함 문장을 작성해야 합니다.

 SetEnv DB_USER "myuser"
  SetEnv DB_PASS "mypass"


주의할 점은 이 문장을 VirtualHost 영역에 삽입해야 하며 그렇지 않으면 다른 사용자가 해당 콘텐츠를 얻을 수 있다는 점입니다.

Apache의 상위 프로세스는 시스템 관리자로 실행되므로(포트 80에 바인딩해야 함) 구성 파일을 읽을 수 있지만 서버 요청을 처리하는(PHP 스크립트 실행) 하위 프로세스는 파일을 읽을 수 없습니다.

$_SERVER 슈퍼 전역 배열을 통해 이 두 변수에 액세스할 수 있으므로 db.inc에서는 데이터베이스 권한을 명시하는 대신 $_SERVER 변수만 참조하면 됩니다.

 $ chmod 600 db.conf
  $ ls db.conf
  -rw-------  1 chris chris 48 May 21 12:34
db.conf


파일이 노출되더라도 데이터베이스 액세스는 손상되지 않습니다. 이는 공유 호스팅에 대한 주요 보안 개선 사항이자 독립 호스팅에 대한 심층적인 방어 방법이기도 합니다.

위 기술을 사용할 때 데이터베이스 액세스 권한은 $_SERVER 슈퍼 공용 배열에 있습니다. 이를 위해서는 일반 방문자가 phpinfo()를 실행하여 $_SERVER의 내용이 노출되는 것을 방지해야 합니다.

물론 이 기술을 사용하여 모든 정보(데이터베이스 액세스뿐만 아니라)를 보호할 수 있지만, 특히 이 기술을 사용하려면 호스팅 공급자의 지원이 필요하기 때문에 대부분의 데이터를 데이터베이스에 저장하는 것이 더 편리하다고 생각합니다.

위 내용은 PHP 보안-소스코드 노출(2) 내용입니다. 더 많은 관련 내용은 PHP 중국어 홈페이지(www.php.cn)를 참고해주세요!


성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.