>  기사  >  백엔드 개발  >  PHP 데이터베이스 보안 - 설계, 연결 및 암호화

PHP 데이터베이스 보안 - 설계, 연결 및 암호화

伊谢尔伦
伊谢尔伦원래의
2016-11-22 10:43:521887검색

데이터베이스 디자인

타사 데이터베이스 서비스를 사용하지 않는 한 일반적으로 첫 번째 단계는 데이터베이스를 만드는 것입니다. 데이터베이스가 생성되면 새 문을 실행하고 생성할 소유자가 할당됩니다. 일반적으로 소유자(또는 수퍼유저)만이 데이터베이스의 개체에 대해 임의 작업을 수행할 수 있는 권한을 갖습니다. 다른 사용자가 사용하도록 하려면 권한을 부여해야 합니다.

애플리케이션은 데이터베이스 소유자 또는 슈퍼유저 계정을 사용하여 데이터베이스에 연결해서는 안 됩니다. 이러한 계정은 데이터베이스 구조 수정(예: 테이블 삭제) 또는 전체 데이터베이스 내용 지우기와 같은 임의의 작업을 수행할 수 있기 때문입니다.

프로그램의 각 측면에 대해 별도의 데이터베이스 계정을 생성해야 하며 데이터베이스 개체에 대해 매우 제한된 권한을 부여해야 합니다. 동일한 사용자가 다른 사용자의 작업을 완료할 수 없도록 방지하려면 해당 기능을 완료하는 데 필요한 권한만 할당하세요. 이런 방식으로 공격자가 프로그램 취약점을 악용하여 데이터베이스에 접근하더라도 해당 프로그램과 동일한 범위의 영향만 미칠 수 있습니다.

사용자가 웹 애플리케이션(예: 사용자 스크립트)에서 모든 트랜잭션 논리를 구현하지 않도록 권장합니다. 이는 뷰, 트리거 또는 규칙을 사용하여 데이터베이스 수준에서 수행하는 것이 가장 좋습니다. 시스템이 업그레이드되면 데이터베이스에 대해 새 인터페이스를 열어야 하며 모든 데이터베이스 클라이언트를 다시 실행해야 합니다. 이 외에도 트리거는 필드를 투명하고 자동으로 처리할 수 있으며 프로그램을 디버깅하고 사실을 추적할 때 유용한 정보를 제공합니다.

데이터베이스에 연결

SSL 암호화 기술을 기반으로 연결을 설정하면 클라이언트와 서버 간의 통신 보안을 강화할 수 있으며, SSH를 사용하여 클라이언트 간의 연결을 암호화할 수도 있습니다. 그리고 데이터베이스. 이러한 기술을 사용하면 공격자가 서버 통신을 모니터링하거나 데이터베이스 정보를 얻는 것이 어려워집니다.

암호화된 저장 모델

SSL/SSH는 클라이언트와 서버 간에 교환되는 데이터를 보호할 수 있지만 SSL/SSH는 이미 데이터베이스에 있는 데이터를 보호할 수 없습니다. SSL은 단순히 네트워크 데이터 스트림을 암호화하는 프로토콜입니다.

공격자가 웹 서버를 우회하여 데이터베이스에 직접 접근할 경우 데이터베이스 자체가 해당 정보를 보호하지 않는 한 민감한 데이터가 노출되거나 오용될 수 있습니다. 데이터베이스 내의 데이터를 암호화하는 것은 이러한 유형의 위험을 줄이는 효과적인 방법이지만 이러한 암호화 기능을 제공하는 데이터베이스는 거의 없습니다.

이 문제에 대한 간단한 해결책이 있습니다. 자체 암호화 메커니즘을 만든 다음 이를 PHP 프로그램에서 사용하는 것입니다. PHP에는 다양한 암호화 알고리즘이 포함된 Mcrypt 및 Mhash와 같이 이를 수행할 수 있는 여러 확장 라이브러리가 있습니다. 스크립트는 데이터를 데이터베이스에 삽입하기 전에 데이터를 암호화하고 나중에 추출할 때 해독합니다.

진짜 숨겨진 데이터의 경우 일반 텍스트 형식으로 존재할 필요가 없다면(즉, 표시할 필요가 없다면) 해시 알고리즘 사용을 고려할 수 있습니다. 해싱 알고리즘을 사용하는 가장 일반적인 예는 원래 일반 텍스트 비밀번호를 대체하기 위해 MD5로 암호화된 비밀번호 해시를 데이터베이스에 저장하는 것입니다.

예시#1 비밀번호 필드의 해시 암호화

<?php
    // 存储密码散列
    $query = sprintf("INSERT INTO users(name,pwd) VALUES(&#39;%s&#39;,&#39;%s&#39;);",
    pg_escape_string($username), md5($password));
    $result = pg_query($connection, $query);
    // 发送请求来验证用户密码
    $query = sprintf("SELECT 1 FROM users WHERE name=&#39;%s&#39; AND pwd=&#39;%s&#39;;",
    pg_escape_string($username), md5($password));
    $result = pg_query($connection, $query);
    if (pg_num_rows($result) > 0) {
        echo &#39;Welcome, $username!&#39;;
    } else {
        echo &#39;Authentication failed for $username.&#39;;
    }
?>


성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.