구성 파일에 일반 텍스트로 mysql 암호를 저장하는 것보다 더 나은 접근 방식이 있습니까?
많은 PHP 프로그램이 사용자에게 mysql 암호를 일반 텍스트(문자열 또는 상수)로 응용 프로그램 루트의 구성 파일에 저장하도록 요구하는 것이 항상 저를 괴롭힙니다.
이렇게 오랜 세월이 흘렀는데도 이에 대한 더 나은 접근법은 없을까요?
지금까지 두 가지 최소한의 보안 향상을 달성했습니다.
.htaccess의 규칙을 사용하여 웹을 통해 파일을 읽을 수 없도록 합니다(php가 실패하거나 php 소스를 읽기 위한 보안 취약성이 있는 경우).
db connect(설정 해제) 후 메모리의 암호를 파괴합니다(보안 위반, 주입 등으로 인한 문자열 덤프를 방지하기 위해)
하지만 물론 둘 다 원래 문제를 해결하지는 못합니다.
다른 아이디어 감사합니다!
개인적으로 저는 데이터베이스 연결 세부 정보와 같은 중요한 정보를 웹 폴더 루트 외부의 config.ini 파일에 저장합니다.그러면 my index.php에서 다음을 수행할 수 있습니다.
$config = parse_ini_file('../config.ini');
즉, 서버가 실수로 PHP 스크립트를 일반 텍스트로 출력하기 시작하면 변수가 보이지 않으며(Facebook에서는 악명높게 이전에 발생한 적이 있음) PHP 스크립트만 변수에 액세스할 수 있습니다.
또한 .htaccess 파일이 이동되거나 파괴될 경우에 대비하여 .htaccess에 의존하지 않습니다.
주의, 2017년 2월 14일 추가: 이제 이와 같은 구성 매개 변수를 환경 변수로 저장하겠습니다.저는 한동안 .ini 파일 접근법을 사용하지 않았습니다.
암호가 필요하기 때문에 완벽한 보안은 없습니다.하지만 회복하는 것을 어렵게 만들 수 있습니다.
나는 환경 변수로 웹 구성에 약간의 해시를 넣었습니다.MYSQL_PASS_HASH
그런 다음 저는 다음과 같은 일을 합니다.md5(getenv('MYSQL_PASS_HASH').'gibberish$qwefsdf')
암호를 입력합니다.물론 너가 해야 할 것이다.unsetenv
그 후에 당신이 편집증적이라면.
암호는 문자 그대로 어딘가에 저장되지 않으며, 사용자의 웹 구성과 데이터베이스가 모두 포함된 경우에만 복구할 수 있습니다.
은 웹하지 마십시오)..htaccess
).
구성 파일을 문서 루트 외부에 보관하는 것은 구성 파일의 보안을 향상시키는 일반적인 방법입니다.
암호를 문서 루트 내의 일반 텍스트 파일에 저장해서는 안 됩니다.웹 서버를 보호하기 위한 추가 단계는 웹 서버를 구성하는 액세스 수준에 따라 달라집니다.
php.ini(또는 Apache 구성 또는 .htaccess의 ini 설정을 통해)에서 암호를 정의할 수 있습니다.또는 웹 서버를 시작할 때 환경에 설정합니다.
사용자가 제공한 암호를 쿼럼 인증과 함께 사용하여 암호를 해독하지 않는 한 암호를 암호화하는 것만으로는 의미가 없습니다. 그러나 인증되지 않은 세션이 DB에 액세스하는 것을 방지하고 쿼럼에 새 사용자를 추가해야 할 때 혼란스럽게 됩니다.
만약 그것이 저렴한 호스팅 패키지이고 당신이 문서 루트 밖에 접근할 수 있는 저장소가 없다면, 비밀번호를 php include 파일 안에 저장하는 것은 그것이 노출되는 것을 방지해야 합니다 (파일은 다운로드되는 대신 php에 의해 구문 분석될 것입니다).또는 파일 이름을 처음에 '.ht'로 간단히 지정하면 원격 액세스가 차단될 수 있습니다.
두 번째 옵션은 다소 중복됩니다. 다른 사용자가 코드에 그렇게 많은 손상을 줄 수 있다면 실행 중인 코드에서 암호를 추출할 필요가 없습니다.
정말로 그 문제에 대한 해결책이 없습니다.
c.
중요한 데이터를 적절하게 저장하는 것 외에도 필요한 권한만 가진 별도의 MySQL 사용자를 생성하고 액세스해야 하는 데이터베이스/테이블/뷰에 대한 액세스를 제한해야 합니다.또한 데이터베이스 서버는 웹 서버와 동일한 컴퓨터에서 실행되는 경우가 많으므로 로컬 액세스에 대한 액세스도 제한하십시오.따라서 단일 데이터베이스/테이블에서 데이터를 읽기만 하면 되는 경우 루트 권한을 가진 사용자를 사용하지 마십시오.
파일 보안을 위해 가용성을 희생하려면 구성 파일에서 암호를 꺼내어 부팅할 때 암호를 입력하고 글로벌 변수에 저장하도록 관리자에게 요청할 수 있습니다.
여전히 변수를 덤프할 수 있는 주입 공격으로부터 안전한지 확인해야 하며, 물론 부팅 프로세스에서 수동 단계를 수행해야 합니다.
웹 루트에 있을 필요는 없습니다.파일을 웹 루트 외부로 이동하고 이렇게 부를 수 있습니다.이는 웹에서 직접 파일을 호출할 수 없음을 의미합니다.
코드에 GET 데이터에서 필터링하지 않고 항목을 포함하는 등의 보안 결함이 있는 경우에도 해당 파일은 여전히 위험합니다.가장 중요한 것은 애플리케이션의 보안을 유지하는 것입니다.
.htaccess 파일에서 다음과 같은 환경 변수를 설정할 수 있습니다.
SetEnv DBuser sesame
SetEnv DBpass street
나중에 코드를 읽고 항목을 사용하고 삭제합니다.
언급URL : https://stackoverflow.com/questions/3354242/a-better-approach-than-storing-mysql-password-in-plain-text-in-config-file
'programing' 카테고리의 다른 글
시간 초과와 함께 사용자 입력 대기 중 (0) | 2023.09.05 |
---|---|
Powershell: Receive-Job에서 출력 가져오기 (0) | 2023.09.05 |
날짜 사이의 Laravel $q->where() (0) | 2023.09.05 |
문자열에서 따옴표를 제거하려면 어떻게 해야 합니까? (0) | 2023.09.05 |
ID 대신 이름으로 요소의 값을 가져오는 방법 (0) | 2023.09.05 |