2010-02-27 3 views
11

저는 현재 교회의 대학 그룹 웹 사이트에서 일하고 있습니다. 제가 쓰고있는 것에 대한 보안에 대해 조금 걱정하기 시작했습니다. 나는 어떤 종류의 쿼리를 할 때마다데이터베이스 연결을 안전하게하려면 어떻게합니까?

function dbConnect() 
    { 
    global $dbcon; 

    $dbInfo['server'] = "localhost"; 
    $dbInfo['database'] = "users"; 
    $dbInfo['username'] = "root"; 
    $dbInfo['password'] = "password"; 

    $con = "mysql:host=" . $dbInfo['server'] . "; dbname=" . $dbInfo['database']; 
    $dbcon = new PDO($con, $dbInfo['username'], $dbInfo['password']); 
    $dbcon->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
    $error = $dbcon->errorInfo(); 

    if($error[0] != "") 
    { 
    print "<p>DATABASE CONNECTION ERROR:</p>"; 
    print_r($error); 
    } 
    } 

가 데이터베이스에 연결 : 예를 들어,이 기능을 사용합니다. 필자는 항상 PDO 준비 문을 사용하여 사용자 입력으로부터 SQL 주입을 방지하고 htmlspecialchars를 사용하여 출력 전에 이스케이프 처리합니다. 제 질문은 이것입니다 : 데이터베이스의 사용자 이름과 암호를 어떻게 보호합니까? 다른 사람이 내 PHP 파일의 소스를 볼 수 있는지는 모르겠지만 할 수있는 경우, 내가 멍청 할 것이라고 상상할 수 있습니다. 나는 무엇을해야합니까?

+0

당신은이 질문에 절대적으로 맞습니다. Skilldrick은 정답을 가지고 있습니다. 민감한 데이터를 문서 루트 외부의 파일에 저장하십시오. 이것은 실제로 제가 PHP 역할을 맡을 때 제가 후보자에게 물어 본 질문입니다. – Draemon

+0

다른 하나는 데이터베이스 오류 문자열을 인쇄하는 것입니다. 프로덕션 환경에서 이와 같은 정보를 인쇄하지 않도록 다른 로깅 체계를 생각해 냈습니다. 시스템에 대한 세부 정보를 제공합니다. 프로덕션 인 경우 syslog 또는 파일에 로그인하거나 여가 시간에 검토 할 수 있도록 전자 메일을 보내십시오. – Josh

+0

누군가 내 웹 서버의 루트 디렉토리 외부에 파일을 저장하는 방법에 대한 정보를 찾으려면 올바른 방향으로 나를 가리킬 수 있습니까? @ 조쉬는 헤드 업에 감사드립니다. – JoeCortopassi

답변

9

데이터베이스 인증서를 문서 루트 외부의 파일에 두어야합니다. PHP가 무언가 엉망이되어 PHP가 구문 분석되지 않은 상태로 표시되면 아무도 자신의 암호를 볼 수 없습니다.

해결책은 간단하다 :

this article on the subject this article on the subject에서보세요.모든 중요한 데이터를 웹 서버의 문서 루트 외부에 배치하십시오. 많은 전문가들이 이제는 웹 코드의 문서 루트 밖에 PHP 코드의 전부는 아니더라도 대부분을 배치하도록 권유하고 있습니다. PHP는 웹 서버와 동일한 제한 사항으로 제한되지 않으므로 문서 루트와 같은 레벨에 디렉토리를 만들고 중요한 데이터와 코드를 모두 배치 할 수 있습니다.

+0

정확히. 나는 이것을 모르는 PHP 개발자를 고용하지 않을 것이다. – Draemon

+0

당신은 내가 별도의 PHP 파일에 넣고 페이지의 파일에 포함시켜야한다고 말하고 있습니까? 아니면 완전히 다른 무엇입니까? – JoeCortopassi

+0

@Cortopasta : 맞습니다.하지만 파일은 문서 루트 외부에 있어야합니다. 엄밀히 말하면 여러분은 그것을 포함 할 필요가 없습니다 : 설정 파일로 읽을 수는 있지만, 전통적으로 또 다른 PHP 파일 일 것입니다. – Draemon

7

좋아,이 몇 가지 설명이 필요합니다. 어떤 사람들은 중요한 자료를 문서 루트 외부에 두는 것을 제안했습니다. 이것은 일부 공로이지만 실용성에있어 다른 어떤 것보다 위약입니다.

잠재적 인 문제의 근원을 고려해야합니다.

  • 컴퓨터에 대한 셸 액세스 권한이있는 사용자는 사용자가 입력 한 위치에 관계없이 데이터베이스 연결 정보를 손상시킵니다. 승인 된 사용자와 쉘 액세스를 얻기 위해 취약점을 악용하는 사용자 모두를 포함 할 수 있습니다 (많은 일이있었습니다).

  • PHP가 사용되지 않거나 웹 서버가 속지 않는다면 PHP 파일이 원시 형식으로 제공 될 가능성이 있습니다. 문서 루트 외부에두면이 문제로부터 보호받을 수 있습니다.

  • 누군가가 어떻게 든 문서 루트에 PHP 스크립트를 작성하는 것은 기본적으로 쉘 액세스 권한이있는 사람과 동일하므로 아무 조치도 필요하지 않습니다. 웹 서버가이 손상된 경우

실제로, 당신의 설정 파일은 문서 루트 외부에있는 경우는 매우 어렵다 보호 할 것입니다.

데이터베이스 보안의 주요 요점은 인터넷에있는 누군가가 직접 연결할 수 없도록하는 것입니다. 이 작업은 방화벽을 사용하거나 데이터베이스를 개인 IP 주소에 바인딩하거나 데이터베이스를 개인 서버에 배치하여 수행 할 수 있습니다.

+0

그래서 나는 부주의하지는 않을거야/내 데이터베이스 연결을 이런 식으로 코딩하는 건 안전하지 않니? – JoeCortopassi

+0

@Cortopasta 아니, 네가하는 일은 꽤 표준이야. – cletus

+0

와우, 이건 너무 잘못입니다. 스킬 릭의 대답을보십시오. – Draemon

3

취할 수있는 예방 조치가 있습니다. 응용 프로그램이 할 수 있어야하는 것에 특정한 mySQL 사용자를 작성하십시오. 이렇게하면 사용자 이름과 암호가 유출 된 경우 공격자가 할 수있는 피해의 양을 제한 할 수 있습니다. 예를 들어, 사용자가 삽입, 업데이트, 선택 등을 할 수는 있지만 삭제는 허용하지 않습니다. 또한 언급 된 cletus처럼 데이터베이스는 외부에 액세스 할 수 없어야합니다. 공유 호스팅 환경에서 이는 일반적으로 db가 www 서버 또는 로컬 호스트에서만 연결될 수 있음을 의미합니다.

Re : kalpaitch, 가역 해시로 암호를 전달하지 마세요. 사람들은 당신의 출처를 보지 못한다.

관련 문제