Thread Safe 와 Non Thread Safe
우선 윈도우용 PHP는 항상 Thread Safe 버전으로 나왔었다. 이유는 윈도우가 멀티쓰레드 방식인데 PHP 는 멀티프로세스 방식으로 개발 되었기 때문이다. 참고로 리눅스나 유닉스는 원래 멀티프로세스 방식이었기에 문제가 되지 않았다.
PHP를 IIS와 연동하기 위해 CGI 또는 ISAPI 방식으로 연동을 한다. 그런데 PHP와 관련된 모듈들이 대부분 멀티프로세스 방식으로 개발 되었기 때문에 멀티쓰레드 방식으로 개발된 ISAPI 로 연동하였을 경우 서버가 다운되는 현상이 나타났다.
그래서 안정적인 방법으로 CGI 방식을 사용하긴 하지만 이 것 역시 퍼포먼스 측면에서 너무 느리다는게 문제가 되었다. 이 퍼포먼스 문제를 개선한 것이 Non Thread Safe 버전이라고 생각하면 되겠다…^^
정리를 하자면
NTS는
TS는
결론적으로 아래와 같이 설치하면 된다.
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>
print "$a"; //변수값를 표시 print $a; //변수값를 표시 print "a"; //문자열을 표시 print "\$a"; //$a가 표시
긴 문자열을 간결하게 나타낼 수 있다
<html><body> <?php $a=<<<임의의 이름 // '<<<'는 히어 도큐먼트의 처음을 나타냄 내용~~~ 임의의 이름; ?> </body></html>
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.
비교 시 "==="은 값과 형식도 같으면 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
자식을 참조로 얻을 수 있다.
<?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 ($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("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"] 두개로 이루어진 배열이다.
형식) Void list
변수를 배열인 것처럼 만든다.
예) $test = array(7,"9","8","안녕하라","환영한다");
while (list($key,$val) = each($test)){
echo $key."⇒".$val."
";
}
위의소스는 다음을 출력한다.
0⇒7
1⇒9
2⇒8
3⇒안녕하라
4⇒환영한다
형식) Array each(Array array)
배열에서 다음 키 이름과 배열 값을 쌍으로 돌려준다. 이 쌍은 네개의 원소를 가진 배열로 반환되는데 이 네개의 원소의 키는 0, 1, key, value 이다. 0과 key원소는 각각변수의 키 이름을 가지고, 1과 value는 배열값을 갖는다.
형식) 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 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 array_merge(Array array1, Array array2, ……)
두 개 이상의 배열을 하나의 배열로 합한다. 만약 합쳐질 배열들의 키값(인덱스값)이 서로 같으면, 뒤의 배열값으로 덮어씌운다.
형식) Array array_reverse(Array array)
원래 배열값을 역순으로 저장한다. 리턴되는 값은 역순으로 저장된 배열이다.
형식) Int array_push(Array array, mixed var, […])
배열의 맨 뒤에 한개나 그 이상의 원소를 첨가한다.
예) $test = array(1,3);
array_push(3,4);
위의예는 $test라는 배열에 3, 4 두개의 요소를 첨가한다.
형식) 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)
대소문자 안구분 함수.
<?php function arrayDuplicate($array) { return array_unique(array_diff_assoc($array1,array_unique($array1))); }; ?>
형식) Int array_unshift(Array array, Mixed var, [……]);
배열의 맨 앞에 한개나 그 이상의 원소를 추가한다.
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; }
형식) Mixed array_shift(Array array)
배열의 맨 앞에 있는 원소를 꺼내어 변수에 할당하고 그 원소를 배열로부터 삭제한다.
형식) Array array_slice(Array array, Int offset, Int [length])
배열에서 일부의 요소를 추출한다.
offset : 배열에서 추출할 시작값을 지정하는것으로 양수인 경우 배열의 첫번째 원소에서 offset 값의 다음 배열원소부터 배열을 추출하며, 음수인경우 배열의 마지막 원소에서 offset값부터 배열을 추출한다.
length : 추출할 배열 원소의 개수를 지정한다. 만약 이 값이 음수이면 전체 배열의 끝에서부터 길이를 줄일 수 있다.
형식) Array array_splice(Array input, Int offset, Int [length], Array [replacement])
배열의 일부를 삭제하고, 삭제한 위치에 다른 내용을 넣는다. 리턴값은 삭제된 배열 원소로 구성된 배열이다.
offset : 제거할 비율을 지정한다. 양수인 경우 배열의 처음 원소에서 음수인경우 배열의 마지막 원소에서 각각 그 값을 지정할 수 있다.
length : 생략 가능한 인자이며, 삭제될 배열의 크기를 지정한다.
replacement : 대체할 배열을 지정한다.
형식) 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 )
형식) Void arsort(Array array)
원래 가지고 있던 인덱스 값을 유지하면서 배열을 역순으로 정렬한다.
형식) Array compact(String Varname | Array varname)
주어진 변수값을 가지고 배열을 만든다.
예) $test1 = "kim";
$test2 = "kihee";
$test4 = compact("test1","test2",$test3);
위의예에서 $test4에는 다음과 같은 값들이 배열로 저장된다.
$test4[test1] = "kim"
$test4[test2] = "kihee"
형식) Int count(Mixed var)
배열 변수의 원소 개수를 구한다. 리턴값으로 배열 요소의 개수를 반환하며 배열이 아닐 경우 1을, 배 벼열에 값이 없을 경우 0을 반환한다.
형식) Int sizeof(Array array)
배열의 크기 즉, 원소의 개수를 구할 수 있다.
형식) Mixed current(Array array)
배열의 현재 원소를 돌려준다. current함수는 단순히 내부적인 포인터가 가르키고 있는 원소를 가르킨다. 만약 이 포인터가 원소 리스트의 범위를 넘어서 지시하고 있다면 current 함수는 false값을 반환한다. 주로 반복문에서 사용되지만 current()함수를 사용하는것보다 each()함수를 사용하는것이 더욱 안정적이다.
형식) Mixed pos(Array array)
배열의 현재 원소를 리턴한다.
형식) reset(Array array)
배열의 내부 포인터를 맨 처음 원소로 설정한다.
형식) end(Array array)
배열의 내부 포인터를 맨 마지막 배열 원소로 옮긴다.
형식) Mixed key(Array array)
배열에서 내부 포인터가 가리키고 있는 원소의 키값을 가져온다.
형식) Mixed next(Array array)
배열의 내부 포인터를 하나 전진시킨다.
형식) Mixed prev(Array array)
배열의 내부 포인터를 하나 후진시킨다.
형식) Void extract(Array var_array, Int [extract_type], String [prefix])
배열의 내용을 심볼 테이블로 읽어들여 일반적인 변수로 만든다. 배열에서 키 값은 변수명으로 배열값은 변수값으로 대치된다.
예를 들어
$a[x] = 111; $a[y] = 222;
에서 extract(a) 할 경우 x = 111, y = 222
가 되는 것이다.
그러면 소스에 extract($_GET)이 있다면??? 보안에 위험이 있으니 쓰지 않도록한다.
형식) bool in_array(mixed needle, array kaystack)
배열에서 찾는 값이 있으면 true값을 없으면 false값을 반환한다.
mixed needle : 찾고자 하는 값
array haystack : 배열명
형식) Void sort(Array array)
배열을 정렬한다.
형식) Void ksort(Array array)
배열을 키 순으로 정렬한다.
형식) Void rsort(Array array)
배열을 역순으로 정렬한다.
foreach ($arr as &$value) { $value = $value * 2; }
$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
<?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 )
$match="alpha>beta" $matches=explode(">",$match);
$matches[0]은 alpha, $matches[1]은 beta
0
이다.if (substr($_str, 0, strlen($opt) ) == $opt) {}
if (substr($str, -1*strlen($try))===$try) return $try;
$dirname = "whatever"; if (!is_dir($dirname)) { mkdir($dirname); }
$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."; }
$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; } ?>
<?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 ?>
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)
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; }
php5 에서는 simpleXML 이라는 강력하고도 좋은 xml 클래스를 제공한다.
간단 예제
<?php include 'test.xml'; $movies = new SimpleXMLElement($xmlstr); echo $movies->movie[0]->plot; ?>
[출처] PHP 함수 간단 정리|작성자 개나리 A37
현재 페이지의 주소 구하기
$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.ini 설정에서 register_globals = on/off 차이점과 기능설명
register_globals 를 On 으로 하면 변수가 get, post, session 변수인지 체크하지 않아도 된다. 쓰기에 따라서 보안적인 부분에 문내가 생길 수 있다
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)){
이런 식으로 ^^
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(); ?>
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 파일의 업로딩을 방지 한다.
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과 자바스크립은 뚫립니다. 쿠키 까지 알아 낼 수 도 있다. 콤포넌트를 사용한 방식이 라도 안된다. hotmail.com 에서 장난 쳐서 보낼 수 도 있다.
무조건 태그는 막는것이 좋다. 그러나 대부분의 사용자는 모르고 있죠. 글서 보통 허용하는 것이 일반적 이다. 그러나 허용을 하더라도 <script> 등의 소스나 <a> 태그 외에 <a onmouse~> 등의 태그는 안된다. 무자게 생각할 것이 많고 적용할 소스가 많다.
아싸리 막아 버리세요.
일단 막고 등으로 사용하게 하는 것이 좋습니당. !!!
바로 브라우져에서 보일 수 있으며 간단한작동 만으로 데이터베이스 패스를 볼 수 있다.
파일명을 저장 하시려거든 , *.inc.php 로 하라.
물론 Apache 에서 Addtype 에서 .inc 를 추가 하면 됩니당..^^
phpinfo() 의 경우 시스템의 구성 상황을 비교적 쉽게 해커에게 알린다. 물론 phpinfo() 때문에 해킹 당하지는 않겟지만.. 해킹에 도움이 된다
<?php phpinfo(); ?>
를 사용하고 바로 지워 주라… 검색엔진에서 검색하면 많은 phpinfo() 를 볼 수 있다…
http://www.google.com/search?q=phpinfo
다 설치 하고 test 를 했다면 지워 ^^
PHP오류가 날 경우 역쉬 경로가 적(크래커) 에게 발견이 된다. 오류를 아싸리 안보여 지게 설정 하는 것도 좋은 방법 이다.
php.ini 에서 설정 이 있다.
쿠키는 해킹이 무자게 쉽다고 한다. 세션을 되도록이면 사용하라 !!! 세션을 사용하시되, 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"); } ?>
apache 리눅스나 유닉스 경우는 openSSL 를 사용할 수 있다. 윈도우는 잘 모르겠다. openSSL 를 반드시 사용하라 ^^
웹에서 https://~~ 로 시작 하는 것들이 SSL 이다. 인증 사이트 가면 보실 수 있을 것 이다. msn 만 해도..메일 확인 하려 하면.. 보안을 해제 하려고 한다..그러면서 https 로 가죠..^^
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.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 Error Reporting관리는 보안을 위해서는 필수.
php.ini의 Error_Handling 부분에서 display_errors = Off 로 설정해 주면 된다.
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 는 허용이 되지 않다..ㅋㅋㅋ 짭..
음 넘 초보적인 방법이지만 그래두 함 적어보겠다. 만약 게시판에 관리자 모드가 있다면…많은 보안이 필요.
사용하는 방법에 아주 간단한 자바스크립트를 추가 한다면 좋다.
function goto_page($url) { echo "<script> location.replace(".$url."); </script>"; }
보안이 조금이나마 필요한 부분에선 이 함수를 사용해서 이동했던 페이지들을 히스토리에서 삭제를 하는 것
가끔 어떤 곳에서 로그아웃을 했더라구 뒤로가기 버튼을 클릭하면 이전 페이지가 나오는 것을 많이 목격하고 위 에 함수를 많이 사용하게 되었다.
위 처럼 하면 로그 아웃 후에 뒤로가기 버튼을 눌러두 이전 페이지가 아닌 잴 처음 화면으로 가지.
스팸 봇이란 넘이 있어서 여러분들의 email 주소를 긁어 간다. 그러니까 게시판에서 <a href=mailto: ~ > mailto 부분의 email 주소를 긁어 간다.
거기에 사용되는 email 주소는 base64 나 md5() 로 암호화 하라 ^^
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 기반인지 알 수 없다.
PHP counfigure 시에 세션 보안 방법 이다. trans_id 옵션 보시면 된다. 재설치 해야 한다.