아마존 웹서비스(AWS)의 EC2 + S3를 이용하여 웹사이트를 서비스 하는 분들이 많습니다. S3에 이미지를 저장할 경우, 중국에서 웹사이트 접속시 해당 이미지가 표시되지 않습니다. 

GreatFirewall에 의한 차단 때문인데요. 워드프레스에서 차단을 우회하기 위한 코드를 공유합니다.


원리 : 워드프레스 필터를 사용하여 본문의 img 태그의 src를 추출하여 base64 URL로 인코딩하여 반환합니다.

Thumbnail image와 content의 내용을 찾아서 교체합니다. 


아래 내용을 적절히 수정해서 사용하시면 됩니다.


function cs_modify_post_thumbnail_url_html($html, $post_id, $post_thumbnail_id, $size, $attr) {
return apply_filters('cs_html_image_urls_to_base64', $html);
}
add_filter('post_thumbnail_html', 'cs_modify_post_thumbnail_url_html', 99, 5);

// 중국은 S3가 차단되므로 경로를 우회함
function cs_cn_modify_static_url($content) {
$from_domain = 'http://mybucketname.s3-ap-northeast-1.amazonaws.com/uploads/';
$new_domain = home_url() . '?path=' ;

$content = str_replace($from_domain, $new_domain, $content);
return $content;
}
add_filter('cs_cn_modify_static_url', 'cs_cn_modify_static_url', 99, 1);

//이미지 URL을 base64로 인코딩하는 함수
function cs_image_url_to_base64($url) {
$imgData = base64_encode(file_get_contents($url));
$src = 'data:image/png'.';base64,'.$imgData;
return $src;
}

//HTML내용에서 Image URL을 추출하여 Base64로 인코딩하는 함수
function cs_html_image_urls_to_base64($content) {
//URL검증
$from_domain = 'http://myhomepage.com/';

preg_match_all("/<img[^>]*src=[\"']?([^>\"']+)[\"']?[^>]*>/i", $content, $matches);
$all_urls = $matches[1];

for($i=0;$i<sizeof($all_urls); $i++) {
if(strpos($all_urls[$i], $from_domain) !== false)
$content = str_replace($all_urls[$i], er_image_url_to_base64($all_urls[$i]), $content);
}
return $content;
}
add_filter('cs_html_image_urls_to_base64', 'cs_html_image_urls_to_base64', 99, 1);

//본문 컨텐츠의 이미지 필터
add_filter('the_content', 'cs_html_image_urls_to_base64', 99, 1);


자동차보험,의료,보험,대출,미용,금융,법률,부동산,중고자동차,무료듣기,건강,돈,국민임대아파트

Posted by CodeChef

댓글을 달아 주세요

Warning: require_once() [function.require-once]: URL file-access is disabled in the server configuration in ...

Warning: file_get_contents() [function.file-get-contents]: URL file-access is disabled in the server configuration in ...

Warning: getimagesize() [function.getimagesize.php]: URL file-access is disabled in the server configuration in ...

PHP(워드프레스)에서 files_get_contents, fopen, include 등을 사용할 때 절대 경로가 포함된 파일의 주소를 코드 내에서 사용하려고 하면 위와 같은 애러 메세지를 볼 수 있습니다.

일반적인 PHP 코드에서의 해결 방법 4가지와 워드프레스에서의 해결 방법을 소개합니다.


방법 1. php.ini 파일에 설정 추가

 allow_url_fopen = ON

 단점 : 보안상 문제가 생길 수 있으며, 서버 설정을 바꿀 수 없는 경우 적용 불가능


방법 2.  .htaccess 에 아래의 코드 삽입

 php_flag allow_url_fopen = ON

 단점 : 보안상 문제가 생길 수 있음


방법 3. php 스크립트에 아래의 코드 삽입

 ini_set('allow_url_fopen', 'On');


방법 4. fopen 대신 curl 사용

$ch = curl_init();
curl_setopt ($ch, CURLOPT_URL, ‘http://www.example.com/mew.php’);
curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);
$contents = curl_exec($ch);

curl_close($ch); 


위의 방법은 일반적으로 php에서 files_get_contents, fopen등의 함수 사용시 발생할 수 있는 경우에 대한 해결책입니다.  

이 애러가 워드프레스에서 발생하는 경우는 아주 간단한 방법으로 해결하실 수 있습니다.

보안 위험을 높이면서 서버 설정을 바꾸실 필요 없습니다.

워드프레스에서 include_once, require_once 시에 애러가 발생하는 경우에 대한 해결 방법!

Warning: require_once() [function.require-once]: URL file-access is disabled in the server configuration in ...

Fatal error: require_once() [function.require]: Failed opening ... 

이런 애러는 아래와 같은 상황에서 발생하죠..

require_once ( plugins_url('', __FILE__ ) . "yourcode.php" 


 plugins_url('', __FILE__ ) 은 전체 url을 반환하기 때문에, allow_url_fopen이 설정되어 있지 않으면 아래와 같은 이 코드 대신 

 require_once ( plugin_dir_path( __FILE__ ) . "yourcode.php"; 

를 사용하시면 해결됩니다.


자동차보험,의료,보험,대출,미용,금융,법률,부동산,중고자동차,무료듣기,건강,돈,국민임대아파트

Posted by CodeChef

댓글을 달아 주세요

  1. 2015.06.02 19:43  댓글주소  수정/삭제  댓글쓰기

    비밀댓글입니다

  2. Favicon of http://codechef.tistory.com BlogIcon CodeChef 2015.07.05 17:44 신고  댓글주소  수정/삭제  댓글쓰기

    php.ini 파일에서 "allow_url_fopen"의 값을 "On" 으로 변경해 주셔야 합니다.
    호스팅 업체를 이용하시는 경우 보안상의 문제로 해당 조치를 취해주지 않을 수도 있습니다.

cURL을 이용하여 데이터를 가져오는데, 아무리 해도 인코딩 문제 해결이 쉽지 않더군요.

¼­¿iÆ?º°½A ¼­AE±¸ ¾cAcμ¿ 변환 후 DB에 저장해도 이렇게 보이는..

iconv가지고 삽질하다가 mb_convert_encoding을 써봐도 해결이 쉽게 되지 않더군요.

몇 번의 삽질 끝에 다음과 같이 해결했습니다.

<환경>

PHP 스크립트의 인코딩 : UTF-8

MySQL 인코딩 : UTF-8

cURL 요청 헤더 : EUC-KR

cURL 응답 : EUC-KR

 

보통 위의 환경에서 문제가 가장 많이 발생하는데, 아래의 코드로 해결하시면 됩니다.

<코드>

$res = sendCurlPostRequest($url,$fields,$referer,"euc-kr");
$enc = mb_detect_encoding($res); // 해당 문자열의 인코딩 타입을 알아냅니다.
$res = mb_convert_encoding($res, "UTF-8","EUC-KR");

자동차보험,의료,보험,대출,미용,금융,법률,부동산,중고자동차,무료듣기,건강,돈,국민임대아파트

Posted by CodeChef
TAG PHP, UTF-8

댓글을 달아 주세요

PHP에서 Fatal error: Class 'DOMDocument' not found in /home/data/html/common/class/board.cls on line 885

와 같은 애러 발생시 

php-xml 라이브러리를 설치해 주신 후, WAS(apache 등)를 재시작 해 주시면 됩니다.

yum -y install php-xml*

service httpd restart


자동차보험,의료,보험,대출,미용,금융,법률,부동산,중고자동차,무료듣기,건강,돈,국민임대아파트

Posted by CodeChef

댓글을 달아 주세요

Notice: Undefined index: idx in /home/data/html/board/index.php on line 7

Notice: Undefined index: NO_AUTO_LOGIN in /home/data/html/common/common.sub on line 1456


와 같은 애러 발생시 소스코드를 수정하실 필요 없습니다.


php.ini 파일을 에디터로 엽니다.


vi /etc/php.ini

;error_reporting = E_ALL & ~E_DEPRECATED & ~E_STRICT

error_reporting = E_ALL & ~E_NOTICE

error_reporting 을 E_ALL & ~E_NOTICE로 수정해 주신 후,

저장 (:wq! ) 하시고,

WAS(httpd) 를 재시작 해주시면 됩니다.
service httpd restart


자동차보험,의료,보험,대출,미용,금융,법률,부동산,중고자동차,무료듣기,건강,돈,국민임대아파트

Posted by CodeChef

댓글을 달아 주세요

웹마스터라면 누구나 PDF 생성에 대해 많은 삽질을 경험해 보았을 것입니다.
모든 종류의 pdf 생성 플러그인을 해 보았지만, 자체 문법을 요구하거나, 많은 삽질을 하고,
결과적으로는 원하는 대로 문서가 생성되지 않았습니다.
특히 google chart같은 자바스크립트를 통해 가져오는 데이터는 표시도 되지 않았습니다.
그러던 중 이걸 발견하게 되었는데요. 정말 만족스럽습니다.
사용도 지금까지 본 것 중에 가장 간편하구요.
(단, jqueryUI 등 자바스크립트에서 페이지 로드 후 객체의 디자인을 바꿔주는 부분은 바뀌지 않을 수 있는데, 이부분은 전혀 불편하지 않으실 거라고 생각합니다. 이 부분에 대해서 이해가 안가시는 분은 해당되지 않으니 무시하셔도 되요)

아래는 리포트 페이지를 pdf 로 생성한 모습입니다.

사용법은 아주 간단합니다.
해당 url만 입력해서 창을 열면 끝입니다.
<a href="#" onClick="javascript:window.open('해당URL','옵션');">PDF열기</a>
또는,
<a href="javascript:window.open('해당URL','옵션');">PDF열기</a>
와 같은 형태로 열기만 하면 됩니다.
해당 URL에는 다음과 같이 입력해 주세요.
http://web2.pdfonline.com/pdfonline/testSettings.asp?cURL=변환대상URL&page=0&top=0.1&bottom=0.2&left=0.3&right=0.3

cURL 파라미터 값에 변환 대상 URL을 넣고, top, bottom, left, right에 여백을 넣으시면 됩니다.
이것으로 간단하게 생성할 수 있습니다.
더 많은 옵션을 넣고 싶으시면 
http://web2.pdfonline.com/ 에서 확인할 수 있어요.
아, 물론 무료입니다 :D

자동차보험,의료,보험,대출,미용,금융,법률,부동산,중고자동차,무료듣기,건강,돈,국민임대아파트

Posted by CodeChef

댓글을 달아 주세요

제로보드XE를 설치하다가 아래와 같은 FTP정보 입력에서 무슨 짓을 해도 넘어가지 않아서 고생하시는 분들을 위해 해결 방법을 알려드립니다~
제로보드 질문답변게시판을 뒤져봐도 명확한 답이 나오지 않더군요.
 
문제의 그장면입니다. 여기서 30분동안 삽질을 했었죠.

문제는 제로보드 디렉토리의 권한이었습니다.
아래와 같이 모든 권한을 체크합니다(보안상 찝찝하다고 생각하시면 설치 완료후 권한을 원래대로 돌려놓으시면됩니다.)

리눅스의 경우에도 chmod 를 통해 제로보드 폴더의 권한을 777로 변경해 주시면 됩니다~

자동차보험,의료,보험,대출,미용,금융,법률,부동산,중고자동차,무료듣기,건강,돈,국민임대아파트

Posted by CodeChef

댓글을 달아 주세요

  1. max 2009.11.11 16:00 신고  댓글주소  수정/삭제  댓글쓰기

    님..
    너무너무고맙습니다.덕분에잘해결햇습니다.은혜갚을께요

php에서 파일을 하위 폴더에서 include할 때 경로 처리 때문에 고생하는 분들이 많으실 겁니다.

저 또한 영국에서 php로 프로그래밍을 하다가 경로 때문에 고생을 많이 했었습니다.

그러다가 개인적으로 사용하는 그누보드의 g4_path가 떠올라 찾아보고 이렇게 쉽게 해결했습니다.

보통 루트에 common.php 파일을 만들어 두고 이 파일은 여러 경로에서 인클루드 하고 싶은데 다른 폴더에서 상위폴더의 common.php 를 인클루드하면 그 안에 있는 경로가 엉망이 되어 애러가 나게 되죠.

제가 사용하는 방법은 그누보드에서 사용하는 _common.php를 이용하는 방법입니다.

 

방법을 지금부터 설명드리겠습니다~

_common.php라는 파일은 php코드에서 다른 파일을 인클루드 할 경우 모든 폴더에 하나씩 집어넣습니다.

 

_common.php 파일의 내용입니다.

<? // 현재 폴더가 루트일 경우
$g4_path = ".";
include_once("$g4_path/common.php");
?>

 

하위폴더에서 공통 파일을 인클루드하고싶을경우

하위폴더에 있는 _common.php 파일의 내용입니다.

<? // 현재 폴더가 루트일 경우
$g4_path = "..";
include_once("$g4_path/common.php");
?>

 

하위의 하위폴더의 _common.php 파일의 내용입니다

<? // 현재 폴더가 루트일 경우
$g4_path = "../..";

Tistory 태그: ,


include_once("$g4_path/common.php");
?>

생각보다 간단하면서도 엄청 유용합니다~

자 이제 common.php 파일의 소스입니다.

<?

session_start(); // 세션시작은 항상 파일의 최상단에 위치해야 애러가 안납니다

// use path( must included from _common.php and must declare $g4_path
if (!$g4_path || preg_match("/:\/\//", $g4_path))
    die("<meta http-equiv='content-type' content='text/html; charset=utf-8'><script language='JavaScript'> alert('Wrong define.'); </script>");   
//if (!$g4_path) $g4_path = ".";
$g4[path] = $g4_path;
unset($g4_path);

 

// 이 아래의 내용은 공통적으로 필요한 include파일을 모두 집어넣었습니다.

include "$g4[path]/common/mysql.php";
$mysql = new mysql();
include "$g4[path]/common/common.php";
$common = new common();
include "$g4[path]/config.php";

// ...

?>

 

주의할점 : _common.php파일은 항상 소스의 최상단(주석도 있어서는 안되고 공백없이 <? 다음 라인에 바로 입력해야 합니다. 안그러면 찾기 힘든 http애러를 보게 될거에요~ 이거 찾아내고 해결하느라 많이 고생했습니다.

즐거운 코딩 되세요~

자동차보험,의료,보험,대출,미용,금융,법률,부동산,중고자동차,무료듣기,건강,돈,국민임대아파트

Posted by CodeChef

댓글을 달아 주세요

  1. Favicon of http://harrys.co.kr/blog/lab BlogIcon Harry 2009.06.11 23:22 신고  댓글주소  수정/삭제  댓글쓰기

    한참 헤매다가 겨우 해결했네요. 많은 도움이 되었습니다. 좋은 글 감사합니다^^

PHP 보안 팁

웹개발/PHP 2006.09.24 07:06
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 파일은 전혀 등록할 수 없게 하는 방법인데 이 부분은 좀 애매한 부분이다.

자동차보험,의료,보험,대출,미용,금융,법률,부동산,중고자동차,무료듣기,건강,돈,국민임대아파트

Posted by CodeChef
TAG PHP, PHP보안

댓글을 달아 주세요

  1. Favicon of http://zetus.net BlogIcon zetus 2007.03.05 06:14 신고  댓글주소  수정/삭제  댓글쓰기

    잘보고 갑니다~ 퍼가요~♡

안녕하세요~

오늘은 두번째로 올리는 초급용 씨리즈 입니다.

오늘도 초급용 씨리즈냐고 태클 거신다면.. 그래도 초급용 입니다 -_-;;

할 수 없습니다. 아시는 분은 안보셔도 됩니다 초급용입니다 -_-;;

어제는 js를 이용한 form과 관련한 내용이었는데요

오늘은 많은 초급 phper들이 게시판을 이용해서 공부하면서

가장 힘들어하고 어려워 하는 페이징의 원리를 말씀드릴까 합니다.

페이징 : 통상 이렇게 말하는데요 저는 네비게이터 라고 자주 말합니다.

게시판의 목록에 페이지를 넘겨줄 수 있는 번호 링크를 두고 하는 말이죠..

그럼 시작해 볼까요~


제가 수업시간에 네비게이터를 수업하게 되면 자주 써먹는 과제 중에 하나가

주어진 수의 범위가 있을 때 
ex ) 0~9, 10~19, 20~29

x라는 수를 입력 받으면 어느 범위에 속하는지 알아 내는 문제를 냅니다.

※ 정확히 말하자면 범위의 첫 수를 구해내는 문제입니다. (0 ,10, 20)

자! 시간 5분 드립니다 풀어보세요!

1초
2초
3초
5분 끝!

다 푸셨나요 -0-?

왜 저 문제가 페이징 (네비게이터)와 관련있을까?

우리가 통상 php를 이용하여 프로그램을 제작하면 효율성등등 감안해서 많은

부분을 생각하게 됩니다. 하지만 이런건 숙련자들의 몫이죠 초급자는 아무리

강조해도 이런거 생각 못합니다.

그럼 무엇을 가지고 초급자들이 프로그램을 제작 해야할 까요?

무엇을 보여주고 어떻게 보여줄것인가!! 이게 관건입니다.

같이 문제를 풀어보죠

가령 5라는 수가 입력 되었다고 가정하면

(어이 거기 눈돌리지말고~ 잘봐!! 계산하고있지?)

계산하지마세요 계산은 여러분들이 하는게 아니죠? 서버(컴퓨터)가 해주는거에요

우리는 컴퓨터가 계산할 일정한 규칙성(계산식)을 만들어 주면 됩니다.

그럼 젤 먼저 해야될 일! 바로 변수의 선언입니다. 모든 프로그램에 공통적으로

시작할 때 일단 사용할 변수를 선언해 주는게 프로그램을 작성하면서 변수가 꼬인다거나

잘못된 값을 계산한다거나 하는 일 (버그)를 줄여줍니다.

$psize = 10; //수의 범위 크기 입니다.
$x = 5; //입력받은 수입니다.

5가 어느 범위에 들어갈지 우리 머리속에는 이미 인지하고 있지만

논리적으로 계산식을 만드는 것은 꾀 어렵습니다.

그런데요 잘 생각해 보면 문제안에 항상 답이 있다는 거죠~

범위의 첫수 0, 10, 20 을 구하는 식을 만들자면 5, 15, 25라는 수가 있을 때 

일반적인 수학을 생각하면 절대 답 없습니다.

5를 주어진 수의 범위로 일단 나누고 봅시다 0보다는 5가 크니 빼버리면 되겠지만

15가 입력된다면 15를 또 빼줘도 0이 되지 10이되지는 않겠죠?

5-5=0
15-15=0
절대 자기 자신을 빼버려서는 답이 없다!!

그래서 일단 나눠봅시다

5/10 = ? 0.5
15/10 = ? 1.5
25/10 = ? 2.5

음.. 뭔가 비슷한 모양이 나올거 같군요

왜 나누냐고요? 더하거나 곱하면 수거 더 커지지 작아 지지는 않겠죠?

그래서 나누어 봤습니다.

그럼 저렇게 구해진 값을 이제 변수로 지정해 봅시다.

$start_num = $x / $psize;

일단 이런식이 만들어 지겠네요

0.5 , 1.5, 2.5 이렇게 나온 값을 이제 php 내장 객체인 floor를 이용해서

소수점을 버려 봅시다!

$start_num = floor($x / $psize);

하니까 x의 값이 달라질 때 마다 0, 1, 2 라는 수를 start_num이 가지게 되겠죠?

그런데~ 여기서 끝난게 아닙니다. 0, 10, 20 이렇게 되도록 하고 싶은데요

저런 수에다가 주어진 범위의 크기만큼 곱셈을 하면 어떻게 될까요?

그렇습니다~

$start_num = floor($x / $psize) * $psize;

0은 아무리 큰수를 곱해도 0이고 1곱하기 10은 10, 2곱하기 10은 20이니

우리가 원하는 범위의 첫번째 수를 구하는 것을 해결했습니다.

그럼 저 공식이 왜 필요한가?

보여주는 숫자를 보니 1부터 시작하는데... 페이지 번호는 0번부터라니..

이상하자나요~ 하고 질문하는 학생 꼭 있습니다!!

그건 바로 배열과 관련된 부분과 물질수의 10진수와 수학의 10진수는

항상 1의 갭이 있다는걸 생각해야 합니다.

우리가 통상 사용하는 물질수의 10진수는 1,2,3,~10 이 겠지만

수학에서의 10진수는 0~9까지의 수를 말합니다.

그럼 배열은? 배열에서 자동으로 부여되는 (php를 포함한 특정 언어만) 인덱스 key는

0부터 시작합니다. 물론 10진수고요.


자 이제 1단계 과제가 해결되었습니다.

※ 2단계 과제
주어진 글의 개수가 534개다 페이지당 10개씩 보여준다면
페이지는 총 몇개의 페이지가 되는가?

음.. 어렵나요? 쉽죠?

10개씩 보여준다면야 당연히 10으로 나누면 총 페이지의 갯수가 나오는데요

여기서 놓치기 쉬운 부분이 마지막에 남는 글의 갯수랍니다.

534/10=? 53.4

그럼 페이지 수가 53.4개라는건데 소수점은 어떻게 해주는게 좋을까요?

그렇습니다~ 바로 소수점 무조건 올림인 ceil 함수를 이용하여

올림수인 54페이지를 만들어 줘야 마지막에 남는 0.4페이지분량의 글을

모두 보여줄 수 있다는거죠


그럼 총 페이지의 개수도 구했습니다.

이제 해야할 마지막 관문!!!

※ 문제3 그럼 한 화면에 10개씩 페이지 번호를 보여준다면
이런 단위블럭이 몇개가 나오나요?

위 문제와 유사하죠? 그렇습니다 3번문제가 요구하는 것은

네비게이터의 이전 , 다음 링크를 만들기 위한 조건으로 사용될 일정한 값을

구하기 위한 문제 입니다.

그럼 실질적 아래 예제 코드를 이용해서 확인해 복습해 봅시다.


<?
$start = $_GET[start];
$total = 534;//총 레코드수
$scale = 10;//페이지당 출력 레코드수
$page_scale = 10; // 화면당 출력할 페이지 수 
if(!$start) $start = 0;//시작 페이지 번호가 없을경우 0 

$total_page = ceil($total/$scale);//총 페이지수
$page = floor($total_page/$page_scale);//단위블럭페이지수
$n_page = floor($start/$page_scale);//현재 단위블럭 페이지번호

if($n_page > 0){
//이전 링크 출력 조건 현재단위블럭 페이지 번호가 0보다 클경우
   $p_start = ($n_page-1)*$page_scale;
//현재 단위블럭 페이지 -1 * 단위블럭 페이지 출력수(page_scale)
   $link = "<a href='".$_SERVER[PHP_SELF]."?start=${p_start}'>";
   $link .= "이전";
   $link .= "</a>";
   echo $link." ";
}
$is = $n_page*$page_scale;//단위블럭 페이지 시작번호 구하기 현재 페이지 번호를 이용하여 현재 단위블럭 페이지 번호를 구하고 그 값을 이용하여 단위블럭 페이지 출력수를 곱한 값 
for($i=$is; $i < $is+$page_scale; $i++){
//i는 현재 단위블럭 페이지 번호*단위블럭 페이지 출력수 부터 시작하고 i는 단위블럭 페이지 출력수를 더한 값만큼만 반복하도록 지정
   if($i < $total_page){//i가 총 페이지수 보다 작을 동안만 출력하기 위한조건
       $link = "<a href='".$_SERVER[PHP_SELF]."?start=${i}'>";
       $link .= $i+1;//start값이 i로 지정됨으로 화면상 출력기준을 1부터 시작하는 10진수로 맞추기 위해 +1을 연산
       $link .= "</a>";
       echo $link." ";
   }
}

if($n_page < $page){//현재 단위블럭 페이지번호 보다 총 단위블럭 페이지 수가 작을 경우에만 다음 링크 출력
   $link = "<a href='".$_SERVER[PHP_SELF]."?start=${i}'>";//i는 상단 for문에서 이미 마지막 페이지 start번호보다 +1한 값을 가지고 있기 때문에 i를 그냥 출력함
   $link .= "다음";
   $link .= "</a>";
   echo $link;
}

?>



어떠셨나요?

선행 학습내용을 잘 읽어 보신분이라면 쉽게 이해가 되었을 것입니다.

선행 학습내용만 잘 이해한다면 어떠한 언어로로 페이징은 만들어 낼 수 있습니다.

코드가 중요한게 아니라 바로 로직 or 알고리즘이 중요하다는거 잊지맙시다 



출처 : http://woorisay.x-y.net/

자동차보험,의료,보험,대출,미용,금융,법률,부동산,중고자동차,무료듣기,건강,돈,국민임대아파트

Posted by CodeChef
TAG PHP

댓글을 달아 주세요