'phP 함수 레퍼런스'에 해당되는 글 177건

이미지 자리 표시자란 단어가 다소 생소할 수 있습니다. 다른 말로 대체 이미지라면 쉽겠네요. 홈페이지 레이아웃을 구성할 때 이미지 자리에 빈 이미지를 삽입합니다. 빈 이미지를 따로 제작하면 그 만큼 시간이 들어가므로 시간을 낭비하게 됩니다.

 

이미지 자리 표시자를 실시간으로 만들어주는 사이트가 몇 군데 있습니다. 한글이나 중국어, 일본어 글자를 넣을 수 있고, 배경색이나 글자색을 넣어 이미지 자리에 넣을 수 있도록 URL을 제공합니다.

 

사용하는 방법은 크게 어렵지 않습니다. 이미지 삽입할 자리에 해당 사이트에서 제공하는 URL을 삽입하기만 하면 되니까요.

 

 

 

https://placeholder.com/

 

Placeholder.com: Placeholder Images Made For You [JPG, GIF & PNG]

What Is Placeholder.com? Placeholder.com generates custom placeholder images on the fly, like these examples:-     How To Use Our Placeholders Just specify the image size after our URL (https://via.placeholder.com/) and you'll get a placeholder image.

placeholder.com

이곳은 한글이 지원안되지만 배경색과 이미지 크기, 글자색을 지정할 수 있습니다.

 

 

 

http://placehold.jp/

 

Placehold.jp | 簡単!ダミー画像作成

簡単!ダミー画像生成、モックアップ用画像作成ツール。文字やサイズ、メモを入れた仮の画像を簡単に作成できます。

placehold.jp

일본에서 제공하는 이미지 자리 표시자입니다. 한국어를 지원하며 폰트 크기, "엔터"를 지원합니다. 그리고 CSS를 이용해 그라디언트나 모서리를 둥글게 표현할 수 있습니다.

 

 

 

https://loremflickr.com/

 

LoremFlickr.com

Go pro! When you need more functionality, like requesting your own photos, or photos taken at a particular location, go pro! Sign up and receive 10.000 credits for free. After that, top up for as little as 1 euro. Go pro Examples https://loremflickr.com/32

loremflickr.com

이곳은 사진을 랜덤으로 제공하는 곳입니다. 사진은 'Flickr'이기 때문에 라이센스에 따라 Creative Commons 를 따릅니다. 조건식을 주면 풍경이나 동물, 사람으로 제한하여 임의의 사진을 얻을 수 있습니다.

 

블로그 이미지

하보니

하보니와 함께하는 phP 초보

댓글을 달아 주세요

CURL에서는 POST 로 문자열이나 배열을 전송하면 상대 측에서 값을 받을 수 있습니다. 

 

 

 $_POST['name'] ='하보니';
 $_POST['email'] = 'habony@example.com';

 curl_setopt($ch, CURLOPT_POSTFIELDS, $_POST);

 

 

하지만 중첩된 배열을 전송하게 되면 어떤 문제가 발생하게 되는데, CURL에서 중첩된 배열을 전송하면 우리가 예상했던거와는 다르게 Array 라는 문자열이 전송됩니다.

 

그래서 이러한 문제를 해결하기 위해 http_build_query() 함수를 이용하거나 아래 사용자 함수를 만들어 원하는 값을 전송할 수 있습니다.

 

 

 function Curl_Postfields_Create($input, $prefix = '') {
  if(!is_array($input)) {
    return $input;
  }

  $output = array();
  foreach($input as $key => $value) {
    $final_key = $prefix ? $prefix[$key] : $key;
    if(is_array($value)) {
      $output += Curl_Postfields_Create($value, $final_key);
    } else {
      $output[$final_key] = $value;
    }
  }
  return $output;
 }

 

 $_POST['name'] = '하보니';

 $_POST['email'] = 'habony@emample.com';

 $_POST['type']['file']['name'] = 'habonyphp.bmp';

 $_POST['type']['mime'] = 'bmp';

 $output = Curl_Postfields_Create($_POST);

 

 curl_setopt($ch, CURLOPT_POSTFIELDS, $output);

 

 

CURL에서 단순한 배열 또는 문자열이 아니면 올바로 전송할 수 없으므로 중첩된 배열을 분해해서 단순한 문지열로 변환한 후 전송하는 방법입니다.

블로그 이미지

하보니

하보니와 함께하는 phP 초보

댓글을 달아 주세요

CURL 를 통해 데이터를 주고받으면 동일한 도메인이라도 세션을 공유할 수 없습니다. 이를 해결하기위해 상대 도메인에 브라우저의 쿠키 정보를 함께 전송해주면 공유가 가능하게 됩니다.

 

 function curl_trans_ssid( $query )
 {
   $ch = curl_init();
   curl_setopt($ch, CURLOPT_URL, BIRD_API_URL);
   curl_setopt($ch, CURLOPT_POST, true);
   curl_setopt($ch, CURLOPT_POSTFIELDS, $query);
   curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
   curl_setopt($ch, CURLOPT_COOKIE, 
              session_name() . '=' . session_id()
   );

   curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);  

   $data = curl_exec($ch);
   curl_close($ch);

   return $data;

 }

 $query = array(
   'user_id' => 'habony',
   'user_pw' => '123456789'
 );
 $result = curl_trans_ssid($query);

 echo $result . " 님 로그인 성공하셨습니다.";

 

참고로 정상적으로 세션을 만들었다하더라도  CURL 로 요청할 때 마다 브라우저의 쿠키정보를 매번 전송해주어야 유지가 되며 세션을 삭제할  때는 클라이언트 측 브라우저에서 세션을 삭제합니다.

블로그 이미지

하보니

하보니와 함께하는 phP 초보

댓글을 달아 주세요

아래 배열의 형태라면 트리형태로 출력하고자 할 때 유용합니다.
특히 답글 형태 게시판에서 사용할 수 있습니다.


 $list = array(

  array('idx' => 1,  'parent_id' => 0),

  array('idx' => 2,  'parent_id' => 0),

  array('idx' => 3,  'parent_id' => 0),

  array('idx' => 4,  'parent_id' => 0),

  array('idx' => 5,  'parent_id' => 0),

  array('idx' => 6,  'parent_id' => 2),

  array('idx' => 7,  'parent_id' => 2),

  array('idx' => 8,  'parent_id' => 3),

  array('idx' => 9,  'parent_id' => 4),

  array('idx' => 10, 'parent_id' => 9)

 );

 $atr = Categories($list, 'idx');

 print_r($atr);


ex.1)

function Categories(
$atr, $id = 'id', 
$parent_id = 'parent_id', 
$children = 'children')
{
  $nlist = array(
    array( $children => array() )
  );
  $raw = array(&$nlist[0]);

  if(isset($atr))
  {
    foreach($atr as $q => $w)
    {
      $raw[$w[$parent_id]][$children][$w[$id]] = $w;
      $raw[$w[$id]] = 
          &$raw[$w[$parent_id]][$children][$w[$id]];
    }
  }

  if(is_array($raw[$atr[0][$parent_id]][$children]))
  {
    return ($raw[$atr[0][$parent_id]][$children]
           + $nlist[0][$children]);
  }

return $nlist[0][$children];
}

/* 
Categories( atr, id, parent_id);
  atr 인수: 정렬할 배열
  id 인수: 선택. 기본 값 : id
  parent_id 인수: 선택. 기본 값 : parent_id
  children 인수: 선택. 기본 값 : children
  반환 값: TREE 로 정렬한 배열
*/


블로그 이미지

하보니

하보니와 함께하는 phP 초보

댓글을 달아 주세요

Github.com 에 프로젝트를 만들었지만 필요에 의해 프로젝트를 삭제할 일이 생길 수 있습니다. 삭제하는 방법을 설명해 보겠습니다.


1. http://Github.com 에 접속해서 로그인을 합니다.


2. 다음 그림에서 내가 만든 프로젝트가 보이고 "20180404" 라는 프로젝트를 삭제하고 싶다면 삭제하고자 하는 프로젝트를 선택합니다.



3. 상단에 보이는 "Settings" 를 선택합니다.



4. 하단에 Danger Zone 그룹에 보이는 "Delete this repository" 를 선택합니다.



5. 아래 그림처럼 창이 뜬다면 삭제하고자 하는 프로젝트 이름을 넣고 삭제를 진행합니다. 


사용자가 실수로 프로젝트를 삭제하는 것을 방지하기 위해 프로젝트 이름을 한번 더 넣도록 되어 있으니 프로젝트 이름을 넣고 삭제를 진행하면 됩니다.





블로그 이미지

하보니

하보니와 함께하는 phP 초보

댓글을 달아 주세요

이클립스로 프로그램을 배포하기 위해서 먼저 이클립스 마켓을 통해 EGit 을 설치하도록 합니다.


1. 이클립스 상단 메뉴 Help > Eclipse Marketplace 를 실행합니다.



2. 아래 그림의 프로그램을 찾아 인스톨합니다.



3. 이클립스에서 배포하고자 하는 프로젝트를 선택해서 오른쪽 마우스 버튼 클릭 > Team > Share Project 를 선택합니다.



4. "Finish" 버튼이 활성화하기 위해 Create 버튼을 선택해서 배포할 폴더를 생성합니다.



5. 여기까지 정상적으로 완료되었다면 아래 그림처럼 프로젝트 옆에 [git master] 라고 뜨면 연동은 완료된 것입니다.



6. 이클립스 메뉴 Window > Show View > Other 를 선택합니다.



7. 우리는 Git 으로 배포할 것이므로 "Git Repositories" 를 선택합니다.



8. 다시 이클립스에서 배포할 프로젝트 오른쪽 마우스 버튼 클릭 > Team > Commit 을 선택합니다.



9. Git 에 업로드할 파일을 범위 지정하고 다음 그림의 + 버튼을 선택합니다.



10. 아래 그림처럼 파일이 이동되었다면 "Commit Message" 에 메시지를 적당하게 입력하고 "Commit and Push" 를 선택합니다. 


메시지 내용은 "Hello Git" 이라고 입력해 보았습니다.




11. 다음 그림과 같은 창이 뜬다면 http://Github.com 으로 이동하도록 합니다. 


URI 입력 항목은 http://Github.com 에서 만들 프로젝트 URL을 입력해야 합니다.


Github.com 에서 이미 프로젝트를 만들었고, URL 주소를 알고 있다면 순서 [15]로 건너 뛰어도 됩니다.



12. 이제 http://Github.com 으로 이동해서 로그인을 합니다. "start a project" 을 선택해서 배포할 프로젝트를 만듭니다.



13. 프로젝트 이름을 "20180404" 로 적고, "Create repository" 를 선택합니다. 프로젝트 이름은 임의대로 작성해 주었습니다.



14. 정상적으로 만들게 되면 아래 그림 처럼 git 주소가 나타나는데, 이 주소를 복사합니다.



15. 다시 이클립스로 이동해서 github.com 에서 복사한 URL를 붙여넣기 한 다음 Github.com의 아이디와 비밀번호를 입력하고 다음을 선택합니다.



16. 여기서 따로 설정할 것이 없으므로 다음을 선택합니다.



17. 설정을 모두 마쳤으므로 "Finish" 를 선택합니다.

 


18. 환경에 따라 Githum.com 의 아이디와 비밀번호를 한번더 묻는 경우가 있는데, 로그인 창이 뜬다면 동일하게 Github.com 의 로그인 정보를 입력하고 마무리합니다.



19. 모든 설정이 완료되었으면 배포가 시작됩니다. 파일이 많을 경우 다소 오래걸릴 수 있습니다. 


파일을 모두 업로드하였다면 다음 그림이 나타납니다. 창을 닫아 줍니다.



20. 모든 작업이 마무리되었으니 정상적으로 배포되었는지 확인할 필요가 있습니다. 다시 Github.com 으로 이동합니다.


순서 [10] 에서 메시지 내용을 "Hello git"이라고 입력했는데, 아래 그림에서도 확인할 수 있듯 "Hello Git" 이라고 표기되는 것을 확인할 수 있고, 정상적으로 배포된 것을 확인할 수 있습니다.


블로그 이미지

하보니

하보니와 함께하는 phP 초보

댓글을 달아 주세요

json_encode 로 한글 문자 깨짐현상을 겪어보신 분들은 잘 아실듯 합니다.


편법으로 urlencode 나 base64_encode 로 문자열 처리한 후 다시 원상복구과정으로 처리합니다만 그러나 php 5.4 부터 지원하는 JSON_UNESCAPED_UNICODE 상수를 이용하면 번거롭게 편법을 하지 않아도 유니코드 문자열을 처리할 수 있게 되었습니다.


 <?php

 $arr = array('name' => "하보니입니다.");
$encode json_encode$arrJSON_UNESCAPED_UNICODE );
print_r($encode);
/*
    결과 : 
    {"name":"하보니입니다."}
*/

$decode json_decode$encode );
print_r($decode);
/*
    결과 : 
    stdClass Object
    (
        [name] => 하보니입니다.
    )
*/
?>


블로그 이미지

하보니

하보니와 함께하는 phP 초보

댓글을 달아 주세요

PHP 5,3 부터 지원하는 openssl_encrypt 함수를 이용하면 문자열을 암호화, 복호화 함수를 만들 수 있습니다.

<?php

function Encrypt($str$secret_key='secret key'$secret_iv='secret iv')
{
    
$key hash('sha256'$secret_key);
    
$iv substr(hash('sha256'$secret_iv), 032)    ;
    return 
str_replace("="""base64_encode( openssl_encrypt($str"AES-256-CBC"$key0$iv)) );
}

function 
Decrypt($str$secret_key='secret key'$secret_iv='secret iv')
{
    
$key hash('sha256'$secret_key);
    
$iv substr(hash('sha256'$secret_iv), 032);
    return 
openssl_decrypt( base64_decode($str), "AES-256-CBC"$key0$iv );
}

$str "안녕하세요. 하보니입니다.";
$secret_key "123456789";
$secret_iv "#@$%^&*()_+=-";

$encrypted Encrypt($str$secret_key$secret_iv);
echo 
"암호화 문자열 => " .$encrypted"<br />\n";
$decrypted Decrypt($encrypted$secret_key$secret_iv);
echo 
"복호화 문자열 => " .$decrypted"\n";

/*
    결과:
    암호화 문자열 => VUYxMHFQVWU5TG9KeWMrZlJhZjV3VkFJbTFHV DZERlhNeEpldW1GRVB0WjQyODdkRnFDTFhIa0UrWEEvb1VGbg
    복호화 문자열 => 안녕하세요. 하보니입니다.
*/
?>

블로그 이미지

하보니

하보니와 함께하는 phP 초보

댓글을 달아 주세요

이미지를 작은 이미지로 변환한 문자열을 mysql에 저장하는 방법을 소개합니다.

큰 이미지를 저장하기에는 무리가 있으나 작은 이미지로 변환한 문자열을 mysql 에 저장하면 속도면에서 오히려 더 빠를 수 있습니다.

먼저 mysql 테이블을 만듭니다.


 CREATE TABLE `images` (

  `id` int(10) NOT NULL,
  `type` char(4) NOT NULL,
  `thumbs` blob NOT NULL
 ) ENGINE=MyISAM DEFAULT CHARSET=utf8;


  <?php

 function Thumbnail_String($string$user_width=86$user_height=null)
{
    
ob_start();
    
ob_flush();
    
flush();

    
$im imagecreatefromstring$string );
    
$orig_width imagesx($im);
    
$orig_height imagesy($im);
    if(
$orig_width >= $user_width)
    {
        if(
strlen($user_height) === 0)
        {
          
$user_height = @round($orig_height*($user_width/$orig_width));
        }
    }
    else
    {
        
$user_width $orig_width;
        
$user_height $orig_height;
    }
    
$im_new imagecreatetruecolor$user_width$user_height );

    
imagecopyresampled($im_new$im0000 $user_width$user_height$orig_width$orig_height);
    
imagepng($im_new);
    
imagedestroy($im);
    
imagedestroy($im_new);

    
$data ob_get_contents();
    
ob_end_clean();
    return 
$data;
}
// 이미지를 sql에 저장하기
$file file_get_contents($_FILES['userfile']['tmp_name']);
unlink($_FILES['userfile']['tmp_name']);

$data Thumbnail_String($file50);
mysqli_query($link "insert into from tbname VALUES('1', 'png', '".$data."');");



// sql에 저장된 이미지를 불러오기
$result mysqli_query($link"select thumbs from tbname WHERE id=1;");
$row mysqli_fetch_array($resultMYSQLI_NUM);
echo 
"<img src='data:image/gif;base64, ".base64_encode($row[0])."'>";
?>

블로그 이미지

하보니

하보니와 함께하는 phP 초보

댓글을 달아 주세요

base64 문자열을 작은 이미지로 리사이즈한 문자열로 출력할 수 있습니다.


이렇게 하면 썸네일 이미지를 mysql에 저장할 수 있고, 또 리사이즈한 이미지를 변수에 담아 원하는 곳에 출력할 수 있습니다.


 <?php

 function Thumbnail_String($string$user_width=86$user_height=null)
{
    
ob_start();
    
ob_flush();
    
flush();
    
$im imagecreatefromstring$string );
    
$orig_width imagesx($im);
    
$orig_height imagesy($im);
    if(
$orig_width >= $user_width)
    {
        if(
strlen($user_height) === 0)
        {
          
$user_height=@round($orig_height*($user_width/$orig_width));
        }
    }
    else
    {
        
$user_width $orig_width;
        
$user_height $orig_height;
    }
    
$im_new imagecreatetruecolor$user_width$user_height );
    
imagecopyresampled($im_new$im0000,  $user_width$user_height$orig_width$orig_height);
    
imagepng($im_new);
    
imagedestroy($im);
    
imagedestroy($im_new);

    
$data ob_get_contents();
    
ob_end_clean();
    return 
$data;
}
$data64 'iVBORw0KGgoAAAANSUhEUgAAABwAAAASCAMAAAB/2U7WAAAABl'
        
'BMVEUAAAD///+l2Z/dAAAASUlEQVR4XqWQUQoAIAxC2/0vXZDr'
        
'EX4IJTRkb7lobNUStXsB0jIXIAMSsQnWlsV+wULF4Avk9fLq2r'
        
'8a5HSE35Q3eO2XP1A1wQkZSgETvDtKdQAAAABJRU5ErkJggg==';
$data Thumbnail_String(base64_decode($data64), 50);
echo 
"<img src='data:image/gif;base64, ".base64_encode($data)."'>";
?>

결과:

 


블로그 이미지

하보니

하보니와 함께하는 phP 초보

댓글을 달아 주세요

PHP에는 자체 FTP 함수가 있습니다. 여기서는 FTP 함수를 이용하지 않고 오직 CURL 만을 이용해 FTP 를 관리해 보겠습니다.


CURL에는 많은 기능이 있습니다. 자주 사용하는 몇가지를 소개합니다.


1. 파일을 업로드하는 방법.

// 서버 경로 
$realserver 'ftp://habonyphp.com/public_html/data/'
// 서버 사용자 정보 
$user 'habony'
$pass '123456'

// 업로드할 파일 
$realfile $_FILES['uerfile']['tmp_name']; 

$ch curl_init(); 
curl_setopt($chCURLOPT_UPLOAD1); 
curl_setopt($chCURLOPT_INFILE, @fopen($realfile'r')); 
curl_setopt($chCURLOPT_INFILESIZE, @filesize($realfile)); 

curl_setopt($chCURLOPT_URL$realserver); 
curl_setopt($chCURLOPT_USERPWD$user ':' $pass); 
curl_exec($ch); 
curl_close($ch);


2. 파일을 다운로드 방법.


// 서버 경로 
$realserver 'ftp://habonyphp.com/public_html/data/'
// 서버 사용자 정보 
$user 'habony'
$pass '123456'

// 다운로드할 파일 
$realfile = 'example.gif';


$remote tempnam(sys_get_temp_dir(), 'CURL_FTP'); 

$ch curl_init(); 
curl_setopt($chCURLOPT_FOLLOWLOCATIONtrue); 
curl_setopt($chCURLOPT_FILE$fp = @fopen($remote'w+')); 

curl_setopt($chCURLOPT_URL$realserver . $realfile); 

curl_setopt($chCURLOPT_USERPWD$user ':' $pass); 
curl_exec($ch); 
curl_close($ch); 
fclose($fp); 

// URL 경로 
$url $remote


3. 파일을 삭제하는 방법.


// 서버 경로 
$realserver 'ftp://habonyphp.com/public_html/data/'
// 서버 사용자 정보 
$user 'habony'
$pass '123456'

// 삭제할 파일 
$list = array(
 'DELE habony.gif''DELE namefile.bmp''DELE example.jpg'
); 

$ch curl_init(); 
curl_setopt($chCURLOPT_POSTQUOTE$list); 

curl_setopt($chCURLOPT_URL$realserver); 
curl_setopt($chCURLOPT_USERPWD$user ':' $pass); 
curl_exec($ch); 
curl_close($ch); 


4. 파일의 이름을 변경.


// 서버 경로 
$realserver 'ftp://habonyphp.com/public_html/data/'
// 서버 사용자 정보 
$user 'habony'
$pass '123456'

// 현재 파일 
$old 'old.bmp'
// 새로운 이름 
$new 'new.bmp'

$ch curl_init(); 
curl_setopt($chCURLOPT_POSTQUOTE, array("RNFR " $old"RNTO " $new); 

curl_setopt($chCURLOPT_URL$realserver); 
curl_setopt($chCURLOPT_USERPWD$user ':' $pass); 
curl_exec($ch); 
curl_close($ch); 


5. 폴더를 삭제하는 방법.


// 서버 경로 
$realserver 'ftp://habonyphp.com/public_html/data/'
// 서버 사용자 정보 
$user 'habony'
$pass '123456'

// 삭제할 폴더 
$rmdir 'dirname'

$ch curl_init(); 
curl_setopt($chCURLOPT_POSTQUOTE, array("RMD " $rmdir); 

curl_setopt($chCURLOPT_URL$realserver); 
curl_setopt($chCURLOPT_USERPWD$user ':' $pass); 
curl_exec($ch); 
curl_close($ch);


6. 폴더를 만드는 방법.


// 서버 경로 
$realserver 'ftp://habonyphp.com/public_html/data/'
// 서버 사용자 정보 
$user 'habony'
$pass '123456'

// 생성할 폴더 
$mkdir 'dirname'

$ch curl_init(); 
curl_setopt($chCURLOPT_POSTQUOTE, array("MKD " $mkdir); 

curl_setopt($chCURLOPT_URL$realserver); 
curl_setopt($chCURLOPT_USERPWD$user ':' $pass); 
curl_exec($ch); 
curl_close($ch);


7. 권한을 설정하는 방법.


// 서버 경로 
$realserver 'ftp://habonyphp.com/public_html/data/'
// 서버 사용자 정보 
$user 'habony'
$pass '123456'

// 설정할 폴더/파일 
$fname 'data'

$ch curl_init(); 
curl_setopt($chCURLOPT_POSTQUOTE, array("SITE CHMOD 0707 " $fname); 

curl_setopt($chCURLOPT_URL$realserver); 
curl_setopt($chCURLOPT_USERPWD$user ':' $pass); 
curl_exec($ch); 
curl_close($ch);


8. 파일 목록을 출력하는 방법.


 // 서버 경로
$realserver 'ftp://habonyphp.com/public_html/data/'
// 서버 사용자 정보 
$user 'habony'
$pass '123456'


$ch curl_init(); 
curl_setopt($chCURLOPT_RETURNTRANSFER1); 

curl_setopt($chCURLOPT_URL$realserver); 
curl_setopt($chCURLOPT_USERPWD$user ':' $pass); 
$list curl_exec($ch); 
curl_close($ch); 

print_r($list); 


블로그 이미지

하보니

하보니와 함께하는 phP 초보

댓글을 달아 주세요

서버의 상태가 느린지 다운되었는지 등을 체크하기 위해 보통 ping을 이용합니다.

서버 응답이 없으면 -1를 반환하고 응답이 있으면 지연율을 반환합니다.


 <?php

 function pingDomain($domain)

 {

    $starttime = microtime(true);

    $file      = fsockopen ($domain, 80, $errno, $errstr, 10);

    $stoptime  = microtime(true);

    $status    = 0;


    if(!$file)

    {

        $status = -1;

    }

    else

    {

        fclose($file);

        $status = ($stoptime - $starttime) * 1000;

        $status = floor($status);

    }

    return $status . ' ms';

 }



 print_r(pingDomain('habonyphp.com'));

 // 결과 : 829 ms

 ?>

출처: http://stackoverflow.com/questions/9841635/how-can-i-ping-a-server-port-with-php


블로그 이미지

하보니

하보니와 함께하는 phP 초보

댓글을 달아 주세요

단축 URL은 알고리즘이 매우 쉬운 편에 속해 기업뿐 아니라 개인도 쉽게 사이트를 구축할 수 있습니다. 여기서 .TK 도메인을 이용해 무료로 구축할 수 있는 방법을 소개합니다.

미리보기 : http://zudy.info/shortener.php

먼저 http://freenom.com 에 접속해서 상단의 메뉴 Partner > Developers 를 선택합니다.

중간 쯤 스크롤하면 아래 그림이 나오는데, 초록 버튼을 클릭해서 구매를 진행합니다. 구매 요금은 0원이므로 따로 청구되는 비용은 없습니다.

이미 회원가입한 이력이 있으면 로그인을 진행하고, 처음 사용자이면 사용 가능한 이메일을 입력하고 이메일 인증을 진행합니다.

구매가 정상적으로 진행되었는지 확인하기 위해 로그인을 진행합니다. Hello ... > My Invoices 를 선택합니다.

My Invoice 를 선택하면 구매한 내용이 나옵니다. 당연히 0원이라고 되어 있겠죠

이로써 단축 URL를 사용하기 위한 모든 준비는 완료되었습니다.

<?php

 // FREENOM 로그인 이메일, 비밀번호
 $login_email = '';
 $login_password = '';

 // 단축할 URL
 $short_val = 'http://daum.net';
 if(!empty($short_val))
 {
$url = "https://api.freenom.com/v2/domain/register.xml";
$post = array(
'forward_url' => $short_val,
'email' => $login_email,
'password' => $login_password
);
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_TIMEOUT, 30);
curl_setopt($curl, CURLOPT_POST, 1);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl, CURLOPT_POSTFIELDS, $post );
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
$resource = curl_exec($curl);
curl_close ($curl);

$object = simplexml_load_string(
     $resource, 'SimpleXMLElement', LIBXML_NOCDATA
);

$result = (array)$object;
// print_r($result);
 }
 if(strtoupper($result['freenom']['status']) === 'OK')
 {
echo 'http://' . $result['freenom']['domain']['domainname'];
 }
 else
 {
if(!$result['freenom']['error'])
{
$result['freenom']['error'] = '원인을 알 수 없는 오류 발생.';
}
echo $result['freenom']['error'];
 }
 ?>

.TK 단축 URL를 이용하면 즉시 5글자 내의 도메인을 만들어 사용자에게 제공해 줄 수 있습니다.

랜덤으로 만들어진 도메인을 확인하려면 Services > My Domain 에서 확인할 수 있습니다. 


블로그 이미지

하보니

하보니와 함께하는 phP 초보

댓글을 달아 주세요

순서 없는 재귀적 파일(또는 폴더) 목록을 배열로 저장하는 사용자 함수입니다.

Categories_Tree_File( directory, f );


directory 인수: 배열로 저장할 폴더 이름

f 인수: 임의의 값을 지정하면 파일을 배열로 저장합니다.

; 반환 값: 재귀적 파일(또는 폴더) 배열 목록

; key 값 끝에 / 가 붙으면 폴더를 의미하고,
      숫자 key 이면 value 값에 파일 이름을 저장합니다.
; count 변수에 파일 개수가 저장됩니다.


 <?php
function Categories_Tree_File($directory$f null)
{
    
$raw = array();     $directory preg_replace(array("@[\.]+@""@[/]+@", ),  array(".""/"), $directory);     if(substr($directory, -1) === '/')     {         $directory substr($directory0, -1);     }     if(is_dir($directory))     {         $count 1;         clearstatcache();         foreach(@scandir($directory) as $node)         {             if( ($node !== ".") && ($node !== "..") )             {                 if(is_file($directory '/' $node))                 {                     clearstatcache();                     if($f)                     {                         $raw[] = rawurlencode($node);                    }                     $raw['count'] = $count++;
                    continue;                 }                 
$raw[rawurlencode($node) . '/'] =  Categories_Tree_File($directory '/' $node$f);             }         }     }     return $raw; } /*     ex.)     $atr = Categories_Tree_File( './example', true );     print_r($atr);     결과 :     Array     (         [0] => README.txt         [1] => add.htm         [2] => add_dir.htm         [3] => bbs_mysql         [4] => bbsdir_mysql         [count] => 5         [file/] => Array             (                 [5/] => Array                     (                         [0] => addfind.gif                         [count] => 1                     )                 [8/] => Array                     (                         [0] => write.gif                         [count] => 1                     )             )        } */ ?>

블로그 이미지

하보니

하보니와 함께하는 phP 초보

댓글을 달아 주세요

http://imgur.com 에서 제공하는 무료 이미지 호스팅을 이용하면 내 홈페이지 저장공간을 절약할 수 있습니다. 홈페이지를 통해 사용자에게 이미지를 제공해 주는 사이트라면 파일 저장 공간이나 트래픽 등을 신경 쓸수 밖에 없습니다.

네이버나 다음에서 제공하는 블로그나 카페를 이용한다면 염려되는 부분이 없지만 독립된 홈페이지, 독자적인 도메인을 이용한다면 비싼 서버 비용을 지불해야 하는데, 사실 개인이나 소규모 업체에서 그 비용을 감당하기에는 현실적으로 어려움이 많을 것이라 생각됩니다. 

그래서 imgur.com 에서 제공하는 무료 이미지 호스팅을 이용한다면 서버 임대 비용이나 관리비용, 트래픽 등을 최소화할 수 있으며, 무제한 업로드할 수 있습니다.

주의점이 있다면, 이미지 업로드는 지극히 개인적인 용도여야 하고, 6개월 동안 사진에 접속이 없으면 자동으로 삭제됩니다. 단, 6개월 이내 사진 접속이 있으면 6개월 재연장되는 식입니다.

먼저 imgur.com 에 로그인을 합니다. 가입하지 않았다면 회원 가입을 먼저 해주세요. 상단 프로파일을 보면 하단 settings 링크를 클릭합니다.

왼쪽 메뉴 하단에 애플리케이션 링크를 선택합니다.

첫 화면 중간 부분에  register 링크를 클릭합니다.

애플리케이션 이름, 콜백 URL을 입력하고 타입은 3번째를 선택합니다. 콜백 URL은 사용할 도메인이 habonyphp.com 이면 habonyphp.com 이라고 입력해 줍니다.

이메일 주소는 인증할 실제 이메일 주소를 입력해 주고 완료를 선택합니다. 이메일 주소를 인증 완료하면 정상적으로 API 를 이용할 수 있습니다.

여기서 중요한 부분은 클라이언트 ID 입니다. 

클라이언트 ID 를 아래 소스에 입력해주면 바로 사용할 수 있습니다.

<!DOCTYPE html>
  <html>
  <head>
  <title>Image Upload Using Imgur API</title>
 </head>
 <body>
  <div id="content" style="margin-top:10px;height:100%;">
   <center><h1>Image Upload Using Imgur API</h1></center>   <form action="imgur.php" enctype="multipart/form-data" method="POST">
    Choose Image : <input name="img" size="35" type="file"/><br/>     <input type="submit" name="submit" value="Upload"/>
   </form>
   <? // 발급 받은 클라이언트 ID 를 입력합니다. $client_id="";
   if(isset($_POST['submit'])){
    
$img=$_FILES['img'];
    if(
$img['name']==''){
     echo 
"<h2>An Image Please.</h2>";
    }else{
     
$filename $img['tmp_name'];
     
$handle fopen($filename"r");
     
$data fread($handlefilesize($filename));
     
$pvars   = array('image' => base64_encode($data));
     
$timeout 30;
     
$curl    curl_init();
     
curl_setopt($curlCURLOPT_URL,  'https://api.imgur.com/3/image.json');
     
curl_setopt($curlCURLOPT_TIMEOUT$timeout);
     
curl_setopt($curlCURLOPT_HTTPHEADER,  array('Authorization: Client-ID ' $client_id));
     
curl_setopt($curlCURLOPT_POST1);
     
curl_setopt($curlCURLOPT_RETURNTRANSFER1);
     
curl_setopt($curlCURLOPT_POSTFIELDS$pvars);
     
curl_setopt($curlCURLOPT_SSL_VERIFYPEERfalse);
     
$out curl_exec($curl);
     
curl_close ($curl);
     
$pms json_decode($out,true);
     
$url=$pms['data']['link'];
     if(
$url!=""){
      echo 
"<h2>Uploaded Without Any Problem</h2>";
      echo 
"이미지 경로 : $url <br />";
      echo 
"<img src='$url'/>";
     }else{
      echo 
"<h2>There's a Problem</h2>";
      echo 
$pms['data']['error']['message'];
     }
    }
   }
   
?>
  </div>
  <style>
  input{
   border:none;
   padding:8px;
  }
  </style>
 </body>
</html>

위 소스 출처: http://subinsb.com/uploading-images-using-imgur-api-in-php

파일을 업로드 하면 이미지 경로를 얻을 수 있습니다. "http://i.imgur.com/파일이름" 형식의 출력된 이미지 경로를 홈페이지에 삽입하세요. 아래 이미지는 결과 화면입니다.

블로그 이미지

하보니

하보니와 함께하는 phP 초보

댓글을 달아 주세요


구글 reCaptcha 를 php 로 연동하기 하기 위해서는 먼저 'Site key' 와 'Secret key' 를 발급받아야 합니다.


연동하고자 하는 도메인 주소나 localhost 를 입력하면 바로 발급받을 수 있으니 어렵지는 않습니다.



먼저 아래 주소로 접속해 주세요.


https://www.google.com/recaptcha/intro/index.html



다음에는 도메인 주소를 입력하고 등록을 클릭합니다.




등록 즉시 'Site key' 와 'Secret key' 를 발급받아 주세요.

'Site key', 'Secret key' 값을 아래 소스 값에 기입후 바로 사용하면 되겠습니다.


 <?php

 $sitekey 
'Site Key'
 $secretKey "Secret Key"

 if(
$_SERVER['REQUEST_METHOD'] === "POST") {
     
$name null;
     
$contents null;
     
$recaptcha null;
     if(
$_POST['name']){
         
$name $_POST['name'];
     }
     if(
$_POST['contents']){
         
$contents $_POST['contents'];
     }
     if(
$_POST['g-recaptcha-response']){
         
$recaptcha $_POST['g-recaptcha-response'];     
     }
     if(
$recaptcha){
         
$url "https://www.google.com/recaptcha/api/siteverify?
                 secret=" 
$secretKey "&response=" $recaptcha 
                 "&remoteip=" $_SERVER['REMOTE_ADDR'];

         $resource =  file_get_contents$url ); 


        $val json_decode($resourcetrue);
        if(
intval($val["success"]) !== 1){
             echo 
"정상적인 접속이 아닌 것 같습니다.";
             die();
        }
         echo 
"name = $name <br />";

         echo "contents = $contents <br />";
     }else{
         echo 
"로봇이 아니면 체크해주세요.";
         die();
     }
 }
 
?> 
 <html>
     <head>
        <title>Google recapcha</title>         <script src='https://www.google.com/recaptcha/api.js'></script>

    </head>
    <body>
        <h1>Google reCAPTHA</h1>
        <form action="" method="post">         <input type="text" name="name" size="40"><br><br>         <textarea name="contents" rows="8" cols="40"></textarea><br><br>         <input type="submit" name="submit" value="Submit"><br><br>         <div class="g-recaptcha" data-sitekey="
<?php echo $sitekey?>"></div>         </form>
     </body>
 </html>



블로그 이미지

하보니

하보니와 함께하는 phP 초보

댓글을 달아 주세요

HTTP 헤더 인젝션은 공격자가 헤더에 개행문자를 삽입하여 헤더를 추가하여 공격하는 수동적 공격 방식입니다.


이 공격이 허용되는 경우 쿠키를 임의대로 생성하거나 임의로 URL를 리다이렉트 시킬 수 있습니다.


 http://example.com/?id=1001

위과 같은 코드가 있다면 아래 코드로 고쳐서 공격합니다.


 http://example.com/?id=101%0D%0A%0D%0ASet-cookie+SID=a123456789

결국 아래와 같은 결과 값을 얻게 되므로 쿠키를 만들게 됩니다.

 http://example.com/?id=101


 Set-cookie+SID=a123456789


공격자가 입력한 %0D%0A 는 \r\n 을 의미하므로 결과적으로 새로운 헤더가 만들어 지게 되는 것입니다.

다음의 방법도 주의해야할 부분입니다.


 http://example.com/?id=101%0D%0A%0D%0A<html><body><h2>Hello Habony!!</h2></body></html>

위 문자열이 HTTP 인젝션이 가능하게 되면 아래와 같은 결과가 나타나게 됩니다.

 http://example.com/?id=101


 <html>

   <body>

      <h2>Hello Habony!!</h2>

   </body>

 </html>


이 공격에 의해 유저에게 가짜 웹페이지를 표시하여 개인 정보를 입력받거나 크로스 사이트 스크립팅과 같은 공격을 받게 됩니다. 


물론 개행문자를 이용해 메일 헤더 인젝션 공격도 시도할 수 있습니다.


 http://example.com/?email=you@example.com%0D%0Ato@example.com


이렇게 입력받게 되면 공격자는 Bcc에 임의대로 수신자를 추가해 버릴 것입니다.


 <?php
 $header "you@example.com%0D%0Ato@example.com";
 mail($to$subject$content), $header);
 /*
 결과:
 you@example.com
 to@example.com
 */
 ?>


그래서 다음의 방법 등으로 문자열을 취환해서 공격을 회피해야 합니다.


 <?php
 $str "http://example.com/?id=101%0D%0A%0D%0ASet-cookie+SID=a123456789";
 
$str str_replace(array("\r""\n"), ""$str);
 
?>


블로그 이미지

하보니

하보니와 함께하는 phP 초보

댓글을 달아 주세요

일반 배열을 카테고리 및 하위 카테고리 형태로 구현한 소스입니다.

 <?php
 $list = array(
        array(
'idx' => 1,  'parent_id' => 0),
        array(
'idx' => 2,  'parent_id' => 0),
        array(
'idx' => 3,  'parent_id' => 0),
        array(
'idx' => 4,  'parent_id' => 0),
        array(
'idx' => 5,  'parent_id' => 0),
        array(
'idx' => 6,  'parent_id' => 2),
        array(
'idx' => 7,  'parent_id' => 2),
        array(
'idx' => 8,  'parent_id' => 3),
        array(
'idx' => 9,  'parent_id' => 4),
        array(
'idx' => 10'parent_id' => 9)
 );
$tree Tree_Array($list'idx''parent_id');
print_r($tree);

function 
Tree_Array($atr$id='id'$parent_id='parent'$children='children')
{
    
$nlist = array(
        array( 
$children => array() )
    );
    
$raw = array(&$nlist[0]);
    if(isset(
$atr))
    {
        foreach(
$atr as $q => $w)
        {
            
$raw[$w[$parent_id]][$children][$w[$id]] = $w;
            
$raw[$w[$id]] = &$raw[$w[$parent_id]][$children][$w[$id]];
        }
    }
    return 
$nlist[0][$children];
}
/*
결과:
Array
(
    [1] => Array
        (
            [idx] => 1
            [parent_id] => 0
        )
    [2] => Array
        (
            [idx] => 2
            [parent_id] => 0
            [children] => Array
                (
                    [6] => Array
                        (
                            [idx] => 6
                            [parent_id] => 2
                        )
                    [7] => Array
                        (
                            [idx] => 7
                            [parent_id] => 2
                        )
                )
        )
    [3] => Array
        (
            [idx] => 3
            [parent_id] => 0
            [children] => Array
                (
                    [8] => Array
                        (
                            [idx] => 8
                            [parent_id] => 3
                        )
                )
        )
    [4] => Array
        (
            [idx] => 4
            [parent_id] => 0
            [children] => Array
                (
                    [9] => Array
                        (
                            [idx] => 9
                            [parent_id] => 4
                            [children] => Array
                                (
                                    [10] => Array
                                        (
                                            [idx] => 10
                                            [parent_id] => 9
                                        )
                                )
                        )
                )
        )
    [5] => Array
        (
            [idx] => 5
            [parent_id] => 0
        )
)
*/
?>


블로그 이미지

하보니

하보니와 함께하는 phP 초보

댓글을 달아 주세요

프록시 서버나 인터넷 익스플로러, 크롬, 파이어 폭스와 같은 브라우저에 비밀번호와 같은 민감한 정보가 저장된다면 원치않게 정보가 노출되어 공격의 대상이 될 수 있습니다. 그래서 다음과 같이 민감한 정보가 저장되지 않도록 헤더를 추가해 줄 수 있습니다.


 <?php
 header
('
    Cache-Control: no-store,
    no-cache,
    private,
    max-age=0,
    must-revalidate,
    post-check=0,
    pre-check=0;
    Pragma: no-cache;
    Expires: Sat, 26 jul 1997 05:00:00 GMT;
 '
);
 ?>
 <html>
 <body>
 <h1>Hello Habony Password = 1234567890</h1>
 </body>
 </html>


블로그 이미지

하보니

하보니와 함께하는 phP 초보

댓글을 달아 주세요


Ajax 를 사용하는 경우 X-Requested-With 헤더를 추가해 직접 액세스하는 것을 금지하도록 하여야 합니다. 단, 공격자는 HTTP_ 로 시작하는 헤더를 자유자재로 추가할 수도 있기 때문에 완벽한 보증은 할 수는 없습니다.


 <?php
 if( !isset($_SERVER['HTTP_X-REQUESTED_WITH']) || 

 ($_SERVER['HTTP_X-REQUESTED_WITH'] !== 'XMLHttpRequest') )
 {
    echo 
"잘못된 접근입니다.";

    exit;
 }
 ?>


블로그 이미지

하보니

하보니와 함께하는 phP 초보

댓글을 달아 주세요

C 에서 NULL 바이트는 문자열의 끝을 나타내는데, 이것을 이용해 공격하는 기법입니다.


 \x00

 \0


아래 URL 의 값을 받는다고 가정해 보겠습니다.


 habony.php?user_id=%00%27%3BSELECT+*+FROM+member_table


다음의 결과처럼 의도치 않게 문제가 발생하게 됩니다.


 <?php
 $_GET
['user_id'] = '%00%27%3BSELECT+*+FROM+member_table';
 mysql_query("SELECT * FROM member_table WHERE uid='$_SESSION[memb]

                    AND md='$_GET[user_id]'");
 // 결과 : SELECT * FROM member_table WHERE uid='101' 
AND md='';

            SELECT * FROM member_table

 ?> 


 <?php
 
// file : "../../etc/passwd\0image.php"
 
$file $_GET['file'];

 
// file_exists : TRUE
 
if(file_exists('/home/habony/'.$file.'.php'))
 {
    include 
'/home/habony/'.$file.'.php';
 }
 
// 결과 : include '../../etc/passwd';
 
?>


이 문제를 해결하기 위해 다음의 방법으로 해결할 수 있을 것입니다.


 <?php
 $clean str_replace("\x00"''$input); 
 
// OR 

 $clean str_replace("\0"''$input);
 
// OR
 
$clean str_replace(chr(0), ''$input);
 
?>


블로그 이미지

하보니

하보니와 함께하는 phP 초보

댓글을 달아 주세요

Click Jacking 기법은 CSRF 기법과 비슷하지만 수동적인 방법으로 공격합니다. 예를 들어 공격자는 어떤 페이지에 투명한 프레임(iframe)으로 표시해두고, 사용자는 문제의 페이지를 열었을 때 무심코 그 투명한 프레임(iframe)을 클릭하도록 유도하는 방법입니다.


무심코 클릭하면 CSRF 기법처럼 게시물을 삭제해 버리는 등 의도치 않는 동작을 하게 합니다.


iframe 의 사용을 제한하는 X-FRAME-OPTIONS 헤더를 이용해 문제를 해결할 수 있으며, 익스플로러 8 부터 사용할 수 있습니다.


헤더의 값을 SAMEORIGIN 로 설정하면 호스트명이 같을 경우에만 iframe을 허용합니다. 예를 들어 example.com/bbs/habony.php 와 example.com/bbs/test.php 파일에는 표시하지만 book.example.com/habony.php 파일은 호스트명이 다르므로 표시가 되지 않습니다.


 X-FRAME-OPTIONS: SAMEORIGIN

DENY 를 지정하면 모든 페이지에 iframe 에 표시되는 것을 제한합니다.


 X-FRAME-OPTIONS: DENY


블로그 이미지

하보니

하보니와 함께하는 phP 초보

댓글을 달아 주세요

CSRF 공격은 어떤 게시판의 페이지를 열었을 때 의도치 않는 어떤 처리를 실행시켜 버리는 방법입니다.


아래 코드는 언뜻 보면 정상적인 코드로 보일 수 있습니다. 예를 들어 아래 태그가 포함된 페이지가 있고, 관리자만 게시물을 삭제할 수 있게 하여 일반 사용자는 게시물을 삭제할 수 없도록 해두었습니다.


하지만 관리자 세션을 취득한 관리자가 아래 페이지에 접속하는 것만으로도 의도치 않게 손쉽게 페이지를 삭제해 버릴 것입니다. 일반 사용자가 관리자 세션을 취득하지 않아도 말입니다.


 <?php
 if(!empty($_SESSION['admin_session']))
 {
    
mysql_query("DELETE FROM `tbname` WHERE id='101';");
 }
 ?>
 <img src="http://example.com/del.php?id=101">


그래서 요즘은 회원정보 변경 전 처리 페이지 직전에 비밀번호를 요구하거나 토큰을 요청하여 올바른 경우에만 변경하도록 하고 있습니다.


아래와 같이 비밀번호가 일치할 때만 삭제하게 해두면 CSRF 공격에 대응할 수 있습니다.


  <?php
 if(
($_POST['admin_password'] === '123456789') && ($_POST['id'] === '101')) 

 {
    if(!empty(
$_SESSION['admin_session']))
    {
        
mysql_query("DELETE FROM `tbname` WHERE id='101';");
    }
 }
 ?>
 <img src="http://example.com/del.php?id=101">



2013/03/18 - CSRF 웹보안 자료





블로그 이미지

하보니

하보니와 함께하는 phP 초보

댓글을 달아 주세요

인터넷 익스플로러 에서는 서버에서 전송되는 Content-Type 헤더을 무시하고, HTML 파일이 아닌 파일을 HTML 로 인식해 버리는 문제가 있습니다.


그럴 경우 XSS 공격에 매우 취약해지므로 아래 헤더를 지정하여 문제를 해결할 수 있습니다. 단 익스플로러 8 이하 버전에서는 동작하지 않습니다.


 X-Content-Type-Options: nosniff 


블로그 이미지

하보니

하보니와 함께하는 phP 초보

댓글을 달아 주세요

아래 예는 폴더 내의 내용을 재귀적으로 배열로 만들어 반환하는 사용자 함수입니다.


폴더이면 key 값의 끝에 / 가 붙고, 숫자 key 이면 value 값에 파일 이름이 저장한 재귀적 배열을 반환합니다.


$f 인수에 임의의 값을 지정하면 파일도 배열에 저장합니다.


 <?php
 function file_dir($dir$f null)
 {
    $raw = array();

   $dirpreg_replace(
array("@[\.]+@""@[/]+@"), array(".""/"), trim($dir)
);    if(substr($dir, -1) === '/')    {      $dirsubstr($dir0, -1);    }
   if(
is_dir($dir))    {      clearstatcache();      foreach(@scandir($dir) as $node)      {        if( ($node !== ".") && ($node !== "..") )        {           if(is_file($dir'/' $node))           {              clearstatcache();              if($f)              {                 $raw[] = rawurlencode($node);              }              continue;           }      $raw[rawurlencode($node) . '/'] = 
file_dir($dir'/' $node$f);       }     }   }     return $raw; }
$row file_dir('..../dirbbs/////'true); print_r($row); /* 결과 : Array (     [0] => README.txt     [1] => add.htm     [2] => add_dir.htm     [3] => bbs_mysql     [4] => bbsdir_mysql     [5] => config.inc     [6] => dberror.htm     [7] => delete.htm     [8] => delete_dir.htm     [9] => detail.htm     [file/] => Array         (             [5/] => Array                 (                     [0] => addfind.gif                 )             [8/] => Array                 (                     [0] => write.gif                 )         )
.... } */ ?>


블로그 이미지

하보니

하보니와 함께하는 phP 초보

댓글을 달아 주세요

ipv4 주소 형식은 255.255.255.255 또는 255.255.255.255/0 ~ 32 이면 true, 아니면 false 입니다.


ex.1)

 function ipv4_check($block)
 {
    if(preg_match('@^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)((?:(?:/(?:3[0-2]|2[0-9]|1[0-9]|[0-9])))?)$@'$block) && (preg_last_error() === PREG_NO_ERROR))
 {
    return true;

 }
    return 
false;
}
echo 
ipv4_check("127.0.0.1"); // true
 echo ipv4_check("127.0.0.1/32"); // true

echo ipv4_check("127.0.0.256"); // false
echo ipv4_check("127.0.0.1/33"); // false


블로그 이미지

하보니

하보니와 함께하는 phP 초보

댓글을 달아 주세요

http://openovate.com 에서 제공하는 PHP 라이브러리를 이용하면 페이스북이나 트위터, 페이팔, 구글, 아마존 등 인증 API 를 쉽게 구현할 수 있습니다.


아래는 페이스북 활용의 예입니다.


 <?php

 include ('eden.php');
 session_start();

// 페이스북 애플리케이션 ID
$FACEBOOK_KEY '';
// 페이스북 애플리케이션 비밀번호
$FACEBOOK_SECRET '';
// 페이스북 인증 후에 되돌아갈 콜백 URL
$FACEBOOK_CALLBACK_UTL 'http://example.com/login/';
$auth eden('facebook')->auth(
$FACEBOOK_KEY$FACEBOOK_SECRET$FACEBOOK_CALLBACK_UTL );

if(!isset($_GET['code']) && !isset($_SESSION['fb_token'])) {
    
$login $auth->getLoginUrl();
    
header('Location: '.$login);
    exit;
}
if(isset(
$_GET['code'])) {
    
$access $auth->getAccess($_GET['code']);
    
$_SESSION['fb_token'] = $access['access_token'];
}
?>

파일 다운로드 :  eden.php

다운로드 링크 : http://eden.openovate.com/download
메뉴얼 링크 : http://eden.openovate.com/documentation/start


블로그 이미지

하보니

하보니와 함께하는 phP 초보

댓글을 달아 주세요

img 태그에 이미지 파일을 연결하는 방법이 가장 기본적이지만 여기서 소개하는 방법은 이미지 파일을 base64 로 인코딩한 텍스트 문자로 img 태그에 적용하는 것입니다.


방법은 src 에 이미지 파일 경로를 지정하는 대신에 data:// 를 설정해서 이미지를 표현하는데, 문자열은 text/plan 이고, base64 로 인코딩되어 있음을 지정합니다.


 <img src="data:image/gif;base64, ...>

ex .1)

<?php  
 $data 
base64_encode(file_get_contents("test.png")); 
 echo 
"<img src='data:image/gif;base64, $data'>"
?>


위 예제와 같이 이미지 파일을 base64 로 인코딩하면 아래 결과에서 처럼 텍스트 문자를 얻을 수 있고, 브라우저에서는 그림으로 출력되게 됩니다.


 <img src="data:image/gif;base64, R0lGODlhZABkAPQAAP///wAAAI6OjmhoaDY2Njw8

PFxcXBwcHBISEiwsLFRUVExMTH5+foaGhiQkJAAAAHZ2dkRERAoKCgAAAAAAAAAAAAA

AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH+GkNyZWF0ZWQgd2l0aCBha

F4bG9hZC5pbmZvACH5BAAHAAAAIf8LTkVUU0NBUEUyLjADAQAAACwAAAAA....">


결과:


블로그 이미지

하보니

하보니와 함께하는 phP 초보

댓글을 달아 주세요



다이렉트로 SSL 소켓 접속의 예입니다.

 <?php 
 // note that "ssl" is the protocol, NOT "https" 
 $hostname  "ssl://your-secure-site.com"
 $port      443

 // create and configure the client socket 
 $fp fsockopen($hostname$port); 
 if (
$fp) { 
    
stream_set_timeout($fp30); 
     
  
// send data (or build HTTPS headers similar to first example) 
  
fwrite($fp"your message goes here"); 
     
    
// read response 
    
while (!feof($fp)) { 
        echo 
fgets($fp128); 
    } 
     
    
// close the socket 
    
fclose($fp); 
 } 
 ?>


다음은 HTTP 소켓 접속의 방법입니다.


 <?php 
 // don't need to specify http, it's the default protocol 
 $hostname "www.google.com"
 $port     80

 // create and configure the client socket 
 $fp fsockopen($hostname$port); 
 // optional: $error_number, $error_string, $connect_timeout 

 if (
$fp) { 

    // seconds to wait for i/o operations 
    
stream_set_timeout($fp30);
     
    // send request headers 
    
fwrite($fp"GET / HTTP/1.1\r\n"); 
    
fwrite($fp"Host: $hostname\r\n");


    // Accept, User-Agent, Referer, etc.  
    
fwrite($fp$additional_headers); 

    
fwrite($fp"Connection: close\r\n"); 
     
    
// read response 
  
$response ""
    while (!
feof($fp)) { 
        
$response .= fgets($fp128); 
    } 
  echo 
$response
     
    
// close the socket 
    
fclose($fp); 
 } 
 ?>


출처: http://arguments.callee.info/2009/02/10/http-https-and-ssl-via-php/


블로그 이미지

하보니

하보니와 함께하는 phP 초보

댓글을 달아 주세요

php 로 함수 오버로딩를 만들 수 있습니다.

이미 알려진 방법이지만 어려운 방법도 아닙니다.


 <?php 
 function overloading() 
 { 
    
$raw = array(); 
    
$size func_num_args(); 
    for(
$i=0$i<$size$i++) 
    { 
        
$raw[] = func_get_arg($i); 
    } 
    
print_r($raw); 
 } 


 overloading('hello','world','foobar'); 
 /* 
 결과: 
 Array 
 ( 
    [0] => hello 
    [1] => world 
    [2] => foobar 
 ) 
 */ 
 ?>


블로그 이미지

하보니

하보니와 함께하는 phP 초보

댓글을 달아 주세요