[php] PHP에서 데이터베이스 비밀번호를 보호하는 방법?

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



답변

여러 사람들이 데이터베이스에 비밀번호 를 저장 하는 방법에 대한 질문으로 이것을 잘못 읽었습니다 . 그건 잘못이야 그것은 당신이 얻을 수 있습니다 암호를 저장하는 방법에 관한 것입니다 데이터베이스를.

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


답변

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

<files mypasswdfile>
order allow,deny
deny from all
</files>


답변

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

Apache를 사용하는 경우 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"));


답변

웹 루트 외부의 파일에 저장하십시오.


답변

매우 안전한 시스템의 경우 구성 파일 (시스템 관리자가 자체적으로 보안)로 데이터베이스 비밀번호를 암호화합니다. 응용 프로그램 / 서버 시작시 응용 프로그램은 시스템 관리자에게 암호 해독 키를 요구합니다. 그런 다음 구성 파일에서 데이터베이스 비밀번호를 읽고 암호 해독 한 후 나중에 사용할 수 있도록 메모리에 저장합니다. 해독 된 메모리에 저장되어 있기 때문에 여전히 100 % 안전하지는 않지만 어느 시점에서 그것을 충분히 안전하다고해야합니다!


답변

이 솔루션은 일반적으로 공개 소스 애플리케이션과 폐쇄 소스 애플리케이션 모두에 유용합니다.

  1. 응용 프로그램의 OS 사용자를 작성하십시오. http://en.wikipedia.org/wiki/Principle_of_least_privilege 참조
  2. 비밀번호를 사용하여 해당 사용자에 대한 (비 세션) OS 환경 변수를 작성하십시오.
  3. 해당 사용자로 애플리케이션을 실행하십시오.

장점 :

  1. 실수로 비밀번호를 소스 제어에 체크인하지 않습니다.
  2. 실수로 파일 권한을 망치지 않습니다. 글쎄, 당신은 할 수 있지만, 이것에는 영향을 미치지 않습니다.
  3. 루트 또는 해당 사용자 만 읽을 수 있습니다. 어쨌든 루트는 모든 파일과 암호화 키를 읽을 수 있습니다.
  4. 암호화를 사용하는 경우 키를 어떻게 안전하게 저장합니까?
  5. x- 플랫폼 작동
  6. envvar를 신뢰할 수없는 자식 프로세스로 전달하지 마십시오.

이 방법은 매우 성공적인 Heroku가 제안합니다.


답변

신임 정보가 저장된 동일한 파일에서 데이터베이스 연결을 작성할 수있는 경우. 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);