header( "Content-type: application/vnd.ms-excel" );  
header( "Content-type: application/vnd.ms-excel; charset=utf-8"); 
header( "Content-Disposition: attachment; filename = invoice.xls" );  
header( "Content-Description: PHP4 Generated Data" );  
 
$sql = "select * from tblName order by reg_date desc"; 
$result = mysql_query($sql); 
 
// 테이블 상단 만들기 
$EXCEL_STR = " 
<table border='1'> 
<tr> 
   <td>번호</td> 
   <td>코드</td> 
   <td>내용</td> 
</tr>"; 
 
while($row = mysql_fetch_array($result)) { 
   $EXCEL_STR .= " 
   <tr> 
       <td>".$row['idx']."</td> 
       <td>".$row['code']."</td> 
       <td>".$row['contents']."</td> 
   </tr> 
   "; 

 
$EXCEL_STR .= "</table>"; 
 
echo "<meta content=\"application/vnd.ms-excel; charset=UTF-8\" name=\"Content-type\"> "; 
echo $EXCEL_STR; 
?> 

 

출처 : http://ezcode.tistory.com/75

Posted by 철냄비짱
,

 오랜만에 PHP 작업을 하는데 함수도 기억안나고 해서 어려움이 많다.

 

그래도 PHP가 에러 메세지가 너무 친절해서 큰 어려움은 없었는데...

 

CAFE24에서 작업하면 에러메세지가 안난다....

 

이 문제가 너무 힘들어서 찾아서 해결한 내용...

 

호스팅 root 폴더에 존재하는 .htaccess

 

하단 내용을 추가하면 해결 됨.

 

 

php_value error_reporting 22527
php_flag display_errors on

 

이 경우 NOTICE 문장도 같이 표출되는데 개발할 때는 NOTICE는 무시하면 됨.

Posted by 철냄비짱
,
만약 한 대의 컴퓨터에서 여러 개의 웹사이트를 운영하고 싶다면? 정답은 VirtualHost를 이용하는 것이다.

X:\xampp\apache\conf\extra\httpd-vhosts.conf 파일을 수정하자.

우선 19번째 줄에서 코멘트를 해제하자.

NameVirtualHost *:80

맨 끝에 다음을 추가한다.

<VirtualHost *:80>
 DocumentRoot "/xampp/htdocs"
 ServerName localhost
</VirtualHost>

기본값대로 브라우저에 localhost라고 입력해도 여전히 X:\xampp\htdocs 를 가리키게 하기 위함이다.

이제 우리가 추가할 폴더는 다음과 같이 지정한다.

예1) 브라우저에 wems라고 치면 X:\home\wems\public_html 를 가리키게 하고 싶을 때. 폴더명을 이렇게 해두면 php에서는 여전히 문서 위치가 /home/wems/public_html 로 리눅스에 업로드한 후에도 절대 경로가 같기 때문에 편하다.

<VirtualHost *:80>
 DocumentRoot "/home/wems/public_html"
 ServerName wems
 <Directory "/home/wems/public_html">
  Options Indexes Includes execCGI
  AllowOverride None
  Order Allow,Deny
  Allow From All
 </Directory>
</VirtualHost>
예2) wems.snupaim.net이라는 주소에 대해 X:\home\wems\public_html 내의 파일을 서비스하고 싶을 때

<VirtualHost *:80>
 DocumentRoot "/home/wems/public_html"
 ServerName wems.snupaim.net
 <Directory "/home/wems/public_html">
  Options Indexes Includes execCGI
  AllowOverride None
  Order Allow,Deny
  Allow From All
 </Directory>
</VirtualHost>

(참고로 이 경우, 네임서버에서 wems.snupaim.net에 대해 내 컴퓨터의 아이피를 가리키도록 bind를 설정해두어야 외부에서도 wems.snupaim.net 주소로 내 컴퓨터 내의 X:\home\wems\public_html 내의 파일을 서비스받을 수 있다.)

apache의 설정을 바꾼 것이므로 XAMPP 혹은 apache만 껐다가 다시 켜야 반영된다.


여기서 끝은 아니고, C:\windows\system32\drivers\etc\hosts 파일을 열고 수정해줘야 한다.

127.0.0.1 localhost

은 이미 추가되어 있을 것이다. 여기에 다음을 추가해야 제대로 동작한다.

127.0.0.1 wems

X:\home\wems\public_html 안에 index.html 파일을 만들어서 <h1>WEMS</h1> 이라고 적고 저장한 후 브라우저 주소줄에 wems라고 입력해보자. WEMS라고 나오면 제대로 된 것이다.


참고문헌 : How to config VirtualHosts with XAMPP? (http://forums.whirlpool.net.au/forum-replies-archive.cfm/569991.html)
[출처] 내 컴퓨터에서 웹서비스를 하자 - 3. XAMPP에서 Virtual Host 설정하기|작성자 짱이야
Posted by 철냄비짱
,

PHP에서 iconv 사용가능 하여야 합니다.

 

function tostring($text) {
//    return iconv('UTF-16LE', 'UTF-8', chr(hexdec(substr($text[1], 2, 2))).chr(hexdec(substr($text[1], 0, 2))));
    
return iconv('UTF-16LE''UHC'chr(hexdec(substr($text[1], 22))).chr(hexdec(substr($text[1], 02
))));
}
function 
urlutfchr($text
){
    return 
rawurldecode(preg_replace_callback('/%u([[:alnum:]]{4})/''tostring'$text
));
}

 

처리할 문서가 charset euc-kr 일경우 함수 tostring 에서 iconv 2번째인자를 "UHC" 로

 utf8 일경우 "UTF-8"로 지정한다.

 

Ex

$escapeString = "%uC548%uB155%uD558%uC138%uC694";  // 자스에서 "안녕하세요"를 escape 한 문자열

$unEscapeString = urlutfchr($escapeString);

echo $unEscapeString;

 

// 출력결과

// 안녕하세요

Posted by 철냄비짱
,

PHP개발에 관해서 찾다가..


이라는 글을 찾았습니다.
오호~ PHP에도 Framework라는 개념이 있더군요.
그래서 PHP Framework를 선택하기 위해서 이런저런 자료를 조사 하면서 조사한 내용을 정리 해 볼려고 합니다.

Ruby On Rails의 영향으로 웹 프로그래밍에서 Framework에 대한 관심이 폭발적으로 늘어나게 되고, PHP에서도 Framework에 지원이 활발하게 진행이 되었나 봅니다. 그리고 위의 글에서와 같이 여러개의 PHP Framework가 생겨 나게 되고, 현재 주류를 이루고 있는 Framework는 4개 정도로 압축 되는거 같습니다.

  • Zend Framework
  • CakePHP
  • Code Igniter
  • Symfony

자료를 찾아서 나름대로 특징을 정리 해 봤습니다.



Zend Framework
zend framework

  1. PHP의 핵시 기부자인 Zend Technologies에서 개발.
  2. PHP5 만 지원
  3. 다양한 DB 데이터베이스 추상화
  4. 확장가능한 MVC 모델 지원
  5. HTML 폼 렌더링 및 유효성 검사 지원
  6. 유연한 캐싱 서브 시스템
  7. 엄격한 코드 테스트를 거친 안정된 코드
  8. 국제화 지원
  9. 많은 양의 예제 지원
  10. new BSD 라이센스
  11. 국내 사용자 포럼을 못 찾았음.

CakePHP

  1. PHP4, PHP5 지원
  2. 구조화 된 MVC모델 지원
  3. 데이터베이스 인터랙션과 간략화한 쿼리를 위한 CRUD 가 통합됨
  4. 애플리케이션 스캐폴딩
  5. 보기좋은 맞춤 URL 의 요청 디스패처
  6. 빠르고 유연한 템플릿 기능 (PHP 문법, 각종 헬퍼 포함 )
  7. AJAX, 자바스크립트, HTML 폼을 위한 각종 뷰 헬퍼
  8. 보안, 세션, 리퀘스트 등을 처리하는 컴포넌트
  9. 유연한 뷰 캐시
  10. 유연한 접근 제한 목록
  11. 자료 검사 기능 내장
  12. 국제화 지원
  13. MIT License
  14. CakePHP 한국 사용자 모임.

Code Igniter

  1. PHP4, PHP5 지원
  2. 설치가 간편하다.
  3. 잘 정리된 문서
  4. 확징이 용이하다.
  5. MVC 모델 지원
  6. 간견한 문법
  7. 다른 프레임워크에 비해 빠른 속도
  8. 국제화 지원
  9. BSD 라이센스
  10. CodeIgniter 한국 사용자 모임 : 2009년 7월 19일에 오픈 예정이라고 합니다.
  11. CodeIgniter 한글 메뉴얼


Symfony

  1. PHP5만 지원
  2. 간단한 템플릿과 도우미(Helpers)
  3. 캐시 관리
  4. 기본 골격 (CRUD/Admin generator)
  5. 스마트 URLs (routing policy)
  6. 국제화 지원
  7. 객체모델과 MVC 분리
  8. MIT License
  9. 국내 사용자 포럼을 못 찾았음.

주요 특징들의 위와 같습니다. 여기저기서 찾은 자료들이라서 ^^;; 잘 비교가 되지 않네요..



실행 속도 비교

그리고 다음은 중요한 실행 속도 입니다.
4개의 Framework를 모두 비교한 자료는 찾지를 못했습니다.
먼저 Zend Framework, CakePHP, CodeIgniter를 비교한 결과를 그래프로 그려 봤습니다.


그래프에서 높을 수록 빠른 겁니다. CodeIgniter가 독보적인 선두를 보이고 있습니다. 그리고 Zend Framework와 CakePHP가 뒤를 따르고 있습니다.
그런데 Symfony에 대한 비교가 없어서, CakePHP, Zend Framework, Symfony의 속도를 비교를 검색해 봤는데.. 최근에 비교한 내용을 찾을 수가 없었습니다.
그래서 결국 이상한 나라의 언어(글을 보고 어떤 나라인지 유추를 못 하겠네요 ^^;;;)로 된 페이지를 찾았습니다. 언어는 해독 불가(-_-;;) 이지만, 그래프는 볼 수 있어서.. 첨부 합니다.

위와 같은 그래프가 나오더군요.. 결국 Symfony가 4개의 프레임워크 중에서 가장 늦은 속도를 가지고 있는거 같습니다.



그럼 대세는?
마지막으로 Google Trends의 그래프를 첨부하겠습니다.
검색의 빈도를 통해서 어떤게 관심을 받는지 보는건데,
검색 결과로 봐서는 cakephp가 1위 이지만, 가장 후발 주자로 시작한 codeingniter가 많이 따라잡고 있는 것으로 볼 수 있습니다.



여기 까지 PHP Framework를 소개하는 포스팅을 마칠려고 합니다.
비교는 여기까지이고 PHP의 Framework의 선택은 개발자의 몫이 아닐까 합니다.
Posted by 철냄비짱
,

iconv charset

PHP 2008. 11. 26. 23:12


  $row[Name]=iconv("euckr","utf-8",$row[Name]);
   -> 문자열의 charset을  euckr 에서 utf-8 로 컨버팅

 

db에 저장된 한글이 정상이고 해당 필드가 utf-8로 되어 있는 것이라면 
  $row['Name'] = iconv("UTF-8","CP949",$row['Name']);

   -> 문자열의 charset을  utf-8 에서 CP949 로 컨버팅 

 

iconv 함수에 대한 정보 : http://kr.php.net/manual/en/function.iconv.php

Posted by 철냄비짱
,

php->Excel reader

PHP 2008. 11. 24. 10:41

<?
require_once 'Excel/reader.php';
$data = new Spreadsheet_Excel_Reader();
$data->setOutputEncoding('CP949'); // 이부분만 바꿨습니다.
$data->read('kortest.xls');

error_reporting(E_ALL ^ E_NOTICE);
echo "<table border=1>";
for ($i = 1; $i <= $data->sheets[0]['numRows']; $i++) {
echo "<tr>";
for ($j = 1; $j <= $data->sheets[0]['numCols']; $j++) {
echo "<td> ".$data->sheets[0]['cells'][$i][$j]."</td>";
}
echo "</tr>\n";
}
echo "</table>";
?>
Posted by 철냄비짱
,

str_word_count

PHP 2008. 11. 24. 08:05

str_word_count

(PHP 4 >= 4.3.0, PHP 5)

str_word_count --  문자열에서 사용한 단어에 대한 정보를 반환합니다.

설명

mixed str_word_count ( string string [, int format])

string 안의 단어 수를 셉니다. 선택적인 format을 지정하지 않으면, 반환값은 단어 수를 나타내는 정수입니다. format를 지정하면, 반환값은 배열로써, 내용은 format에 따라 결정됩니다. 아래 목록은 format으로 사용할 수 있는 값과 그에 따른 출력입니다.

  • 1 - string에서 발견한 모든 단어를 포함하는 배열을 반환합니다.

  • 2 - string 안에서 단어 위치를 키로, 그 단어를 값으로 가지는 연관 배열을 반환합니다.

이 함수의 작동에서, '단어'는 알파벳 문자를 포함하는 로케일 의존 문자열로, "'"'와 "-" 문자로 시작하지 않는 문자들을 포함합니다.

예 1. str_word_count() 사용 예제

<?php

$str
= "Hello friend, you're
        looking          good today!"
;

$a   = str_word_count($str, 1);
$b   = str_word_count($str, 2);
$c   = str_word_count($str);

print_r($a);
print_r($b);
echo
$c;
?>

출력은:

Array
(
    [0] => Hello
    [1] => friend
    [2] => you're
    [3] => looking
    [4] => good
    [5] => today
)

Array
(
    [0] => Hello
    [6] => friend
    [14] => you're
    [29] => looking
    [46] => good
    [51] => today
)

6

Posted by 철냄비짱
,

로딩화면 만들기

PHP 2008. 11. 19. 14:24

다른분이 답변해 주신것처럼..  페이지를 미리 로딩하는 방법은 없습니다.
하지만 꽁수를 조금 부릴수는 있겠죠..
로딩이 느린 페이지를 a.html 이라고 한다면 a.html 페이지에 다음과 같은 코드를 사용합니다.

 

<div id="loading">
loading....
</div>
<iframe id="" name="" src="b.thml" frameborder="0" width="1" height="1" style="display:none"></iframe>

 

그리고 b.html 에서는 다음과 같은 코드를 작성합니다.

 

<div id="loading">
내용들...
</div>

<script language="javascript">
function Set()
{
 try{
  parent.document.all["loading"].innerHTML = "";
  parent.document.all["loading"].innerHTML = document.all"loading"].innerHTML;
 }catch(e){ }
}
window.onload = Set;
</script>


눈치 채셨겠지만.. 
a.html 에서는 loading 중이라는 문구를 보여주고..
b.html 에서 내용을 로딩한후..  a.html에 뿌려주는 방식입니다..

상황에 맞게 잘 응용하시면..  많은 도움이 되시리라 생각합니다..

Posted by 철냄비짱
,

PHP팁 (보안 등)

PHP 2008. 11. 19. 14:20

register_globals = Off

아직도 많은 국내의 호스팅 업체들에서 register_globals = On 으로 놓고 서비스를 하고 있으나 Off 로 해야 옳다.
물론 이렇게 하면 제로보드처럼 On에서 코딩한 것들은 쓸 수 없게 된다. (제로보드는 쓰지 않는 것이 좋다.)
register_globals = On 으로 놓고서 코드 내에서 따로 보안을 위해 변수를 검사하는 방법도 있겠으나, 그런 이중의 수고를 막으려면 php4 이상에서는 그냥 register_globals = Off 로 하고 그에 따라 코딩해야 한다.

    이를테면 $a를 받아서 $b = $a; 로 처리해야 할 때는,
  • $b=$_GET["a"]; (GET 방식으로넘어온 변수일경우)
  • $b=$_POST["a"]; (POST 방식으로넘어온 변수일경우)
  • $b=$_COOKIE ["a"]; (cookie에서 넘어온 값이면)
  • $b=$_SERVER["a"]; (서버변수일경우)
  • $b=$_ENV["a"]; (환경변수일 경우)
  • $b=$_REQUEST["a"]; (서버요청변수일 경우. - GET, POST, Cookie 방식으로 넘어오는 모든 경우에 해당되며, 보안상 권장되지 않는다.)
  • $b=$_SESSION["a"]; (세션변수이면)
  • $b=$_FILES["a"]; (file 업로드로 넘어온 변수이면)
와 같이 처리해야 한다.
위 처럼 하기 귀찮을 경우, extract($_GET); 으로 선언하면 $_GET['a']로 들어오는 $a 를 자동으로 인식한다.
♣ 단, SESSION 변수의 경우 절대 extract($_SESSION); 하면 안된다. 보안에 위배되기 때문이다. if (isset($_GET['password'])) { $password = $_GET['password']; echo $password; }

.inc 파일 등 특정 확장자 소스 못보게 하기

아파치 설정파일(httpd.conf) 안에 보면 아래와 같은 라인이 있다.

AddType application/x-httpd-php .php .php3 .html .sql .ph .inc .ins
AddType application/x-httpd-php-source .phps


위에서와 같이 inc를 등록시키면 된다.
그리고 웹브라우저에서 보아도 소스는 나오지 않는다. *.inc 등으로 작성하려거든 반드시 이렇게 해야만 한다. 혹은 *.inc.php 이런 식으로 작성한다.

PHP 보안을 위한 코딩 스타일 (파일 업로드 등)

현재(2002.3) PHP4.1.2 나 PHP4.2.dev 버전을 제외한 모든 버전은 PHP4.1.2로 패치할 것을 권고하고 있다. PHP 파일 업로딩이 RFC 1867에 의해 만들어졌는데, 웹서버를 재부팅 시킬 수도 있다고 한다. PHP4.1.2 이상의 최신 버전이 아닌 모든 버전은 파일 업로드 버그가 존재한다고 한다.

예전 스타일의 파일 업로드를 사용하지 마라; HTTP_POST_FILES 배열과 관련된 함수를 사용해라. PHP 는 특별한 이름을 갖는 어떤 임시디렉토리에 파일을 업로드함으로써 파일 업로드를 지원한다. PHP 는 그 파일 이름이 존재했던 곳을 가리키기 위해 원래 많은 변수들을 설정한다. 그러나 공격자가 변수 이름 및 그 값을 제어할 수 있기 때문에 이들을 사용해 커다란 악영향을 야기할 수 있다. 대신 업로드된 파일에 접근하기 위해서는 언제나 HTTP_POST_FILES 및 관련된 함수를 사용해라. 이 경우라도 PHP 는 공격자가 임의의 내용을 갖는 파일을 업로드할 수 있게 하며 이는 그 자체로 위험함을 주목해라.

모든 입력에 대해 다른 언어에서와 같이 받아들일 수 있는지 패턴과의 일치 여부를 검사하고 그 후 문자열이 아닌 데이타를 요구되는 타입으로 맞추기 위해 타입 캐스팅을 사용해라. (예상되는) 입력의 선택된 리스트를 쉽게 검사하고 import 하기 위해 ``helper" 함수를 개발해라. PHP 는 부정확하게 타입이 정해질 수 있는데 (loosely-typed) 이는 문제를 야기할 수 있다. 예를 들어 입력 데이타가 "000" 값을 갖는다면 이는 "0" 와 같지 않으며 또한 empty() 도 아니다. 이는 특히 결합 (associative) 배열의 경우 중요한데 이들의 인덱스가 문자열이기 때문이다; 이는 $data["000"] 과 $data["0"] 이 다르다는 것을 의미한다. 예를 들어 $bar 가 double 타입임을 확인하기 위해 (double 에 적합한 포맷을 갖는지 확인한 후) 다음과 같이 해라:
$bar = (double) $bar;

위험한 함수에 주의할 것 :
코드실행함수(require(), include(), eval(), preg_replace() 등), 명령실행함수(exec(), passthru(), backtick 연산자, system(), popen() 등), 파일오픈암수(fopen(), readfile(), file()) 등.

PHP에러출력을 방지한다. php.ini의 Error_Handling 부분에서 display_errors = Off 로 설정한다. (오류가 보여지면 apache 디렉토리 위치나 htdocs 디렉토리 위치를 노출시키게 된다.)

magic_quotes_gpc() 를 사용해라. 이는 많은 종류의 공격을 제거한다.

게시판 글올릴때 html소스는 그냥 다 막아버려라. <a>태그 외에 <a onmouse= 등의 태그도 안되고 자바스크립트도 안된다. 그냥 다 막아버리면 제일 속편하다.

phpinfo();는 설치한 후 테스트하고 바로 지워라.

쿠키보다는 세션을, 세션보다는 autu인증을 사용하라.

location.replace 인증 (이동했던 히스토리 삭제) function goto_page($url) { echo "<script> location.replace('.$url.');</script>"; }

쇼핑몰 등의 사이트는 반드시 SSL을 사용하라.

디렉토리는 755대신 711로 설정. 그리고 될수있으면 아파치 httpd.conf 에서 Indexes 지운다. (index.html 파일이 없을 경우 디렉토리 목록이 출력되는 것을 방지.)

(보안) 세션, 자료실, PHP_SELF

(출처: http://tood.net)

php.ini 에서 register_globals = Off 로 설정했다면 세션의 등록은 아래와 같이 한다. <?php session_start(); $HTTP_SESSION_VARS['foo'] = "blah blah"; // $_SESSION['foo'] = "blah blah"; // $_SESSION은 PHP4.1.0 이상이다. session_register('foo'); ?>

회원 비번은 md5()로 암호화하고 php.ini에서 세션저장장소를 /tmp가 아닌 다른 장소에 저장한다. (보안을 위해)
세션 생성 시 $userid를 생성하고, $userpass = md5($userpass); 로 생성해서, 2개 값이 있는지 비교하고 isset()등으로 비교하는게 좋다.
$userpass값은 md5()로 해싱하면 32자가 되므로 길이를 확인한다.

if((session_is_registered(username)) && (session_is_registered(user_id)))
으로 체크.
<?php function check_session() { session_start(); if (session_is_registered(user_id)) { return TRUE; } else { header("Location: login.php"); exit; } } ?>

파일의 경우는 $HTTP_POST_FILES 를 따로 해야 한다. extract($HTTP_POST_FILES); foreach ($HTTP_POST_FILES as $UploadedFile ) { $UploadedFile_name = $UploadedFile['name']; $UploadedFile_size = $UploadedFile['size']; $UploadedFile_type = $UploadedFile['type']; }

특히 파일의 경우 절대로 GET으로 올리지 못하게 해야한다.
upload.php?file_name=/etc/passwd$file_type=text&file_size=30
이런 식으로 해킹할 시스템의 passwd파일을 자료실에 올려버리고 다운받는 경우가 있기 때문이다. 아예 파일명 중에 pass나 shadow등이 있을 경우 올리지 못하게 하는 방법도 있다.
또는 file_exists($file_name)를 사용하여 체크한다. 로컬 시스템에 파일이 있으면 절대 못올리게 되는 것이다.

$PHP_SELF의 경우도 바로 출력되지 않는다. $_SERVER['REQUEST_METHOD']; //GET or POST $_SERVER['REQUEST_URI']; $_SERVER['PHP_SELF'];

링크로 넘어오는 값 확인

( 출처 : http://www.nzeo.com/bbs/zboard.php?id=cgi_tip&page=2&sn1=&divpage=1&sn=off&ss=on&sc=off&keyword=링크&select_arrange=headnum&desc=asc&no=1030 ) if(!eregi(getenv("HTTP_HOST"),getenv("HTTP_REFERER"))) { $reffer = getenv("HTTP_REFERER"); echo "<script>alert('여기다 무단링크시 남길 메세지');window.location.href='http://4rum.uu.st (홈주소)';</script>"; $filename = "기록할 파일 이름"; if (!file_exists($filename)) touch ("$filename"); chmod($filename,0777); $fp = fopen($filename,"a+"); if (!trim($reffer)) $reffer = "Typing or Bookmark"; fwrite($fp,"IP : $REMOTE_ADDR , REFFER : $reffer\n"); fclose($fp); exit; }

자료실에서 무단링크, 웹상에서 실행을 막는 한 가지 방법

자료를 업로드 할 때 원래이름과 바꿀이름 2가지를 디비에 저장한다. 그리고 다운로드를 받을 때는 디비에서 원래 이름을 가져와서 헤더 함수를 이용해 파일명을 원래이름으로 바꿔서 보냅니다.. 이렇게하면 저장되어있는 파일이름을 알 수가 없기때문에 무단링크, 웹상에서 실행이 불가능 하게된다. 파일이름을 안다고 해도 웹상에서는 실행되자 않는다. (아파치가 인식할 수 없는 확장자명으로 지정했을경우) 그러니까 파일을 저장할때 파일명을 $filename = date("YmdHis").".down"; 으로 한다. 그럼 200101231203.down 이런 식으로 파일명이 된다.

PHP파일문서를 자료실에 올리는 문제 (불완전정보)

자료실에 확장자 php인 자료를 올려 해당 서버의 정보를 유출하거나 자료를 삭제하는 해킹이 있을 수 있다. 이 때는 php를 사용할 디렉토리를 정한 후 모든 php소스는 그 디렉토리 밑에 두어야 한다.

예를 들어 자신의 Document Root 디렉토리가 '/home/aaa/public_html'이라면 public_html 아래에 php란 디렉토리를 만든다. 그런 다음 아파치 웹 서버의 설정파일 httpd.conf 를 다음과 같이 수정한다.

<Directory "/home/aaa/public_html"> ... php_admin_flag engine off ... </Directory> <Directory "/home/aaa/public_html"> ... php_admin_flag engine off ... </Directory>

위와 같이 설정하고 나머지 자료 아래의 html파일은 모두 php디렉토리 밖에 놓아두면 아무런 문제없이 php를 사용할 수 있을 것이다. 또 다른 방법은 자료를 올릴 때 php 파일은 전혀 등록할 수 없게 하는 방법인데 이 부분은 좀 애매한 부분이다. 

[출처] PHP팁 (보안 등)|작성자 큐리

Posted by 철냄비짱
,