programing

PHP 및 MySQL - 소스 코드에서 암호를 피하는 방법

goodcopy 2022. 11. 7. 22:51
반응형

PHP 및 MySQL - 소스 코드에서 암호를 피하는 방법

MySQL 데이터베이스에 데이터를 저장하는 작은 PHP 애플리케이션이 있습니다.현재 사용자 이름/비밀번호는 PHP 코드로 하드 코딩되어 있습니다.예를 들어 저장소에서도 코드를 사용할 수 있기 때문에 별로 마음에 들지 않는 상황입니다.

가장 좋은 방법은 데이터를 코드에서 컨피규레이션파일로 이동하고(저장소에서 제외), 어떻게든 인코딩하는 것입니다.따라서 직접 읽을 수 없습니다(암독화).문제 해결을 위한 더 좋고 쉬운 방법이 없을까요?

$link = mysql_connect('localhost', 'mysql_user', 'mysql_password');
if (!$link) { 
    die('Could not connect: ' . mysql_error());
}
mysql_select_db('mydb');

범위: 견고하면서도 사용하기 쉬운 솔루션을 구축하고 싶다.나는 합리적인 보안을 원하지만, 나는 여기서 극비 데이터를 다루지 않는다.

「」는 사용하지 .mysql_connect함수는 스택 오버플로우 질문을 참조하십시오.왜 PHP에서 mysql_ 함수사용하면 안 되는가?*.코드 예제를 변경할 수도 있었지만, 코멘트 중에는 이것을 언급하는 코멘트가 있기 때문에 변경하지 않았습니다.그러나 질문의 원래 성격은 여전히 유효합니다.

가장 쉬운 방법은 말씀하신 대로 컨피규레이션파일을 사용하는 것입니다.

많은 프레임워크(Zend, CakePHP, Kohana 등)가 이것을 사용하고 있으며, 이것은 가장 일반적인 작업 방식입니다(ASP와 같은 비 PHP 환경에서도 마찬가지).NET과web.config파일)을 클릭합니다.이것에 의해, 사이트용의 파일을 카피하는 것만으로, 환경간에 설정치를 카피할 수도 있습니다.이는 서버 셋업 환경변수에 의존하는 것에 비해 메리트가 있습니다(매우 빨리 없어지거나 잊어버릴 수 있습니다).

패스워드의 난독화는 걱정할 필요가 없습니다.전세계에서 액세스 할 수 있는 파일이 아니기 때문에, Web에서는 액세스 할 수 없습니다.즉, 웹 서버에 컨피규레이션파일을 제공하지 않도록 지시합니다(IIS는 이미 이 작업을web.config파일화하여 콘텐츠 대신 HTTP 404.8 상태를 제공합니다.) 또는 b) 웹 서비스 디렉토리 외부로 이동합니다.다른 사용자가 컨피규레이션파일을 볼 수 있는 경우 소스 코드에 있는 것보다 더 나빠집니다.

또한 기본(빈/기본) 버전의 구성 파일을 환경별로 분리하여 운영, 개발 및 테스트 플랫폼에 다른 구성 파일을 사용하는 것도 좋습니다.

환경변수는 다음 코드와 같이 이들 환경을 구별하는 가장 일반적인 방법입니다.

// Check if it's been set by the web server
if (!empty($_ENV['ENVIRONMENT'])) {
    // Copy from web server to PHP constant
    define('ENVIRONMENT', $_ENV['ENVIRONMENT']);
}

if (!defined('ENVIRONMENT')) {
    // Default to development
    define('ENVIRONMENT', 'development');
}

// Load in default configuration values
require_once 'config.default.php';

// Load in the overridden configuration file for this environment
require_once 'config.' . ENVIRONMENT . '.php';

또 하나의 일반적인 방법은 XML 컨피규레이션파일을 사용하여 필요한 값만 읽어내는 것입니다(컨피규레이션파일의 캐시 카피를 메모리에 격납).이것은 PHP 파일을 임의로 포함시키는 것이 아니라 특정 값으로만 로드하는 것으로 매우 쉽게 제한될 수 있으며, 내 생각에 전반적으로 더 나은 해결책이지만, 위와 같이 하면 올바른 방향으로 시작할 수 있을 것입니다.

VCS에서 파일을 무시하도록 할 수 있습니다.한편, 파일의 스켈레톤 또는 적절한 디폴트(물론 로그인 데이터에는 적용되지 않음)를 버전 제어하고 싶은 경우가 있습니다.이 문제를 해결하는 일반적인 방법은 체크인된 템플릿컨피규레이션파일이 있는 것입니다.설치 절차에서는 이 파일을 실제 컨피규레이션파일 위치에 복사하여 커스터마이즈합니다.이것은 수동 또는 자동화된 프로세스일 수 있습니다.

(주요 질문과는 다소 무관하지만, 환경에 상수를 도입하면 라이브 SMTP가 아닌 가짜 메일의 실장을 연기하는 등 다른 멋진 작업을 할 수 있습니다.물론 이것은 컨피규레이션파일로도 가능합니다.)

Apache를 사용하는 경우 가상 호스트 구성에 정보를 저장하는 매우 좋은 솔루션이 있습니다.

SetEnv  MYSQL_USER     "xx"
SetEnv  MYSQL_PASSWORD "y2wrg435yw8"

는 쉽게 수 .$_ENV[]코드에 사용할 수 있습니다.

다른 사용자가 언급했듯이 소스 제어 이외의 별도의 구성 파일에 저장합니다(이것은 소스 제어 하에 있는 코드로 언급됩니다).

파일 구성 이름을 지정하는 것도 좋습니다.config.ini가 아닌 php를 사용합니다.즉, 디렉토리가 실수로 노출되었을 경우 파일은 다운로드되지 않고 아무것도 반환되지 않습니다.

12 팩터의 방법이 중요하다고 생각되는 경우는, 환경내에 설정을 보존하는 것을 추천합니다.

이를 통해 테스트 중이거나 운영 환경 이외의 환경에서 동일한 코드를 작성할 수 있다는 장점이 있습니다.데이터베이스를 변경하거나 다른 것을 변경할 필요가 있는 경우 코드를 변경할 필요가 없습니다.환경변수만 변경하면 됩니다.

예를 들어 config.php.dist 등의 Config.dist 파일만 저장소에 저장하고 실제 Config.php.dist는 저장하지 않습니다.php는 버전 관리 하에 있습니다.

좋은 질문입니다.환경변수로서 가장 기밀성이 높은 부분(키나 패스워드 등)을 이동할 수 있습니다만, 그렇게 되면 문제가 서버 설정(저장소에도 있을 가능성이 있습니다)으로 미뤄집니다.

또, 패스워드를 작게 해, 대신에 파이어 월(fire wall)로 보호함으로써, 데이타베이스등의 패스워드를 회피할 수도 있습니다.이들 중 어느 것도 완벽한 솔루션은 아니지만, 제가 알고 있는 접근 방식입니다.

암호는 저장소에 저장되지 않도록 암호에서 구성 파일로 이동하는 것이 좋습니다.컨피규레이션파일에 암호화하는 것은 의문입니다.컨피규레이션파일과 그것을 복호화하는 PHP 코드를 가진 사람은 언제든지 코드를 실행하고 클리어 텍스트 비밀번호를 얻을 수 있기 때문입니다.아마도 컨피규레이션파일에 패스워드를 플레인텍스트로 유지하고 컨피규레이션파일을 부정 액세스로부터 보호하는 방법을 검토하는 것이 좋습니다.

이 모든 문제가 여기 있는 것 같지 않아요.저장소를 공유하는 경우 암호 및 구성을 하드 코드하지 않을 수 있습니다.대신 기본값1 을 지정해야 합니다.

host: localhost
user: root
pass: root
name: db

필요한 경우 를 사용하여.ini소스 코드에 어레이가 설정되어 있는 것에 비하면 매우 느릴 가능성이 높기 때문에 그다지 납득이 가지 않습니다.

기억하십시오. 신뢰할 수 있는 것은 소스 코드뿐입니다.그들이 그것을 얻을 수 있다면, 어쨌든 당신은 망한 것입니다.

parse_ini_file 함수를 사용하여 언제든지 구성 ini 파일을 만들 수 있습니다.

언급URL : https://stackoverflow.com/questions/15088979/php-and-mysql-how-to-avoid-password-in-source-code

반응형