PHP 응용 프로그램이 데이터베이스 연결을 할 때는 물론 일반적으로 로그인과 암호를 전달해야합니다. 내 응용 프로그램에 단일 최소 권한 로그인을 사용하는 경우 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"));
ini_get()
.
but any user (or a hacker abusing badly written php script) can read the password via ini_get()
어떻게 처리합니까?
ini_get()
또는 getenv()
.
웹 루트 외부의 파일에 저장하십시오.
include('../otherDirectory/configfile.conf')
있습니까?
매우 안전한 시스템의 경우 구성 파일 (시스템 관리자가 자체적으로 보안)로 데이터베이스 비밀번호를 암호화합니다. 응용 프로그램 / 서버 시작시 응용 프로그램은 시스템 관리자에게 암호 해독 키를 요구합니다. 그런 다음 구성 파일에서 데이터베이스 비밀번호를 읽고 암호 해독 한 후 나중에 사용할 수 있도록 메모리에 저장합니다. 해독 된 메모리에 저장되어 있기 때문에 여전히 100 % 안전하지는 않지만 어느 시점에서 그것을 충분히 안전하다고해야합니다!
이 솔루션은 일반적으로 공개 소스 애플리케이션과 폐쇄 소스 애플리케이션 모두에 유용합니다.
장점 :
이 방법은 매우 성공적인 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);
데이터베이스에 액세스하기 위해 암호가 필요하다고 말했듯이 선택은 제한적입니다. 일반적인 접근 방법 중 하나는 사용자 이름과 비밀번호를 기본 스크립트가 아닌 별도의 구성 파일에 저장하는 것입니다. 그런 다음 기본 웹 트리 외부에 저장하십시오. PHP 파일이 실행되지 않고 단순히 텍스트로 표시되는 웹 구성 문제가있는 경우 암호를 노출하지 않았습니다.
그 외에는 사용중인 계정에 대한 최소한의 액세스 권한만으로 올바른 회선에 있습니다. 그것에 추가
베드로
이전에는 DB 사용자 / 패스를 구성 파일에 저장했지만 이후 심층 방어 정책을 채택하여 편집증 모드에 도달 했습니다 .
응용 프로그램이 손상된 경우 사용자는 구성 파일에 대한 읽기 권한을 가지므로 크래커가이 정보를 읽을 가능성이 있습니다. 구성 파일은 버전 제어에 걸리거나 서버에서 복사 될 수도 있습니다.
Apache VirtualHost에 설정된 환경 변수에 사용자 / 패스를 저장하도록 전환했습니다. 이 구성은 루트 만 읽을 수 있습니다. Apache 사용자가 루트로 실행되고 있지 않기를 바랍니다.
이것의 단점은 이제 암호가 전역 PHP 변수에 있다는 것입니다.
이 위험을 완화하기 위해 다음과 같은 예방책이 있습니다.
phpinfo()
비활성화되어 있습니다. PHPInfo는 환경 변수를 포함하여 모든 것에 대한 개요를 얻는 쉬운 대상입니다.브라우저에서 오는 암호와 달리 데이터베이스 암호에 대해 이야기하는 경우 표준 연습은 데이터베이스 암호를 서버의 PHP 구성 파일에 넣는 것 같습니다.
비밀번호가 포함 된 PHP 파일에 적절한 권한이 있는지 확인하면됩니다. 즉, 웹 서버와 사용자 계정으로 만 읽을 수 있어야합니다.
우리는 이것을 다음과 같이 해결했습니다.
추가 트릭은 다음과 같은 PHP 별도의 구성 파일을 사용하는 것입니다.
<?php exit() ?>
[...]
Plain text data including password
이것은 액세스 규칙을 올바르게 설정하는 것을 방해하지 않습니다. 그러나 웹 사이트가 해킹 된 경우 "필수"또는 "포함"은 첫 번째 줄에서 스크립트를 종료하기 때문에 데이터를 얻기가 훨씬 더 어렵습니다.
그럼에도 불구하고 웹을 통해 액세스 할 수있는 디렉토리에 구성 파일을 두지 마십시오. 제어 코드, CSS, 그림 및 JS가 포함 된 "Web"폴더가 있어야합니다. 그게 다야. 다른 것은 오프라인 폴더에 들어갑니다.
require
/ include
하지만 어떻게 할 방지하기 위해 fopen
?
가장 좋은 방법은 암호를 전혀 저장하지 않는 것입니다!
예를 들어 Windows 시스템에 있고 SQL Server에 연결하는 경우 통합 인증을 사용하여 현재 프로세스의 ID를 사용하여 암호없이 데이터베이스에 연결할 수 있습니다.
당신은 암호를 먼저 연결해야하는 경우 암호화 를 (예 : AES-256을 사용하고 암호화 키를 보호하거나 인증서를 보호하는 OS를 비대칭 암호화를 사용하고있다) 강력한 암호화를 사용하여 다음에 저장을 강력한 ACL 이있는 구성 파일 (웹 디렉토리 외부) .