program tip

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

radiobox 2020. 7. 29. 08:05
반응형

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 등) 작업을 수행하는 가장 일반적인 방법입니다 ( web.config파일이있는 ASP.NET과 같은 비 PHP 환경에서도 ). 또한 사이트의 파일을 복사하기 만하면 환경에서 환경으로 구성 값을 복사 할 수 있습니다. 이는 서버 설정 환경 변수 (매우 빨리 손실되거나 잊혀 질 수 있음)에 의존하는 것보다 유리합니다.

암호는 세계적으로 액세스 가능한 파일이 아니므로 웹에 액세스 할 수 없어야하므로 암호의 난독 화에 대해 걱정할 필요가 없습니다. 이것이 의미하는 것은 a) 웹 서버에 구성 파일을 제공하지 말라고 지시하십시오 ( 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 대신 config.php 파일의 이름을 지정하는 것이 좋습니다. 즉, 파일이 다운로드되지 않고 아무것도 반환하지 않습니다.


12 팩터 방식이 가치 있다고 생각 되면 환경에 구성을 저장하는 것이 좋습니다.

This has the added advantage of allowing you to write the exact same code when you're testing or otherwise in a non-production environment. If you want (or need) to change the database, or anything else, there's no need to modify your code - you just change the environment variables and you're good to go.


What I would do is to store only example config file in repository, like config.php.dist and don't put actual config.php under version control.


Good question. You could move the most sensitive pieces (e.g. keys/passwords) out as environment variables, but that would then just defer the problem to your server configuration (Which presumably is also in a repository).

You could also try to avoid passwords for stuff like the database, by making it password less and secure it behind a firewall instead. None of these are perfect solutions, but they are the approaches that I know about.


It is a good idea to move the password from code to a configuration file, so the password will not be in the repository. The idea to encrypt it in a configuration file is questionable, because the one who has the configuration file + PHP code that decrypts it can always run the code and get a clear-text password. Probably it would be better to keep the password in a configuration file as plain text and think how to protect the configuration file from unauthorized access.


I don't see all this problem here. If you are sharing a repository you don't probably want to hard code passwords and configuration. You should provide defaults one instead:

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

If you really want you can use and parse a .ini file but it's likely to be very slow compared to an array being set in the source code and doesn't really make that much sense to me.

Remember: the only thing you can trust is your source code, if they can get it, you are screwed anyway.


You can always create a configuration ini file using the function parse_ini_file.

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

반응형