복붙노트

PHP에서 데이터베이스 비밀번호를 보호하는 방법은 무엇입니까?

PHP

PHP에서 데이터베이스 비밀번호를 보호하는 방법은 무엇입니까?

PHP 응용 프로그램이 데이터베이스 연결을 만들 때 일반적으로 로그인과 암호를 전달해야합니다. 내 응용 프로그램에 단일, 최소 권한 로그인을 사용하고 있다면 PHP는 어딘가에 로그인과 암호를 알아야합니다. 암호를 보호하는 가장 좋은 방법은 무엇입니까? 그것은 단지 PHP 코드로 작성하는 것이 좋은 생각이 아닌 것 같습니다.

해결법

  1. ==============================

    1.

    몇몇 사람들은 데이터베이스에 암호를 저장하는 방법에 관한 질문으로 이것을 잘못 읽었습니다. 그건 잘못된 것입니다. 데이터베이스에 접속할 수있는 암호를 저장하는 방법에 관한 것입니다.

    일반적인 해결책은 암호를 소스 코드에서 구성 파일로 옮기는 것입니다. 그런 다음 관리를 떠나 시스템 관리자에게 구성 파일의 보안을 설정하십시오. 그렇게하면 개발자는 프로덕션 암호에 대해 알 필요가 없으며 소스 제어에 암호 기록이 없습니다.

  2. ==============================

    2.

    다른 사람의 서버에서 호스팅 중이며 웹 루트 외부에 액세스 권한이없는 경우 항상 암호 및 / 또는 데이터베이스 연결을 파일에 넣은 다음 .htaccess를 사용하여 파일을 잠글 수 있습니다.

    <files mypasswdfile>
    order allow,deny
    deny from all
    </files>
    
  3. ==============================

    3.

    웹 루트 외부의 파일에 저장합니다.

  4. ==============================

    4.

    가장 안전한 방법은 PHP 코드에 지정된 정보를 전혀 가지고 있지 않는 것입니다.

    아파치를 사용한다면 httpd.conf 또는 가상 호스트 파일 파일에 연결 세부 정보를 설정하는 것입니다. 그렇게하면 매개 변수없이 mysql_connect ()를 호출 할 수 있습니다. 이는 PHP가 결코 정보를 출력하지 않음을 의미합니다.

    이 파일에서 다음 값을 지정하는 방법입니다.

    php_value mysql.default.user      myusername
    php_value mysql.default.password  mypassword
    php_value mysql.default.host      server
    

    그런 다음 mysql 연결을 다음과 같이 엽니 다.

    <?php
    $db = mysqli_connect();
    

    또는 다음과 같이하십시오.

    <?php
    $db = mysqli_connect(ini_get("mysql.default.user"),
                         ini_get("mysql.default.password"),
                         ini_get("mysql.default.host"));
    
  5. ==============================

    5.

    매우 안전한 시스템의 경우, 구성 파일 (시스템 관리자가 보안 설정)에서 데이터베이스 암호를 암호화합니다. 응용 프로그램 / 서버 시작시 응용 프로그램은 시스템 관리자에게 암호 해독 키를 묻는 메시지를 표시합니다. 나중에 데이터베이스 암호는 구성 파일에서 읽고 해독되며 메모리에 저장됩니다. 아직 해독되지 않은 메모리에 저장되어 있기 때문에 100 % 안전하지는 않지만 어떤 시점에서는 '충분히 안전함'이라고해야합니다!

  6. ==============================

    6.

    이 솔루션은 개방형 및 폐쇄 형 소스 애플리케이션 모두에 유용하다는 점에서 일반적입니다.

    장점 :

    이 방법은 Heroku가 제안한 것으로 매우 성공적입니다.

  7. ==============================

    7.

    자격 증명이 저장된 동일한 파일에서 데이터베이스 연결을 만들 수있는 경우 connect 문에서 자격 증명을 인라인합니다.

    mysql_connect("localhost", "me", "mypass");
    

    그렇지 않으면 메모리에없는 자격 증명을 메모리에서 읽을 수 없기 때문에 connect 문 다음에 자격 증명을 설정 해제하는 것이 가장 좋습니다.

    include("/outside-webroot/db_settings.php");  
    mysql_connect("localhost", $db_user, $db_pass);  
    unset ($db_user, $db_pass);  
    
  8. ==============================

    8.

    데이터베이스에 액세스 할 때 암호가 필요하다고 말하면서 선택 사항이 제한적입니다. 일반적인 접근법 중 하나는 주 스크립트가 아닌 별도의 구성 파일에 사용자 이름과 암호를 저장하는 것입니다. 그런 다음 기본 웹 트리 외부에 저장하십시오. 그건 당신의 PHP 파일을 단순히 텍스트로 표시되는 웹 구성 문제가 있다면 당신이 암호를 노출하지 않은 실행되는 대신.

    그 외에도 사용중인 계정에 대한 최소한의 액세스 권한으로 올바른 행에 있습니다. 그것에 추가하십시오

    베드로

  9. ==============================

    9.

    OP는 데이터베이스 비밀번호를 의미한다고 생각합니다.

    누군가 FTP 나 SSH를 통해 서버에 액세스하지 않는 한 (이미 괴롭힘을 당했을 때) PHP 파일에 암호를 일반 텍스트로 저장하는 것에 대해 걱정하지 않아도됩니다. 필자가 본 대부분의 PHP 응용 프로그램은 그런 식으로 처리합니다 (예 : phpbb).

  10. ==============================

    10.

    데이터베이스 암호를 파일에 넣고 파일을 제공하는 사용자에게 읽기 전용으로 만듭니다.

    PHP 서버 프로세스 만 데이터베이스에 액세스 할 수있게하는 방법이 없다면 거의 모든 작업을 수행 할 수 있습니다.

  11. ==============================

    11.

    PostgreSQL을 사용하고 있다면 ~ / .pgpass에서 자동으로 암호를 찾습니다. 자세한 내용은 설명서를 참조하십시오.

  12. ==============================

    12.

    브라우저에서 오는 암호와 달리 데이터베이스 암호에 대해 말하는 경우 표준 연습은 데이터베이스의 암호를 서버의 PHP 구성 파일에 저장하는 것입니다.

    암호가 들어있는 PHP 파일에 적절한 권한이 있는지 확인하면됩니다. 나는. 웹 서버와 사용자 계정에서만 읽을 수 있어야합니다.

  13. ==============================

    13.

    이전에는 DB 사용자 / 설정 파일을 구성 파일에 저장했지만 이후로는 편집 적 공격 방식을 취했습니다 - 국방 심층 정책을 채택했습니다.

    응용 프로그램이 손상되면 사용자가 구성 파일에 대한 읽기 권한을 가지게되므로 크래커가이 정보를 읽을 가능성이 있습니다. 구성 파일은 버전 제어에 따라 잡힐 수도 있고 서버 주위로 복사 될 수도 있습니다.

    우리는 Apache VirtualHost에 설정된 환경 변수에 사용자 / 패스를 저장하도록 전환했습니다. 이 구성은 루트 사용자 만 읽을 수 있습니다. 아파치 사용자가 루트 권한으로 실행되지 않기를 바랍니다.

    이제 암호는 Global PHP 변수에 포함됩니다.

    이러한 위험을 줄이기 위해 다음 예방 조치를 취합니다.

  14. ==============================

    14.

    추가 트릭은 다음과 같은 PHP 별도의 구성 파일을 사용하는 것입니다.

    <?php exit() ?>
    
    [...]
    
    Plain text data including password
    

    이렇게해도 액세스 규칙을 올바르게 설정하지 못하는 것은 아닙니다. 그러나 웹 사이트가 해킹 된 경우 "필요"또는 "포함"은 첫 번째 줄에서 스크립트를 종료하므로 데이터를 가져 오는 것이 더 어렵습니다.

    그럼에도 불구하고 웹을 통해 액세스 할 수있는 디렉토리에 구성 파일을 두지 마십시오. 당신은 당신의 통제 코드, css, 그림 및 js를 포함하는 "웹"폴더가 있어야합니다. 그게 다야. 다른 것은 오프라인 폴더에 저장됩니다.

  15. ==============================

    15.

    가장 좋은 방법은 암호를 전혀 저장하지 않는 것입니다. 예를 들어 Windows 시스템에서 SQL Server에 연결하는 경우 통합 인증을 사용하여 현재 프로세스의 ID를 사용하여 암호없이 데이터베이스에 연결할 수 있습니다.

    암호로 연결해야하는 경우 먼저 강력한 암호화 (예 : AES-256 사용, 암호화 키 보호 또는 비대칭 암호화 사용)를 사용하여 암호를 암호화 한 다음 OS에 저장합니다. 구성 파일 (웹 디렉토리 외부)에 강력한 ACL이 있습니다.

  16. ==============================

    16.

    구성 파일에 어딘가에 넣는 것만이 일반적으로 수행됩니다. 다음 사항을 확인하십시오.

  17. ==============================

    17.

    우리는이 방법으로 그것을 해결했습니다 :

  18. from https://stackoverflow.com/questions/97984/how-to-secure-database-passwords-in-php by cc-by-sa and MIT lisence