목차

PHP

설치

업데이트

sudo apt update
sudo apt upgrade

Nginx의 경우

sudo apt install php8.3-fpm

필수 확장 설치

sudo apt install php8.3-common php8.3-mysql php8.3-xml php8.3-xmlrpc php8.3-curl php8.3-gd php8.3-imagick php8.3-cli php8.3-dev php8.3-imap php8.3-mbstring php8.3-opcache php8.3-soap php8.3-zip php8.3-intl php8.3-sqlite3

확인

php -v
PHP 8.3.7 (cli) (built: May 13 2024 15:37:39) (NTS)
Copyright (c) The PHP Group
Zend Engine v4.3.7, Copyright (c) Zend Technologies
  with Zend OPcache v8.3.7, Copyright (c), by Zend Technologies

기본

Thread Safe?

Thread Safe 와 Non Thread Safe

우선 윈도우용 PHP는 항상 Thread Safe 버전으로 나왔었다. 이유는 윈도우가 멀티쓰레드 방식인데 PHP 는 멀티프로세스 방식으로 개발 되었기 때문이다. 참고로 리눅스나 유닉스는 원래 멀티프로세스 방식이었기에 문제가 되지 않았다.

PHP를 IIS와 연동하기 위해 CGI 또는 ISAPI 방식으로 연동을 한다. 그런데 PHP와 관련된 모듈들이 대부분 멀티프로세스 방식으로 개발 되었기 때문에 멀티쓰레드 방식으로 개발된 ISAPI 로 연동하였을 경우 서버가 다운되는 현상이 나타났다.

그래서 안정적인 방법으로 CGI 방식을 사용하긴 하지만 이 것 역시 퍼포먼스 측면에서 너무 느리다는게 문제가 되었다. 이 퍼포먼스 문제를 개선한 것이 Non Thread Safe 버전이라고 생각하면 되겠다…^^

정리를 하자면

NTS는

  1. 다중 스레드
  2. FAST CGI 호환을 위해

TS는

  1. 단일 스레드
  2. SAPI와 PHP 호환을 위해

결론적으로 아래와 같이 설치하면 된다.

  • Windows + IIS(ISAPI) –> Thread Safe 버전
  • Windows + IIS(CGI or FastCGI) –> Non Thread Safe 버전
  • Windows + Apache(MPM worker) –> Thread Safe 버전
  • Windows + Apache(MPM prefork) –> Non Thread Safe 버전

문법

  • ".php" 라는 확장자로 php스크립트 파일 작성
  • html 내부에 <?php ?>를 입력하고 이 안에 php코드 입력
  • 주석은 '/* */' 또는 을 사용
  • 함수나 변수 앞에 @가 붙으면 해당 작업시 오류가 나도 무시하고 진행하라는 뜻이다. 예) @fopen('/var/www/index.jpg');

데이터 받기

post방법으로 전달된 데이터는 '$_POST'라는 수퍼 글로벌변수로 받고, get방법으로 전달된 데이터는 '$_GET'라는 수퍼 글로벌 변수로 받는다

 <html>
<head>
</head>
<body>
     <form action="a.php" method=""post">
          <input type="text" name="name">
          <input type="submit" value="전달">
     </form>
</body>
</html>
 
a.php
 <html>
<body>
     <?php
             print ($_POST['name']);
     ?>
</body>
</html>

변수

  • php에서는 다른 프로그램과 달리 변수이름 앞에 '$"를 붙인다 $a=2;
  • php는 c언어처럼 사용할 변수를 미리 선언할 필요없고, 필요한 곳에서 바로 사용하면 된다.
  • var_dump()함수 - 변수에 대한 정보 표시
    $a=100;
    var_dump($a);
  • 문자열에 '$'을 표시하려면 $앞에 '\'을 붙인다
print "$a";          //변수값를 표시
print $a;            //변수값를 표시
print "a";           //문자열을 표시
print "\$a";      //$a가 표시
  • " "(더블 퀘테이션)안에 변수명을 사용하면 변수에 저장도니 값이 표시
    $a="$b"; $b의값이 $a에 저장됨 * ' '(싱글 퀘테이션)안에 변수명을 사용하면 그대로 문자열로 취급됨
    $a='$b';
    "$b"라는 문자열이 $a에 저장됨

히어 도큐먼트

긴 문자열을 간결하게 나타낼 수 있다

<html><body>
<?php
$a=<<<임의의 이름            // '<<<'는 히어 도큐먼트의 처음을 나타냄
          내용~~~
임의의 이름;
 
?>
 
</body></html>

short tag

So here are the valid ways to open PHP tags:

<?php ?> // standard tags
<? ?> // short tags, need short_open_tag enabled in php.ini
<% %> // asp tags, need asp_tags enabled in php.ini
<script language="php"> </script> // case insensitive

PSR-1 coding standards suggest to only use <?php ?> or <?= ?> (echo short tags) and no other variations, and PSR-2 suggests to not close the tags in PHP only files.

"==" vs "==="

비교 시 "==="은 값과 형식도 같으면 true. "=="는 형식이 달라도 값만 같으면 true.

Examples:

1 === 1: true
1 == 1: true
1 === "1": false // 1 is an integer, "1" is a string
1 == "1": true // "1" gets casted to an integer, which is 1
"foo" === "foo": true // both operands are strings and have the same value

함수

foreach

자식을 참조로 얻을 수 있다.

<?php
$arr = array(1, 2, 3, 4);
foreach ($arr as &$value) {
    $value = $value * 2;
}
// $arr is now array(2, 4, 6, 8)
unset($value); // break the reference with the last element
?>

Switch

switch ($i) {
case 0:
    echo "i는 0";
    break;
case 1:
    echo "i는 1";
    break;
case 2:
    echo "i는 2";
    break;
default:
    echo "i는 0, 1, 2 어느것도 아니다";
}

배열함수

array() 함수

형식) Array Array

Array Array("args1"⇒"value1","args2"⇒"value2",……);

기본적인 배열을 생성시키는 함수이다. 기본적으로 첨자는 생략이 가능하며 첨자를 생략할 경우 스칼라 배열로 생성된다. 한가지 주의할 점은 PHP에서는 다른 프로그래밍 언어와는 달리 2차원배열이라는것이 배열로 이루어진 배열을 의미한다. 다음을 한번 보도록 하자.

예) $test = array("arr1"⇒array("a"⇒"하나","b"⇒"두울","c"⇒"세엣"),"arr2"⇒array("a"⇒"네엣","b"⇒"다섯"));

위의경우 $test["arr1"]이라는 배열은 $test["arr1"]["a"],$test["arr1"]["b"],$test["arr1"]["c"] 세개로 이루어진 배열이며 $test["arr2"]라는 배열은 $test["arr2"]["a"],$test["arr2"]["b"] 두개로 이루어진 배열이다.

list() 함수

형식) Void list

변수를 배열인 것처럼 만든다.

예) $test = array(7,"9","8","안녕하라","환영한다");

while (list($key,$val) = each($test)){

echo $key."⇒".$val."

";

}

위의소스는 다음을 출력한다.

0⇒7

1⇒9

2⇒8

3⇒안녕하라

4⇒환영한다

each() 함수

형식) Array each(Array array)

배열에서 다음 키 이름과 배열 값을 쌍으로 돌려준다. 이 쌍은 네개의 원소를 가진 배열로 반환되는데 이 네개의 원소의 키는 0, 1, key, value 이다. 0과 key원소는 각각변수의 키 이름을 가지고, 1과 value는 배열값을 갖는다.

array_count_values() 함수

형식) Array array_count_values(Array input)

동일한 배열의 값의 개수를 구한다. 동일한 배열의 개수를 합한 값을 그대로 배열로 리턴한다.

예) $test = array(1,"hello",1,"world","hello","hello");

$count = array_count_values($test);

위의예에서 $count 변수에는 다음과 같은 값이 저장된다.

$count[1] = 2

$count["hello"] = 3

$count["world"] = 1

array_keys() 함수

형식) Array array_keys(Array input, mixed [search_value])

배열의 키값(인덱스값)을 반환한다. 특정한 배열값의 키값을 리턴받을 수 있다.

예1) $test = array("a"⇒"kim kihee","b"⇒"i love you");

$test_key = array_keys($test);

위의예에서 $test_key[0]에는 "a"가 $test_key[1]에는 "b"가 할당된다.

예2) $test = array("a"⇒"kim kihee","b"⇒"i love you");

$test_key = array_keys($test,"i love you");

위의예에서 $test_key변수에는 "b"가 할당된다.

array_merge() 함수

형식) Array array_merge(Array array1, Array array2, ……)

두 개 이상의 배열을 하나의 배열로 합한다. 만약 합쳐질 배열들의 키값(인덱스값)이 서로 같으면, 뒤의 배열값으로 덮어씌운다.

array_reverse() 함수

형식) Array array_reverse(Array array)

원래 배열값을 역순으로 저장한다. 리턴되는 값은 역순으로 저장된 배열이다.

array_push() 함수

형식) Int array_push(Array array, mixed var, […])

배열의 맨 뒤에 한개나 그 이상의 원소를 첨가한다.

예) $test = array(1,3);

array_push(3,4);

위의예는 $test라는 배열에 3, 4 두개의 요소를 첨가한다.

array_pop() 함수

형식) Mixed array_pop(Array array)

배열의 맨 뒤에 있는 원소를 꺼내고 그 원소를 삭제한다.

예) $test = array("kim","kihee","i love u");

$test_pop = array_pop($test);

위의예는 $test배열에서 마지막 요소인 "i love u"를 꺼내어 $test_pop이라는 변수에 할당하고 $test배열로 부터 "i love u"라는 값의 요소를 삭제한다.

array_unique()

배열에서 중복된 요소를 제거한다.

array_unique($array)

대소문자 안구분 함수.

<?php
function arrayDuplicate($array)
{
return array_unique(array_diff_assoc($array1,array_unique($array1)));
};
?> 

array_unshift() 함수

형식) Int array_unshift(Array array, Mixed var, [……]);

배열의 맨 앞에 한개나 그 이상의 원소를 추가한다.

array_seach() 함수

array_search — 주어진 값으로 배열을 검색하여 성공시 해당하는 키를 반환

mixed array_search ( mixed $needle , array $haystack [, bool $strict ] )

haystack에서 needle을 찾습니다.

됐고, 다음을 쓴다..

function recursive_array_search($needle,$haystack) {
    foreach($haystack as $key=>$value) {
        $current_key=$key;
        if($needle===$value OR (is_array($value) && recursive_array_search($needle,$value) !== false)) {
            return $current_key;
        }
    }
    return false;
}

출처 http://php.net/manual/kr/function.array-search.php

array_shift() 함수

형식) Mixed array_shift(Array array)

배열의 맨 앞에 있는 원소를 꺼내어 변수에 할당하고 그 원소를 배열로부터 삭제한다.

array_slice() 함수

형식) Array array_slice(Array array, Int offset, Int [length])

배열에서 일부의 요소를 추출한다.

offset : 배열에서 추출할 시작값을 지정하는것으로 양수인 경우 배열의 첫번째 원소에서 offset 값의 다음 배열원소부터 배열을 추출하며, 음수인경우 배열의 마지막 원소에서 offset값부터 배열을 추출한다.

length : 추출할 배열 원소의 개수를 지정한다. 만약 이 값이 음수이면 전체 배열의 끝에서부터 길이를 줄일 수 있다.

array_splice() 함수

형식) Array array_splice(Array input, Int offset, Int [length], Array [replacement])

배열의 일부를 삭제하고, 삭제한 위치에 다른 내용을 넣는다. 리턴값은 삭제된 배열 원소로 구성된 배열이다.

offset : 제거할 비율을 지정한다. 양수인 경우 배열의 처음 원소에서 음수인경우 배열의 마지막 원소에서 각각 그 값을 지정할 수 있다.

length : 생략 가능한 인자이며, 삭제될 배열의 크기를 지정한다.

replacement : 대체할 배열을 지정한다.

array_values() 함수

형식) Array array_values(Array input)

배열의 모든 값들을 스칼라 배열로 변환하여 반환한다.

$a=array("a"=>"Cat","b"=>"Dog","c"=>"Horse");
print_r(array_values($a));
Array ( [0] => Cat [1] => Dog [2] => Horse )

arsort() 함수

형식) Void arsort(Array array)

원래 가지고 있던 인덱스 값을 유지하면서 배열을 역순으로 정렬한다.

compact() 함수

형식) Array compact(String Varname | Array varname)

주어진 변수값을 가지고 배열을 만든다.

예) $test1 = "kim";

$test2 = "kihee";

$test4 = compact("test1","test2",$test3);

위의예에서 $test4에는 다음과 같은 값들이 배열로 저장된다.

$test4[test1] = "kim"

$test4[test2] = "kihee"

count() 함수

형식) Int count(Mixed var)

배열 변수의 원소 개수를 구한다. 리턴값으로 배열 요소의 개수를 반환하며 배열이 아닐 경우 1을, 배 벼열에 값이 없을 경우 0을 반환한다.

sizeof() 함수

형식) Int sizeof(Array array)

배열의 크기 즉, 원소의 개수를 구할 수 있다.

current() 함수

형식) Mixed current(Array array)

배열의 현재 원소를 돌려준다. current함수는 단순히 내부적인 포인터가 가르키고 있는 원소를 가르킨다. 만약 이 포인터가 원소 리스트의 범위를 넘어서 지시하고 있다면 current 함수는 false값을 반환한다. 주로 반복문에서 사용되지만 current()함수를 사용하는것보다 each()함수를 사용하는것이 더욱 안정적이다.

pos() 함수

형식) Mixed pos(Array array)

배열의 현재 원소를 리턴한다.

reset() 함수

형식) reset(Array array)

배열의 내부 포인터를 맨 처음 원소로 설정한다.

end() 함수

형식) end(Array array)

배열의 내부 포인터를 맨 마지막 배열 원소로 옮긴다.

key() 함수

형식) Mixed key(Array array)

배열에서 내부 포인터가 가리키고 있는 원소의 키값을 가져온다.

next() 함수

형식) Mixed next(Array array)

배열의 내부 포인터를 하나 전진시킨다.

prev() 함수

형식) Mixed prev(Array array)

배열의 내부 포인터를 하나 후진시킨다.

extract() 함수

형식) Void extract(Array var_array, Int [extract_type], String [prefix])

배열의 내용을 심볼 테이블로 읽어들여 일반적인 변수로 만든다. 배열에서 키 값은 변수명으로 배열값은 변수값으로 대치된다.

예를 들어

$a[x] = 111;
$a[y] = 222;

에서 extract(a) 할 경우 x = 111, y = 222가 되는 것이다.

  • extract_type : 변수명이 충돌할 경우, 생성될 변수명을 지정하는 방식을 나타낸다.
  • EXTR_OVERWRITE : 변수명이 충돌할 경우, 생성될 변수명을 지정하는 방식을 정한다.
  • EXTR_SKIP : 변수명이 충돌할 경우, 기존의 선언된 변수를 덮어쓰지 않고 변수의 생성을 건너뛴다.
  • EXTR_PREFIX_SAME : 변수명이 충돌할 경우 'String [prefix]에 '_변수명'이 붙여진 변수값을 생성한다.
  • EXTR_PREFIX_ALL : 변수명이 충돌할 경우 'String [prefix]에 '_배열의 모든 키값'들이 덧붙여진 변수명 중에서 생성한다.
  • String [prefix] : 'EXTR_PREFIX_SAME'인자와 'EXTR_PREFIX_ALL' 인자를 사용한 경우 충돌한 변수에 접두어로 사용할 문자열 값을 지정한다.

그러면 소스에 extract($_GET)이 있다면??? 보안에 위험이 있으니 쓰지 않도록한다.

참조

in_array() 함수

형식) bool in_array(mixed needle, array kaystack)

배열에서 찾는 값이 있으면 true값을 없으면 false값을 반환한다.

mixed needle : 찾고자 하는 값

array haystack : 배열명

sort() 함수

형식) Void sort(Array array)

배열을 정렬한다.

ksort() 함수

형식) Void ksort(Array array)

배열을 키 순으로 정렬한다.

rsort() 함수

형식) Void rsort(Array array)

배열을 역순으로 정렬한다.

foreach ($arr as &$value) {
    $value = $value * 2;
 } 

날짜 및 시간 관련함수

time()

  1. 용도: 현재 시각을 timestamp값으로 구한다.
  2. 방법: time()

date()

  1. 용도: 사용자가 지정한 형태로 시간을 표시. 특정시간의 날짜와 요일등을 배열로 리턴한다.
  2. 방법: date("표시할 시간의 포맷형태","특정한 timestamp값")
$today = date("m.d.y");                         // 03.10.01
$today = date("j, n, Y");                       // 10, 3, 2001
$today = date("Ymd");                           // 20010310
$today = date("H:i:s");                         // 17:16:18

mktime()

  1. 용도: 지정된 날짜를 timestamp값으로 변환한다.
  2. 방법: mktime(시,분,초,월,일,년)

checkdate()

  1. 용도: 날짜와 시간이 올바른 범위 안에 있는지 검사한다.
  2. 방법: checkdate(월,일,년)
<?php
$today = getdate(); 
print_r($today);
?>

출력 예시:

Array
(
    [seconds] => 40
    [minutes] => 58
    [hours]   => 21
    [mday]    => 17
    [wday]    => 2
    [mon]     => 6
    [year]    => 2003
    [yday]    => 167
    [weekday] => Tuesday
    [month]   => June
    [0]       => 1055901520
)

getdate()

  1. 용도: 특정timestamp값으로 시간,요일,날짜정보를 배열로 반환한다.
  2. 방법: getdate(timestamp값) 또는 getdate()

gettimeofday()

  1. 용도: 현재 시스템의 현재 시간 정보를 배열로 리턴한다.
  2. 방법: gettimeofday()

gmmktime()

  1. 용도: 그리니치표준 시간으로 지정한 날짜의 timestamp값을 리턴한다.
  2. 방법: gmmktime(시,분,초,월,일,년)

strftime()

  1. 용도: 특정한 포맷으로 날짜 정보를 출력하는데 언어를 지정할수 있다.
  2. 방법: strftime("표시할 시간의 포맷형태","특정시간의 timestamp값")

microtime()

  1. 용도: 현재시간의 마이크로타임 값과 timestamp값을 표시한다.
  2. 방법: microtime()

localtime()

  1. 용도: 현재 서버의 로컬 타임을 표시
  2. 방법: localtime() 또는 localtime("timestamp값")

문자열 처리함수

addslashes()

  1. 용도: 작은따옴표 큰따옴표와 같은 특정문자 앞에 역슬래시 문자를 붙인다.
  2. 방법: addslashes()

stripslashes()

  1. 용도: allslashes로 역슬래시 처리된 문자를 원상태로 되돌린다.
  2. 방법: stripslashes()

htmlspecialchars()

  1. 용도: HTML코드를 소스 그대로 출력해준다.
  2. 방법: htmlspecialchars()

nl2br()

  1. 용도: 문자열에 포함된 개행 문자를 <br>태그로 모두 바꿔준다.
  2. 방법: nl2br()

echo()

  1. 용도: 문자열 출력
  2. 방법: echo("변수명" 또는 "문자열")

sprintf()

  1. 용도: 포맷 문자열을 통해 지정해 준 포맷으로 문자열을 표시한다.
  2. 방법: sprintf("포맷","변수명")

printf()

  1. 용도: 지정할 수 있는 포맷에 따라 문자열을 출력한다.
  2. 방법: printf("포맷","변수명")

explode()

  1. 용도: 문자열을 지정해준 구분자로 분리하여 배열로 반환한다.
  2. 방법: explode("구분자","문자열인수")
$match="alpha>beta"
$matches=explode(">",$match);

$matches[0]은 alpha, $matches[1]은 beta

implode()

  1. 용도: 구분자로 나누어 배열에 담은 문자열을 다시 지정해준 구분자로 연결하여 전체 문자열을 반환한다.
  2. 방법: implode("구분자",배열변수명)

join()

  1. 용도: implode()와 동일한 기능을 수행한다.
  2. 방법: join("/", "배열변수명")

split()

  1. 용도: 주어진 문자열을 정규표현식의 패턴에 따라 분리하여 배열에 저장한다.
  2. 방법: implode("정규표현식","문자열")

strcmp()

  1. 용도: 두개의 문자열을 비교하여 참이면1, 거짓이면 0을 반환한다.
  2. 방법: strcmp("문자열","문자열") 또는 strcmp("문자열","변수명") 또는 strcmp(변수명, 변수명)

substr()

  1. 용도: 문자열에서 특정시작 문자부터 길이만큼의 문자열을 추출하여 반환한다.
  2. 방법: substr("문자열", 시작문자번호, 문자열의 길이)
  • 첫문자의 번호는 0이다.
  • 시작문자번호가 음수이면 뒤에서 가져온다. eg. $rest = substr("abcdef", -2); returns "ef"
  • 길이가 음수이면 그만큼 빼고 가져옴.
시작문자비교
if (substr($_str, 0, strlen($opt) ) == $opt) {}
끝문자
if (substr($str, -1*strlen($try))===$try) return $try;

strchr()

  1. 용도: 문자열이 처음으로 나타나는 위치부터 끝까지 반환
  2. 방법: strchr("문자열","찾을 문자열")

strstr()

  1. 용도:strchr()함수와 동일한 수행을 한다.
  2. 방법: strstr("문자열","찾을 문자열")

strrchr()

  1. 용도: 문자열이 마지막으로 나타나는 위치부터 끝까지 반환한다.
  2. 방법: strrchr("문자열","찾을문자열")

strpos()

  1. 용도: 문자열 대신 처음으로 나타나는 위치를 숫자로 반환, 이때 숫자는 0부터 시작.
  2. 방법: strpos("문자열","찾을 문자열")

strrpos()

  1. 용도: 찾고자 하는 문자열에서 마지막으로 나타나는 위치를 반환한다.
  2. 방법: strrpos("문자열", "찾을 문자열")

strlen()

  1. 용도: 문자열의 길이를 반환한다.
  2. 방법: strlen($변수명) 또는 strlen("문자열")

strtolower()

  1. 용도: 알파벳 대문자를 모두 소문자로 바꾸어 반환한다.
  2. 방법: strtolower("문자열")

strtoupper()

  1. 용도: 알파벳 대문자를 소문자로 바꾸어 반환한다.
  2. 방법: strtoupper("문자열")

ucfirst()

  1. 용도: 알파벳 문자열의 첫 글자를 대문자로 반환한다.
  2. 방법: unfirst("문자열")

ucwords()

  1. 용도: 알파벳 문자열의 첫 글자를 대문자로 반환한다.
  2. 방법: ucwords("문자열")

strrev()

  1. 용도: 인자로 전달한 문자열의 순서를 역전시킨다.
  2. 방법: strrev("문자열")

strtr()

  1. 용도: 문자열에서 변경하고자 하는 문자열을 변경할문자열로 1:1 변경해준다.
  2. 방법: strtr("문자열","변경하고자하는 문자열","변경할 문자열")
  3. string strtr ( string $str , string $from , string $to )

str_replace

  1. 용도: 문자열 중에 변경하고자 하는 문자열을 찾아 변환한다.
  2. 방법: str_replace("찾을 문자열","변경할 문자열","문자열 원본").

chop()

  1. 용도: 문자열의 뒷부분의 공백 문자를 제거한 후 반환한다.
  2. 방법: chop("문자열")

trim()

  1. 용도: 문자열의 앞과 뒤에 있는 공백을 제거한 후 문자열을 반환한다.
  2. 방법: trim("문자열")
  3. ltrim() - 문장 좌측 공백제거
  4. rtrim() - 문장 우측 공백제거

quotemeta()

  1. 용도: 메타문자 앞에 역슬래시를 붙인다.
  2. 방법: quotemeta()

ord/chr()

  1. 용도: ord()함수는 문자열에서 첫번째 문자에 아스키코드값을 반환하고 chr()함수는 아스키함수에 해당하는 문자를 반환한다.
  2. 방법: ord("문자열"), chr("아스키값")

parse_str()

  1. 용도: get방식과 같은 형태의 변수형을 변수와 값으로 받을 수 있게 해준다.
  2. 방법: parse_str(변수명)

파일관련함수

fopen()

  1. 용도: 로컬경로의 파일이나 url경로의 파일을 읽기 모드나 쓰기 모드로 열어준다.
  2. 방법: fopen("절대경로명/파일", "모드") 또는 fopen("url주소", "모드")

fclose()

  1. 용도: fopen으로 열린 파일을 닫는다.
  2. 방법: fclose($fp)

fread()

  1. 용도: 파일포인터가 가리키는 파일의 내용을 지정한 크기만큼 읽어 들인다.
  2. 방법:fread($fp,"읽어들일 바이트")

feof()

  1. 용도: 현재 파일 포인터가 파일의 끝인지를 알려주는 함수
  2. 방법: feof($fp)

fgets()

  1. 용도: 파일을 읽어올때 한줄씩 읽어온다.
  2. 방법: fgets($fp,"읽어들일 바이트")

fputs()

  1. 용도: 파일을 a 또는 w 모드로 열어 문자열을 파일에 기록한다.
  2. 방법: fputs($fp, "문자열")

fwirte()

  1. 용도: 파일을 기록한다.
  2. 방법: fwrite($fp, "문자열")

fpassthru()

  1. 용도: 파일포인터의 현재 위치에서 파일의 끝까지 읽어 들이도록 한다.
  2. 방법: fpassthru($fp)

readfile()

  1. 용도: fpassthru와 비슷하지만 fopen() 없이 직접 바로 파일을 읽어들일 수 있다. 읽어들인 파일의 절대경로를 포함한다.
  2. 방법: readfile("파일의 절대경로 또는 상대경로/파일명")

fgetc()

  1. 용도: 파일로부터 한문자를 읽어들인다.
  2. 방법: fgetc($fp)

filesize()

  1. 용도: 파일의 크기를 바이트수로 반환한다.
  2. 방법: filesize("파일경로/파일명")

file_exists()

  1. 용도: 파일이름으로 지정한 파일이 존재하는지 검사한다.
  2. 방법: file_exists("파일경로/파일명")

is_file()

  1. 용도: 파일이름으로 지정한 이름이 파일면 true를 반환한다.
  2. 방법: is_file("파일경로/파일명")

is_dir()

  1. 용도: 파일이름으로 지정한 이름이 디렉토리일경우 true를 반환한다.
  2. 방법: is_dir("파일경로/파일명")
$dirname = "whatever";
if (!is_dir($dirname)) {
    mkdir($dirname);
}
  1. 용도: 파일이름으로 지정한 이름이 심볼릭 링크일경우 true를 반환한다.
  2. 방법: is_link("파일경로/파일명")

is_escutable()

  1. 용도: 파일이름으로 지정한 파일이 실행 가능한 파일이면 true를 반환한다.
  2. 방법: is_excutable("파일경로/파일명")

is_readable()

  1. 용도: 파일이름으로 지정한 파일이나 디렉토리가 읽기 가능한경우 true를 반환한다
  2. 방법: is_readable("파일경로/파일명 또는 디렉토리명")

is_writeable()

  1. 용도: 파일이름으로 지정한 파일이나 디렉토리가 쓰기 가능한 경우 true를 반환한다
  2. 방법: is_writeable("파일경로/파일명 또는 디렉토리명")

copy()

  1. 용도: 파일을 복사하고 제대로 수행이 되면 true를 반환한다.
  2. 방법: copy("파일경로/복사할 파일명", "파일경로/복사된 파일명")

rename()

  1. 용도: 파일을 이름을 바꾼다. 제대로 수행이 되면 true를 반환한다.
  2. 방법: rename("파일경로/변경할 파일명", "파일경로/변경후 파일명")
  1. 용도: 파일을 삭제한다. 제대로 수행될 경우 true를 반환한다.
  2. 방법: unlink("파일경로/삭제할 파일명")

mkdir()

  1. 용도: 디렉토리를 생상하고 동시에 권한도 함께 지정할 수 있다.
  2. 방법: mkdir("경로/디렉토리명", 권한)
$dirname = $_POST["search"];
$filename = "/folder/" . $dirname . "/";
 
if (!file_exists($filename)) {
    mkdir("folder/" . $dirname, 0777);
    echo "The directory $dirname was successfully created.";
    exit;
} else {
    echo "The directory $dirname exists.";
}

rmdir()

  1. 용도: 디렉토리 삭제
  2. 방법: rmdir("경로/디렉토리명")

basename()

  1. 용도: 경로명과 파일명을 받아 파일명만을 반환한다.
  2. 방법: basename("파일경로/파일명")

dirname()

  1. 용도: 경로명과 파일명을 받아 경로명만을 반환한다.
  2. 방법: dirname("파일경로/파일명")

file()

  1. 용도: 줄단위로 읽어서 각 줄의 문자열을 배열로 하여 반환한다.
  2. 방법: dirname("파일경로/파일명")

file_put_contents()

  • file_put_contents($filename, $content) - 내용을 파일로 저장함.

$content는 문자열, 배열 다됨.

<?php
$FOLDER="/home/www/wiki/data/pages/울티마";
//검색할 디렉토리 지정. 권한 필요
if($dirs=opendir($FOLDER))//해당 디렉토리 open
{
 echo "<h3>$FOLDER 디렉토리의 서브파일 검색</h3>";
 while($file=readdir($dirs))//해당 폴더내 파일들 일괄적용
 {
  if(!is_dir($file)) { //폴더인지 파일인지 검사
    $file_content=file("$FOLDER/$file");
    $r= headercheck($file_content);
    if ($r) { file_put_contents("$FOLDER/$file",$r);$r="converted";}
    echo "$file  $r <br>";
  }
 }
}
closedir($dirs);//해당 디렉토리 close
 
    function headercheck($lines) {
        $modified=false;
        foreach ($lines as &$line ) {
            $num=substr_count($line,"=");
            if ($num>0 ) {
                if (substr_count(substr(trim($line),0,$num),"=")=====$num && $num!=strlen(trim($line))) {
                    $line=trim($line).str_repeat("=",$num)."\n";
                    $modified=true;
                }
            }
        } unset($line);
        if ($modified) return $lines;
        else         return false;
    }
 ?>

디렉토리 관련함수

opendir()

  1. 용도: 지정한 디렉토리에 대한 핸들을 얻는다.
  2. 방법: opendir("디렉토리 경로")
<?php
/*    폴더 내의 파일들 중에서 특정 문자열이 있는 파일만 출력            */
/* http://www.zetswing.com/bbs/board.php?bo_table=PHP_LEC&wr_id=56 */
$FOLDER="./web_jun";
//검색할 디렉토리 지정
//검색할 디렉토리의 other부분에 r권한을 줘야 한다.
 
$find_string= "body";
//검색할 문자열 지정(대소문자 안가림)
if($dirs=opendir($FOLDER))//해당 디렉토리 open
{
 echo "<b><font size=5>$FOLDER 디렉토리의 서브파일 검색</font></b>";
 while($file=readdir($dirs))//해당 폴더내 파일들 일괄적용
 {
  if(!is_dir($file))//폴더인지 파일인지 검사
  {
 
   $file_content=file("$FOLDER/$file");
   $filename_view="";
   for($num=0,$ling_number=1;$num<count($file_content);$num++,$ling_number)
   {
    if(eregi($find_string,$file_content[$num]))
    {
     if(empty($filename_view))//문자열 찾을시 최초 한번만 파일명 출력
     {
      echo "<u>파일 이름 : $file </u><br><br>";
      $filename_view=$file;
     }
     echo "    <b><font color=red>소스라인넘버 : </font></b> $num<br>";
    }
   }
   echo "<br>";
  }
 }
}
closedir($dirs);//해당 디렉토리 close
 ?>

closedir()

  1. 용도: opendir()함수 호출로 열어둔 디렉토리에 대한 핸들을 닫는다.
  2. 방법: closedir($od)

readdir()

  1. 용도: 디렉토리에 있는 모든 디렉토리 및 파일들의 이름을 읽어 배열의 형태로 반환
  2. 방법: readdir($od)

rewinddir()

  1. 용도: 디렉토리 핸들의 포인터 위치를 제일 처음으로 되돌린다.
  2. 방법: rewinddir($od)

chdir()

  1. 용도: 지저한 디렉토리로 바꾼다.
  2. 방법: chdir("경로명/디렉토리명")

dir()

  1. 용도: 디렉토리 관련 함수를 사용할 수 있는 클래스
  2. 방법: dir("경로/디렉토리명")

URL관련함수

parse_url()

  1. 용도: url을 입력하면 해당 url에 대한 정보를 연관 배열로 저장하여 반환
  2. 방법: parse_url("URL주소")
  • parse_url("URL주소",Component)

PHP_URL_SCHEME, PHP_URL_HOST, PHP_URL_PORT, PHP_URL_USER, PHP_URL_PASS, PHP_URL_PATH, PHP_URL_QUERY or PHP_URL_FRAGMENT

eg. parse_url($url,PHP_URL_HOST)

urlencode()

  1. 용도: 데이터를 url인코딩해준다.
  2. 방법: urlencode("문자열")

urldecode()

  1. 용도: url을 통해 넘어온 값 중 인코딩된 문자열을 디코딩한다.
  2. 방법: urldecode("문자열")

cURL

  function curl($url)
  { // Rhttp://www.partner114.com/bbs/board.php?bo_table=B07&wr_id=126
    $ch = curl_init();
 
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
    $g = curl_exec($ch);
    curl_close($ch);
    return $g;
  }

XML

SimpleXML

php5 에서는 simpleXML 이라는 강력하고도 좋은 xml 클래스를 제공한다.

간단 예제

<?php
include 'test.xml';
 
$movies = new SimpleXMLElement($xmlstr);
 
echo $movies->movie[0]->plot;
?>

심화예제

변수 및 수학 관련함수

gettype()

  1. 용도: 변수형을 반환한다.
  2. 방법: gettype("변수명")

settype()

  1. 용도: 변수형을 변환한다.
  2. 방법: settype("변수명", "변수타입")

intval()

  1. 용도: 변수값을 정수형 값으로 변환.
  2. 방법: intval("변수값")
  3. 나눗셈을 하면 자동으로 실수형으로 바뀐다.

doubleval()

  1. 용도: 변수값을 실수형 값으로 변환한다.
  2. 방법: doubleval("변수값")

strval()

  1. 용도: 변수를 문자형 값으로 변환한다.
  2. 방법: strval("변수값")

isset()

  1. 용도: 변수가 존재하는지 확인한다.
  2. 방법: isset("변수명")

unset()

  1. 용도: 변수를 삭제한다.
  2. 방법: unset("변수명")

empty()

  1. 용도: 변수에 값이 존재하는지 확인하여 없으면 true를 있으면 false를 반환한다.
  2. 방법: empty("변수명")

is_array()

  1. 용도: 변수의 형이 배열인지 확인한다.
  2. 방법: is_array("변수명")

is_double

  1. 용도: 변수의 형이 더블형인지 확인한다.
  2. 방법: is_double("변수명")

abs()

  1. 용도: 변수의 절대값을 반환
  2. 방법: abs("변수명")

round()

  1. 용도: 변수의 반올림한 값을 구한다.
  2. 방법: round("변수명")

ceil()

  1. 용도: 변수 값의 무조건 올림 값을 구한다.
  2. 방법: ceil("변수명")

floor()

  1. 용도: 변수값의 무조건 내림 값을 구한다.
  2. 방법: floor("변수명")

pow()

  1. 용도: 인자 값만큼 제곱승 한 값을 구한다.
  2. 방법: pow("변수명", "제곱할 횟수")

max & min()

  1. 용도: 최대값과 최소값을 구한다.
  2. 방법: max("숫자값", "숫자값",…) min("숫자값", "숫자값",…)

기타 알아두어야 할 함수

count()/sizeof()

  1. 용도: 배열의 크기를 구한다.
  2. 방법: count("변수명") sizeof("변수명")

each()/list()

  1. 용도: 배열의 내용을 출력할때 사용한다.
  2. 방법: each("배열변수명"), list("배열의 인자를 받을 변수명", "배열의 인자를 받을 변수명"…)

end()/next()/reset()

  1. 용도: 현재 배열의 포인터를 끝이나 다음으로 이동시킨다. reset은 배열포인터를 다시 처음으로 되돌린다.
  2. 방법: end("배열변수명") next("배열변수명")

exec()

  1. 용도: 리눅스 서버의 내부 명령어를 사용하게 한다.
  2. 방법: exec("리눅스명령어", "결과를 저장할 변수명" ,"에러발생시 저장할 변수명")

number_format()

  1. 용도: 천단위마다 ","를 붙여준다.
  2. 방법: number_format("변수명", "소수점자리수", "소수점 표시마크변경", "천단위 표시 마크변경")

show_source() / highlight_string()

  1. 용도: php파일의 소스를 보여준다.
  2. 방법: show_source("경로명/파일명") highlight_string("변수명")

uniqid()

  1. 용도: 유일한 아이디 값을 만들어준다
  2. 방법: uniqid()

[출처] PHP 함수 간단 정리|작성자 개나리 A37

PHP 현재 페이지 주소 알아내기

현재 페이지의 주소 구하기

$url = "http://" . $_SERVER["HTTP_HOST"] . $_SERVER["REQUEST_URI"];

기타

에러표시

php.ini에 다음을 추가…

 display_errors on

혹은

.htaccess에 다음을 추가…

 php_flag display_errors on

폴더 빈공간 표시

 <?php
    $bytes = disk_free_space(".");
    $si_prefix = array( 'B', 'KB', 'MB', 'GB', 'TB', 'EB', 'ZB', 'YB' );
    $base = 1024;
    $class = min((int)log($bytes , $base) , count($si_prefix) - 1);
    echo $bytes . '<br />';
    echo sprintf('%1.2f' , $bytes / pow($base,$class)) . ' ' . $si_prefix[$class] . '<br />';
?>
 

PHP보안

register_globals

php.ini 설정에서 register_globals = on/off 차이점과 기능설명

register_globals 를 On 으로 하면 변수가 get, post, session 변수인지 체크하지 않아도 된다. 쓰기에 따라서 보안적인 부분에 문내가 생길 수 있다

  • register_globals = on
    • 가능 → $_POST['u_id']
    • 가능 → $u_id
  • register_globals = off
    • 가능 → $_POST['u_id']
    • 불가능 → $u_id

extract()로 처리하면 가능

php.ini에서 register_globals=off 일경우 헤더나 인클루드를 이용해서 상단에

@extract($_GET);
@extract($_POST);
@extract($_SERVER);
@extract($_FILES);
@extract($_ENV);
@extract($_COOKIE);
@extract($_SESSION);

위와 같이 처리해 주면 기존 소스를 그대로 사용할 수 있다. 혹은 받아오는 변수의 전체코드를 다 써주면 됨

$HTTP_GET_VARS[변수] 또는 $_GET[변수]
$HTTP_POST_VARS[변수] 또는 $_POST[변수]
$HTTP_COOKIE_VARS[변수] 또는 $_COOKIE[변수]
$HTTP_SESSION_VARS[변수] 또는 $_SESSION[변수]
$HTTP_POST_FILES[변수] 또는 $_POST_FILES[변수]

비번관리

반드시 회원의 비밀번호는 md5() 나 mhash 유틸리티의 암호화 알고리즘을 사용하여 저장 하라 ^^

그리고 회원 정보 수정이나 중요사항 변경시, 쇼핑몰 결재시에는 반드시 회원의 비밀번호를 한번더 물어 보고, 디비와 비교해서 통과 시키 세요 !!

◆◇ 회원 정보 수정시 , 수정할 것들 맨아래 에 비밀번호 입력란을 만들면 된다 ^^

회원 비밀번호 찾기의 경우 , md5() 를 사용하면 바로 웹에서 찾을 수 없다. 회원이 비밀번호를 분식했을 경우, 사용자 메일로 새로운 비번을 만들어서 보내는 알고리즘을 사용하라 !!

주민등록 번호의 경우 수정시 라도 보여 주지 않는 것이 좋다. input text 박스만 보여 주고 옆에 731111-******* 이런식으로 명시 하는 것이 좋다.

회원 비번은 md5() 로 암호화 하구요. 쿠키는 사용하지 마세요. 회원이 비번을 잊어 버렸을 경우는 회원 email 주소로 새로운 비번을 쏴주시구요.

세션의 경우 회원id 세션과 회원 비번 md5 암호화 한 세션 , 2개 로 비교 하라. 회원 레벨..준회원..정회원..관리자 등이 있을 경우는 3개 로 비교 하시구요. 1개 로만 절대로 비교 하시지 말구요 !

회원 정보 수정 시 form 에서 맨아래 무조건 회원 비번을 1번더 묻게 하시구요. ^^

세션의 경우는 /tmp 폴더에 저장 하시지 마세요. php.ini 에서 세션저장 장소를 바꾸세요. session지시자 아래 있슴다. /tmp 는 너무 알려 져서 좋지 않다. !

세션 생성시 $userid 를 생성 하고, $userpass=md5($userpass); 로 생성 해서, 2개 값이 있는지 비교 하구요.. isset() 등으로 비교 하시는 것이 좋구요.

$userpass 값은 32 자 인지 확인 하면 된다. md5() 로 해슁 하면 32자가 됩니당.

if((session_is_registered(username)) && (session_is_registered(user_id)))
  session_is_registered()

를 사용하시구요..

$pw 도 암호화 하세용..!!!

비교는

if($pw==md5($pw넘어온값) && isset($pw넘어온값))

이런식으로 체크 하시구용…^^

좀더 고심해 보시고 응용해보라 ^^

$tpass=md5("pw008");
if(($id == "id007") && (md5($pw) == $tpass) && isset($pw) && isset($id)){

이런 식으로 ^^

zend encode 를 사용하지 않고 PHP 소스 안보이게 하는 방법 ?

PHP는 인터프리터 언어 이다. 컴파일하지 않기 때문에 소스가 보일 수 가 있다. 컴파일 하지 않고 , PHP 소스 보안을 유지 하는 방법은 ?

들여 쓰기 를 사용하지 않고, 변수명도 어렵게 하는 것 이다.

http://www.phpbuilder.com/forum/read.php3?num=2&id=139250&thread=139219

또는 http://pobs.mywalhalla.net 를 사용하라. 소스를 아래 처럼 만들어 버립니다. 우왕…어지러버요….해킹 불가 !!! ㅋㅋㅋ 읽어 보니…인간이 읽기에 힘든 편집으로 만든다 라고 적었다…

<?php

include("pobs-ini.inc");
echo "<HTML><HEAD><TITLE>POBS - A PHP Obfuscator</TITLE><STYLE TYPE='text/css'>";echo "td {
font-
family:
Verdana, sans serif;font-size:".$V24b02965."pt;  vertical-align:
top; }";echo "</STYLE></HEAD><BODY>";
define("C00529ab2", "<TD VALIGN=TOP>");define("C4d89b09c", "<TD BGCOLOR=#6699CC
VALIGN=TOP>");define
("C5481f31d", "<TD BGCOLOR=#E6E6E6 VALIGN=TOP>");define("C9c3b8e37", "<TR>");define
("Cd742068d", "</TR>");define("Cdabce349", "</TD>");define("C6faee0d5", "</TABLE>");
if ($PA) F85580fcb();
$V9429cf94=time();
$Vf797b56c=0;$V048f0047=0;
$Vbc961c59=array();$Vb787292f=array();$V4cb73b6b=array();$Vae809e1a=array();
$V4a949e17=array();$Va7254761=array();$Vd74f666d=array();
if ($PA) F23da1c4c();else Fb72cca71();

?> 

파일 업로드 보안 문제 - 7 가지 모두 체크 !!!

1.php,inc,html,htm,phtml,php3 등의 확장자는 절대로 올릴 수 없게 한다 ! .txt 도 못올리게 한다. .txt 를 사용해서 쿠키를 훔칠수도 있슴다.

2.업로드 디렉토리는 무조건 htdocs 아래 말고 다른 디렉토리 에 올린다 !! /updir 이나 c:updir 등 htdocs 와 관련이 없는 디렉토리에 올리게 한다. !!

3.CP명령을 사용시에 exec(cp $file , 처럼 exec() 를 절대로 사용하지 말아야 한다. 기냥 cp()만을 사용하라 !!! www.php.net/cp

4.REQUEST_METHOD!="POST" 로 체크 해서 올리기 POST 가 아닐 경우 올리지 못하게 !!! form 에서 method=get 으로 절대 절대 하지 마세요 !!!

<?php

if ($submit) {
    if ($REQUEST_METHOD ===== 'POST') {
        // 정상 실행
    }
    else {
         echo 'get 값은 받지 않다 !!';
    }
else {
    echo '훔....잘못된 입력 !!!';
}

?>

5.파일명이 pass 나 shadow 나 리눅스 시스템 파일일 경우는 올리지 못하게 하기 위해 파일명 중에 pass 나 shadow 등이 있을 경우 올리지 못하게 !!! 그러니까 koreapass.zip 파일 같은 것도 올라가지 않겟죠 ^^ 그래도 보안을 위해서라면 ^^ /etc/passwd 파일(리눅스 파일)의 업로딩을 방지 한다.

그러니까 upload.php 파일을 이용하여 주소표시줄에서

upload.php?file_name=/etc/passwd&file_type=text&file_size=30

등으로 해서 해킹할 시스템의 passwd 파일을 자료실에 올리고 다운 받을 수 있다고 한다. 그래서 취한 조치 이다.

6. 또는 file_exists($file_name) 를 사용하여 체크 한다. 로컬시스템에 파일이 있으면 절대 못올리게 한다 ^^ /etc/passwd 파일의 업로딩을 방지 한다.

HTML 태그를 막기

htmlspecialchars() 를 사용하시지 말고, str_replace 로 직접 변환하라 !!!

<?php

function cleanup($copy)
{
    $copy=trim($copy);
    $copy=htmlspecialchars($copy, ENT_QUOTES);
    $copy=eregi_replace ("%", "%", $copy);
    $copy=eregi_replace ("<", "<", $copy);
    $copy=eregi_replace (">", ">", $copy);
    $copy=eregi_replace ("&", "&", $copy);
    $copy=nl2br($copy);
    $copy=StripSlashes($copy);
    return($copy);
}
?>

<scripts> 도 당근 막아야 하구요 <table> 도 당근 막아야 한다.

HTML태그와 자바스크립트

HTML과 자바스크립은 뚫립니다. 쿠키 까지 알아 낼 수 도 있다. 콤포넌트를 사용한 방식이 라도 안된다. hotmail.com 에서 장난 쳐서 보낼 수 도 있다.

무조건 태그는 막는것이 좋다. 그러나 대부분의 사용자는 모르고 있죠. 글서 보통 허용하는 것이 일반적 이다. 그러나 허용을 하더라도 <script> 등의 소스나 <a> 태그 외에 <a onmouse~> 등의 태그는 안된다. 무자게 생각할 것이 많고 적용할 소스가 많다.

아싸리 막아 버리세요.

일단 막고 등으로 사용하게 하는 것이 좋습니당. !!!

*.inc 파일로 저장 하지 마십시오.

바로 브라우져에서 보일 수 있으며 간단한작동 만으로 데이터베이스 패스를 볼 수 있다.

파일명을 저장 하시려거든 , *.inc.php 로 하라.

물론 Apache 에서 Addtype 에서 .inc 를 추가 하면 됩니당..^^

phpinfo() 를 숨겨라...

phpinfo() 의 경우 시스템의 구성 상황을 비교적 쉽게 해커에게 알린다. 물론 phpinfo() 때문에 해킹 당하지는 않겟지만.. 해킹에 도움이 된다

<?php
   phpinfo();
?>

를 사용하고 바로 지워 주라… 검색엔진에서 검색하면 많은 phpinfo() 를 볼 수 있다…

http://www.google.com/search?q=phpinfo

다 설치 하고 test 를 했다면 지워 ^^

PHP오류를 적에게 알리지 말라!

PHP오류가 날 경우 역쉬 경로가 적(크래커) 에게 발견이 된다. 오류를 아싸리 안보여 지게 설정 하는 것도 좋은 방법 이다.

php.ini 에서 설정 이 있다.

Php Error Reporting

쿠키 보다는 세션을 !!! 세션 보다는 Auth 인증을 사용하라 !!!

쿠키는 해킹이 무자게 쉽다고 한다. 세션을 되도록이면 사용하라 !!! 세션을 사용하시되, session_set_save_handler() 를 사용하여 세션을 md5() 로 암호화 하고 저장 하라 ^^

세션을 사용할때 /tmp 폴더에 저장 하지 말라고 한다 !!! 반드쉬 mysql 에 저장 하라 !!!

 Auth 인증  << 세션 <<<<<< 쿠키

Auth 인증 이 가장 강력한 보안 체계 이다. !!!

http://www.zend.com/zend/tut/authentication.php http://download.php.net/manual/en/features.http-auth.php

auth 강좌는 PHP강좌 게시판에서 auth 로 검색하세용 !!

세션 쿠키값 - 보안 로그인 시스템

$userid 형태로 사용하시지 말고

세션일 경우 _SESSION 이나 (PHP4.1.0) , HTTP_SESSION_VARS[] 를 사용하라. 쿠키도 마찬가지 , PHP4.1.0 에서 약간 바뀌었으니 PHP강좌 게시판 검색하세용.!! php 로 !!

if((session_is_registered(username)) && (session_is_registered(user_id)))
if (!isset($memberid) && !isset($PHPSESSID)){

session_is_registered() 나 isset() 는 반드쉬 사용해야 한다.

<?php
function check_session() {
    session_start();

    if (session_is_registered(user_id)) {
        return TRUE;
    } else {
        header("Location: login.php");
        exit;
    }
}
?> 

그리고 if 문에서 비교는 반드쉬 1개 이상으로 비교 하세용 !!!

session_start();

if(!isset($sid) || empty($sid)) // $sid 는 세션 값..

<?php
// 반드시 register global=off 로 설정 하고 아래 처럼 하라. !!
// PHP4.1.0 이상 부터는 $_SESSION[type] 이다.
// ◆◇◆◇◆◇ 세션변수를 $session_name 등으로 절대루 사용하지 마세용 !!!◆◇◆◇◆◇
session_start();

if(!isset($HTTP_SESSION_VARS[type]))
{
  header("Location: log-in.php");
}
?> 

쇼핑몰이나 e-커머스 사이트는 반드시 SSL 를 사용하라.

apache 리눅스나 유닉스 경우는 openSSL 를 사용할 수 있다. 윈도우는 잘 모르겠다. openSSL 를 반드시 사용하라 ^^

Let's encrypt

http://www.openssl.org

웹에서 https://~~ 로 시작 하는 것들이 SSL 이다. 인증 사이트 가면 보실 수 있을 것 이다. msn 만 해도..메일 확인 하려 하면.. 보안을 해제 하려고 한다..그러면서 https 로 가죠..^^

PHP에서 mysql 연결시 계정을 만들어 사용하라 !!!

config.inc.php

<?php
$db_user = "root";
$db_pass = "xxxx";  // root 비밀번호
?>

PHP파일에서 config 파일에서 종종 root 로 mysql 에 연결 하는 경우가 있다. 되도록이면 root 는 사용하지 말아야 한다.

root 로 사용할 경우 , PHP 소스가 보일 경우 데이터베이스는 모두 지워진 것이나 다름이 없기 때문이당.. root 가 아닌 특정 사용자 계정을 만들고 권한을 부여 해라 !!

root 의 비번은 어느곳이든 지 간에 쓰지 않는 것이 최상이다 !!! 소스 자료실에 mysql 계정 설정 권한 설정 하기 파일이 존재 한다. doc 파일임.. 그것을 보고 반드쉬 임의 계정을 만들어서 사용하라 !! 디비가 지워지고 싶지 않으면 !!!

현명한 config.inc.php

<?php
  $db_user = "tood";
  $db_pass = "xxxx";  // tood 비밀번호 - 임의 사용자 비번
?>

반드쉬 알아야 할 PHP보안 함수 - 쓰기전에 반드쉬 보안을 생각해야 할 함수 12 가지 !

safe mode 를 사용하라

php.ini 에 보면 safe mode 설정이 있다.

safe_mode 를 On 하고 ,소유자가 nobody 인지 다른 사용자가 되는지 테스트 해보라 ^^ 계정이 여러개 일때 좋다.

php.ini 중에서 일부

;
; Safe Mode
;
safe_mode = Off

safe_mode_exec_dir = 

PHP소스 안보이게

(1) avoid using .inc files; use .php files like for normal script .inc 보다는 .inc.php 로 저장 하기 ! httpd.conf <Files ~ ".inc$">

  Order allow,deny
  Deny from all

</Files>

(2) turn Indexes directive to off by default per website httpd.conf 에서 Indexes 지우기 → index.html 파일이 없을 경우 디렉토리 아래 죄다 보임 !

(3) make directories 711 instead of 755 (4) develop an organized php scripts structure outside DocumentRoot and place the files that you will eventually include in an "include" sudirectory within that structure (5) review changes all the time, check your weblogs and be vigillent :-)

PHP 에러 출력 안하기

Php Error Reporting관리는 보안을 위해서는 필수.

php.ini의 Error_Handling 부분에서 display_errors = Off 로 설정해 주면 된다.

HTML 일부만 허용 하기와 보안

Example 1. strip_tags() example

$string = strip_tags($string, '<a><b><i><img>');

$string 에서 <a><b><i><img> 태그만 허용 하고 나머지는 막는 것이다. htmlspecialchars() 보다 유용하다.

그런데 문내가 존재 한다.<b> 태그를 허용 할 경우…

<b onmouseover="for(i=0;i<50;i++)window.open('www.porn.com');">tood.net 미오!</b>

이런 문장을 쓸 경우 문내가 된다..ㅋㅋㅋ 만약 i 를 5000000 까지 한다면… 헐….

<b onmouseover="for(i=0;i<500000000;i++)window.open('www.porn.com');">tood.net미오!</b>

글구 <a> 태그를 허용해도 <a href="" target=""> target 는 허용이 되지 않다..ㅋㅋㅋ 짭..

location.replace 인증 부분

음 넘 초보적인 방법이지만 그래두 함 적어보겠다. 만약 게시판에 관리자 모드가 있다면…많은 보안이 필요.

사용하는 방법에 아주 간단한 자바스크립트를 추가 한다면 좋다.

function goto_page($url) {
    echo "<script> location.replace(".$url."); </script>";
}

보안이 조금이나마 필요한 부분에선 이 함수를 사용해서 이동했던 페이지들을 히스토리에서 삭제를 하는 것

가끔 어떤 곳에서 로그아웃을 했더라구 뒤로가기 버튼을 클릭하면 이전 페이지가 나오는 것을 많이 목격하고 위 에 함수를 많이 사용하게 되었다.

위 처럼 하면 로그 아웃 후에 뒤로가기 버튼을 눌러두 이전 페이지가 아닌 잴 처음 화면으로 가지.

스팸 봇이 여러분의 email주소를

스팸 봇이란 넘이 있어서 여러분들의 email 주소를 긁어 간다. 그러니까 게시판에서 <a href=mailto: ~ > mailto 부분의 email 주소를 긁어 간다.

거기에 사용되는 email 주소는 base64 나 md5() 로 암호화 하라 ^^

PHP 확장자 숨기기

PHP 확장자는 마음대로 변경 하여 사용할 수 있다.

아래는 윈도우에서 httpd.conf 파일 이다. 물론 리눅스도 AddType 부분은 동일.

LoadModule php4_module c:/php/sapi/php4apache.dll
AddType application/x-httpd-php .tood .tgp .cal .html .htm .include

위에 처럼 설정 하면 .tood .tgp .cal .html .htm .include 파일에서 PHP 를 사용할 수 있다.

확장자만 가지고는 이 사이트가 PHP 기반인지 알 수 없다.

세션 보안 최적화 !trans_id

PHP counfigure 시에 세션 보안 방법 이다. trans_id 옵션 보시면 된다. 재설치 해야 한다.

연결문서