The Pursuit of Happyness

PHP 모범 사례 3


http://www.hanbit.co.kr/book/look.html?isbn=978-89-6848-225-0


- 데이터베이스

-- PDO 사용 (PHP data objects)

단일한 사용자 인터페이스로 다양한 SQL 데이터베이스와 통신 가능한 PHP 클래스 집합체

데이터베이스 구현을 추상화하고, 이를 이용하여 DBMS 타입에 관계없이 하나의 인터페이스를 통해 쿼리를 작성하고 실행할 수 있다. (DBMS 마다 다른 Query dialect 는 신경써야 한다.)


-- DB 연결 및 DSN

PHP에서 PDO 클래스 인스턴스를 생성하고 PDO 인스턴스로 PHP와 데이터베이스를 연결한다.

PDO 클래스 생성시 DB 연결 정보를 제공하는 문자열 인수를 DSN 이라고 한다.

DSN은 DB 드라이버명과 호스트명 혹은 IP 주소 그리고 포트번호, DB이름, 문자 집합 등이 포함된다.


ex)

<?php

try {

    $pdo = new PDO('mysql:host=127.0.0.1;port=3306;dbname=acme;charset=utf8', 'dbaccount', 'dbpassword');

} catch (PDOException $e) {

    echo 'fail to connect';

    exit;

} 


-- 데이터베이스 인증 정보 보관

인증 정보는 PHP 파일에 직접 넣어서 사용하면 안된다. 웹 문서 루트 외부에 있는 설정 파일로 옮겨서 PHP 파일에서 읽어서 처리한다. .gitignore 파일을 이용해서 버전 관리에서도 제외 시킨다.


-- 준비된 구문 (Statement)

Query Injection 등의 위험을 제거하기 위해서 Statement를 이용한다.


ex)

<?php

$sql = 'SELECT id FROM users WHERE email = :email';

$statement = $pdo->prepare($sql);


$email = filter_input(INPUT_GET, 'email');

$statement->bindValue(':email', $email, PDO:PARAM_STR);

$statement->execute();


while( ($result = $statement->fetch(PDO::FETCH_ASSOC)) !== false ) {

    echo $result['email'];

}



-- 쿼리 결과

PDO::FETCH_ASSOC - 배열 키는 데이터베이스 열 이름

PDO::FETCH_NUM - 배열 키는 데이터베이스 열 순서 번호

PDO::FETCH_BOTH - 배열 키는 데이터베이스 열 이름과 열 순서 번호 모두 사용 가능

PDO::FETCH_OBJ - 데이터베이스 열 이름이 객체 속성명으로 사용되는 객체 반환


-- 트랜젝션

트랜잭션은 더 이상 나눌 수 없는 데이터베이스 명령문 집합

DBMS에 따라서 지원 여부가 결정된다.


ex)

<?php

$pdo->beginTransaction();


// insert or update queries


$pdo->commit();







Comment +0

PHP 모범 사례 1


http://www.hanbit.co.kr/book/look.html?isbn=978-89-6848-225-0


입력값의 위험을 제거하고 데이터의 유효성을 검사하고 출력을 예외 처리하라!


- 입력값 위험 제거

-- 입력 데이터가 애플리케이션 저장소 계층 (DB, CacheDB 등) 에 도달하기 전에 위험을 제거하는 것이 중요

-- HTML

htmlentities() 함수나 HTML purifier 라이브러리를 이용 

-- SQL

준비된 PDO 문을 사용하여 쿼리 인젝션 공격에 대비한다.

-- 사용자 정보

filter_var(), filter_input() 함수를 이용하여 필터링 한다.


- 유효성 검사

-- filter_var() 함수를 이용하여 유효성 검사를 통해 잠재적인 DB 오류를 방지한다.


- 출력 예외 처리

-- 애플리케이션 사용자에 의해 악의적인 코드가 표시되거나 부주의하게 실행되는 것을 막아준다.

htmlentities() 사용, ENT_QUOTES 를 이용해서 따옴표 처리, 적절한 문자 인코딩을 명시 (보통 UTF-8)


Comment +0