[질답게시판 만들기] 02. common.php

02.common.php

 

매 페이지에서 호출되는 페이지로 공통적인 PHP코드가 들어있습니다.

기본적인 보안설정이나, DB연결, 세션설정등이 들어가 있습니다.

 

기본 세팅

<?php
require_once "function.php";

date_default_timezone_set('Asia/Seoul');
header("Content-type: text/html; charset=utf-8");
header("P3P : CP=\"ALL CURa ADMa DEVa TAIa OUR BUS IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE LOC OTC\"");

가장 윗부분에 함수들이 들어있는 function.php 파일을 불러옵니다.

date_default_timezone_set 을 이용하여 Asia/Seoul timezone을 사용함을 명시해줍니다.

header 명령어를 이용하여 문자셋과 쿠키등의 설정을 명시해줍니다.

 

보안을 위한 서버변수 처리

$ext_arr = array ( 'PHP_SELF', '_ENV', '_GET', '_POST', '_FILES', '_SERVER', '_COOKIE', '_SESSION', '_REQUEST',
                  'HTTP_ENV_VARS', 'HTTP_GET_VARS', 'HTTP_POST_VARS', 'HTTP_POST_FILES', 'HTTP_SERVER_VARS',
                  'HTTP_COOKIE_VARS', 'HTTP_SESSION_VARS', 'GLOBALS');
$ext_cnt = count($ext_arr);
for ($i=0; $i<$ext_cnt; $i++) {    
    if ( isset($_GET[$ext_arr[$i]]) )  unset($_GET[$ext_arr[$i]]);
    if ( isset($_POST[$ext_arr[$i]]) ) unset($_POST[$ext_arr[$i]]);
}

// SQL Injection 등으로 부터 보호를 위해 sql_escape_string() 적용
if (get_magic_quotes_gpc()) {
	
	// 서버 기본설정에 addslash 가 되어있는경우가 있으므로,
	// 설정이 되어 있는 경우 stripslashes 를 이용하여 해제해준다.
    $_POST    = array_map_deep('stripslashes',  $_POST);
    $_GET     = array_map_deep('stripslashes',  $_GET);
    $_COOKIE  = array_map_deep('stripslashes',  $_COOKIE);
    $_REQUEST = array_map_deep('stripslashes',  $_REQUEST);	
}

// sql_escape_string 적용
$_POST    = array_map_deep('sql_escape_string',  $_POST);
$_GET     = array_map_deep('sql_escape_string',  $_GET);
$_COOKIE  = array_map_deep('sql_escape_string',  $_COOKIE);
$_REQUEST = array_map_deep('sql_escape_string',  $_REQUEST);

간단한 보안을 위한 코드입니다.

서버변수를 보안처리 해주는 코드이며 그누보드에서 참조하였습니다.

$_POST, $_GET, $_COOKIE, $_REQUEST 의 경우 SQL 인젝션 보호를 위해 적용한 코드입니다.

 

경로및 URL 구해오기

$base_url = (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on') ? 'https://' : 'http://';
$base_url .= ($_SERVER['SERVER_PORT'] != '80') ? $_SERVER['HTTP_HOST'].':'.$_SERVER['SERVER_PORT'] : $_SERVER['HTTP_HOST'];

define('BASEPATH', str_replace(basename(__FILE__), "", realpath(__FILE__)));	// 루트 디렉토리
define('BASEURL', $base_url);
define('SESSION_PATH', BASEPATH."session");

common.php 파일을 이용하여 루트 디렉토리의 서버상의 절대경로와 URL을 구해옵니다.

이는 상수로 선언하여 사용하도록 합니다.

 

세션설정

ini_set("session.use_trans_sid", 0);   // PHPSESSID를 자동으로 넘기지 않음
ini_set("url_rewriter.tags",""); 		// 링크에 PHPSESSID가 따라다니는것을 무력화함

session_save_path(SESSION_PATH);
session_cache_limiter("no-cache, must-revalidate");

ini_set("session.cache_expire", 180);
ini_set("session.gc_maxlifetime", 10800);
ini_set("session.gc_probability", 1);
ini_set("session.gc_divisor", 100);

session_set_cookie_params(0, '/');
ini_set("session.cookie_domain",'.test.com');	// 쿠키 도메인 설정

session_start();

if(! is_dir(SESSION_PATH) ) {
	mkdir(SESSION_PATH,0777);
	chmod(SESSION_PATH, 0777);
}

세션에 관한 설정이며,  쿠키도메인 설정부분에 도메인을 입력하도록 합니다.

 

데이터베이스 연결

$dbcon = mysqli_connect("호스트주소", "아이디", "비밀번호", "DB이름") OR die ("Failed to connect to MySQL: " . mysqli_connect_error());
$dbcon->set_charset("utf8");

데이터베이스 연결 객체를 생성합니다.

 

관리자 비밀번호 선언

 define("ADMIN_PASSWORD", "비밀번호");

이번 시리즈에서는 로그인 기능을 구현하지 않을 예정이기에,

댓글입력및 다른사람이 입력한 비밀글 보기 등을 위해사용할 관리자 비밀번호를 정의합니다.

 

완성된 코드

<?php
require_once "function.php";

date_default_timezone_set('Asia/Seoul');
header("Content-type: text/html; charset=utf-8");
header("P3P : CP=\"ALL CURa ADMa DEVa TAIa OUR BUS IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE LOC OTC\"");

/****************************
 * 
 * 보안을 위한 서버 변수 처리
 * 
 ****************************/
$ext_arr = array ( 'PHP_SELF', '_ENV', '_GET', '_POST', '_FILES', '_SERVER', '_COOKIE', '_SESSION', '_REQUEST',
                  'HTTP_ENV_VARS', 'HTTP_GET_VARS', 'HTTP_POST_VARS', 'HTTP_POST_FILES', 'HTTP_SERVER_VARS',
                  'HTTP_COOKIE_VARS', 'HTTP_SESSION_VARS', 'GLOBALS');
$ext_cnt = count($ext_arr);
for ($i=0; $i<$ext_cnt; $i++) {    
    if ( isset($_GET[$ext_arr[$i]]) )  unset($_GET[$ext_arr[$i]]);
    if ( isset($_POST[$ext_arr[$i]]) ) unset($_POST[$ext_arr[$i]]);
}

// SQL Injection 등으로 부터 보호를 위해 sql_escape_string() 적용
if (get_magic_quotes_gpc()) {
	
	// 서버 기본설정에 addslash 가 되어있는경우가 있으므로,
	// 설정이 되어 있는 경우 stripslashes 를 이용하여 해제해준다.
    $_POST    = array_map_deep('stripslashes',  $_POST);
    $_GET     = array_map_deep('stripslashes',  $_GET);
    $_COOKIE  = array_map_deep('stripslashes',  $_COOKIE);
    $_REQUEST = array_map_deep('stripslashes',  $_REQUEST);	
}

// sql_escape_string 적용
$_POST    = array_map_deep('sql_escape_string',  $_POST);
$_GET     = array_map_deep('sql_escape_string',  $_GET);
$_COOKIE  = array_map_deep('sql_escape_string',  $_COOKIE);
$_REQUEST = array_map_deep('sql_escape_string',  $_REQUEST);


/****************************
 * 
 * 현재 경로 및 URL 구해오기
 * 
 *****************************/
$base_url = (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on') ? 'https://' : 'http://';
$base_url .= ($_SERVER['SERVER_PORT'] != '80') ? $_SERVER['HTTP_HOST'].':'.$_SERVER['SERVER_PORT'] : $_SERVER['HTTP_HOST'];

define('BASEPATH', str_replace(basename(__FILE__), "", realpath(__FILE__)));	// 루트 디렉토리
define('BASEURL', $base_url);
define('SESSION_PATH', BASEPATH."session");

/*****************************
 * 
 * 세션 설정
 * 
 *****************************/
ini_set("session.use_trans_sid", 0);   // PHPSESSID를 자동으로 넘기지 않음
ini_set("url_rewriter.tags",""); 		// 링크에 PHPSESSID가 따라다니는것을 무력화함

session_save_path(SESSION_PATH);
session_cache_limiter("no-cache, must-revalidate");

ini_set("session.cache_expire", 180);
ini_set("session.gc_maxlifetime", 10800);
ini_set("session.gc_probability", 1);
ini_set("session.gc_divisor", 100);

session_set_cookie_params(0, '/');
//ini_set("session.cookie_domain", COOKIE_DOMAIN);	// 쿠키 도메인 설정

session_start();

if(! is_dir(SESSION_PATH) ) {
	mkdir(SESSION_PATH,0777);
	chmod(SESSION_PATH, 0777);
}

/******************************
 * 
 * 데이타 베이스 설정
 * 
 ******************************/
$dbcon = mysqli_connect("호스트주소", "아이디", "비밀번호", "DB이름") OR die ("Failed to connect to MySQL: " . mysqli_connect_error());
$dbcon->set_charset("utf8");


/******************************
 * 
 * 관리자용 비밀번호
 * 
 ******************************/
 define("ADMIN_PASSWORD", "비밀번호");

 

[catlist id=76 numberposts=14 conditional_title=”PHP 질문과 답변 게시판 만들기” orderby=date]

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 항목은 *(으)로 표시합니다

이 사이트는 스팸을 줄이는 아키스밋을 사용합니다. 댓글이 어떻게 처리되는지 알아보십시오.