Javascript parseInt 버그 "08", "09"

Javascript parseInt 버그 "08", "09"


프로젝트하면서 야구 시간표 때문에 달력을 만든 적이 있습니다. 

유독 8일과 9일에서만 에러가 나더군요. 다른데는 다 괜찮은데 

일부 스마트폰에서 그런 에러가 발생하는겁니다. 


문자열 "07"까지는 7로 잘 변환이 되지만 

문자열 "08","09"만 0으로 변환이 되는 

이상한 버그가 있습니다. 


이게 대다수에서는 8, 9로 잘 변환이 되지만 

일 부 기기에서만 0으로 변환이 됩니다. 


해결방법은 앞에 "0" 제거하고 변환하시면됩니다. 


[협찬] http://phpjs.org/ 

  

function intval(mixed_var, base){ 

var type = typeof(mixed_var); 

if(type==='boolean'){ 

return (mixed_var)? 1: 0; 

} else if(type==='string'){ 

tmp = parseInt(mixed_var, base || 10); 

return (isNaN(tmp) || !isFinite(tmp))? 0: tmp; 

} else if(type==='number' && isFinite(mixed_var)){ 

return Math.floor(mixed_var); 

} else{ 

return 0; 

}


네이버 블로그 API 이미지까지 업로드

네이버 블로그 API 이미지까지 업로드


제목보면 뭔가 이상하지만 삽질의 결과물로 인한것이라..../먼산 


서버에 있는 데이터를 네이버 블로그API를 이용하여 글을 올리게 되면 이미지는 서버에 저장된 채로 글만 올라갔었는데 


이것저것 뒤적 뒤적 하다가 어찌어찌 연결되었습니다./먼산 


사용하시는 분들에게 도움이 되었으면 좋겠네요 =ㅅ=ㅋ 


참고로 category의 지정시 없는걸로 하면 아마도 기본 설정으로 저장되는걸로 알고 있습니다. 

(물론 확실하지 않아요/먼산) 


기타 질문도 받습니다. 


http://www.xmlrpc.com/spec 

여기서 xmlrpc.inc 파일 받는거 잊으시면 안됩니다. 


P.S. 제가 작업한 서버쪽은 이상하게 name time out이 자주 뜹니다. 

curl 문제인거 같은데 제가 서버쪽을 잘 몰라서...../먼산 

아마 속도 때문에 그런거 같으니 문제 되시는 분들은 timeout을 늘려주세요< 


P.S.2 지금보니 일부 쓸모없는 echo가 남아있네요.... 어차피 주석처리 되어 있지만 테스트 하실때 써먹../퍽!

[ ▼ 참고 Source ]


include "xmlrpc/lib/xmlrpc.inc" ; // 이 부분은 다 아실테니...
$rs << DB에서 불러온 데이터 입니다.

$tit = $rs[0][title] ;
$tex = $rs[0][text] ;
$loof_chk = 0 ;

$url = "https://api.blog.naver.com/xmlrpc";
$blogid = "ID"; << 어차피 같은 네이버 아이디니...../먼산
$id = "ID";
$pw = "api키 값"; 블로그에서 할당받은 API KEY

// 네이버 api 이미지 업로드 함수
function upload_image( $url , $blogid , $id , $pw , $tit , $tex ) {

	$api_url = $url ;
	$blog_user = $id ;
	$blog_passwd = $pw ;
	preg_match_all("/<img[^>]*src=[\"']?([^>\"']+)[\"']?[^>]*>/i", $tex , $out ) ;
	preg_match_all("/<img[^>]*src=[\"']?([^>\"']+)[\"']?[^>]*>/ui", $tex , $out2 ) ;
	$cmm = count($out[1]) ;
//	echo "".count($out[1]) ;
	if ( $cmm > 0 )
	{
		for ( $i = 0 ; $i < $cmm ; $i++ )
		{
			$im = "http://서버주소".$out[1][$i] ;

			$imgbit = file_get_contents($im, FILE_BINARY);
			$img = new xmlrpcval(
			array (
			'bits' => new xmlrpcval($imgbit, 'base64'),
			'type' => new xmlrpcval('image/jpeg', 'string'),
			'name' => new xmlrpcval(basename($im), 'string')
			), 'struct');

			$c = new xmlrpc_client($api_url);
//			$c->debug = true; // Uncomment this line for debugging info
			$c->setSSLVerifyPeer(false);

			$x = new xmlrpcmsg("metaWeblog.newMediaObject");
			$x->addParam(new xmlrpcval($blog_user, 'string'));
			$x->addParam(new xmlrpcval($blog_user, 'string'));
			$x->addParam(new xmlrpcval($blog_passwd, 'string'));
			$x->addParam($img);

			$c->return_type = 'phpvals';
			$r =$c->send($x, 3, 'https');
			$message->request_charset_encoding = "UTF-8";
			$tex = str_replace($out2[1][$i], $r->val[url] , $tex ) ;
			if ( $r->val[errno] == 0 and $r->errno != 8 ) { $loof_chk++ ; }
//			echo $tex."".$i."loof_chk = ".$loof_chk."" ;
//			print_r($r); // 결과 부분입니다. 에러체크용으로도 사용할 수 있습니다.
//			echo "" ;

			if ( ( $r->errno != 8 and $r->val[errno] == 0 ) and ( $i == ( $cmm - 1 ) and $loof_chk == $cmm ) )//이미지가 다량존재시 하나라도 업로드 실패했을 경우에 대비한 if 문입니다.
			{ return m3_naver_post( $url , $blogid , $id , $pw , $tit , $tex , $_GET['position']) ; } //$_GET['position']은 전 페이지에서 카테고리설정을 위해 받는 부분입니다.
			else if ( $i == ( $cmm - 1 ) ) { echo "<script>alert('업로드에 실패하였습니다.');document.getElementById('emd').value = 'fail';</script>" ; }
		}
	}
	else { return m3_naver_post( $url , $blogid , $id , $pw , $tit , $tex , $_GET['position']) ; }
}

// 네이버 api 포스팅 올리는 함수
function m3_simple_metaweblog($url, $blogid, $id, $pw, $title, $description, $category, $publish=true) {
	$GLOBALS["xmlrpc_internalencoding"] = "UTF-8";
	$client = new xmlrpc_client($url);
	//$client->setdebug(1);
	$struct = array(
		'title' => new xmlrpcval($title, "string"),
		'description' => new xmlrpcval($description, "string"),
		'categories' => new xmlrpcval($category, "string") 
		);
	$message = new xmlrpcmsg("metaWeblog.newPost", array(
		new xmlrpcval($blogid, "string"),
		new xmlrpcval($id, "string"),
		new xmlrpcval($pw, "string"),
		new xmlrpcval($struct, "struct"),
		new xmlrpcval($publish, "boolean")
		)
	);
	return $response = $client->send($message);
}

// 네이버 직접 포스팅 함수
function m3_naver_post( $url , $blogid , $id , $pw , $title, $description, $category) {
	global $api;

	return $response = m3_simple_metaweblog($url, $blogid, $id, $pw, $title, $description, $category);
}

$return = upload_image( $url , $blogid , $id , $pw , $tit , $tex ) ;
?>


http/https 혼합 환경에서 세션 보안 강화하기

http/https 혼합 환경에서 세션 보안 강화하기


간만에 올리는 보안팁텍입니다. 


요즘 로그인 페이지, 회원가입 페이지 등 개인정보가 오가는 곳에는 

https (SSL 또는 TLS) 보안서버를 사용하는 것은 상식이 되었죠? 

(음 그러나 현실은... 상식이 되었다고 제발 믿고 싶습니다 ㅠㅠ) 


구글이나 트위터 등의 해외 사이트들은 아예 모든 페이지에 https를 일괄 적용하곤 합니다. 

그러나 국내에서는 https를 적용한 사이트라도 모든 페이지에 일괄 적용하기보다는 

법에서 요구하는 최소한 - 로그인과 회원가입 페이지 - 에만 적용하는 경우가 많습니다. 

여전히 https에 대한 막연한 두려움과 미신이 많기 때문인데요... 


막연한 두려움과 미신 참고: 

http://www.phpschool.com/link/tipntech/77347 

http://www.phpschool.com/link/tipntech/77348 


------------------------------------------------------------------------------------------------------- 


그런데 일부 페이지에만 https를 적용할 경우 치명적인 문제가 한 가지 발생합니다. 

로그인에 사용하는 아이디와 비번은 암호화 전송이 되지만, 

로그인 상태를 표시하기 위한 세션 쿠키는 다른 페이지에서 무방비 상태로 노출된다는 거죠. 


세션 쿠키의 값을 알아낼 수 있다면 아이디와 비번 따위는 훔칠 필요도 없습니다. 

세션 쿠키를 사용하면 자기도 님의 아이디로 로그인된 상태로 만들 수 있으니까요. 

일단 이렇게 로그인 상태로 만들면 회원정보도 마음대로 볼 수 있고 

남의 글이나 댓글을 지울 수도 있고, 심지어 남의 이름으로 물건을 살 수도 있죠. 

이건 뭐, https를 적용한 보람이 전혀 없습니다. 


(회원정보 열람 전에 비번을 다시 입력하도록 하면 어느 정도는 피해를 막을 수 있겠죠? 

그러나 모든 페이지에서 매번 비번을 묻지 않는 한 100% 막을 수는 없습니다.) 


PHP에서는 세션을 시작할 때 $secure 옵션을 사용하면 

https 상태에서만 세션 쿠키가 전송되도록 강제할 수 있습니다. 

그러나 이렇게 하면 https를 적용하지 않은 다른 페이지에서는 로그인이 풀려버리죠. 

그래서 대부분의 사이트들은 세션의 $secure 옵션을 사용하기가 힘듭니다. 


------------------------------------------------------------------------------------------------------- 


오늘은 http와 https를 혼합하여 사용하는 환경에서도 

세션 쿠키 도난의 위험을 최대한 줄이는 방법을 소개해 보겠습니다. 


문제의 핵심은 공격자가 http 상태에서 훔친 세션 쿠키를 

https 상태에서도 마음놓고 사용할 수 있다는 것입니다. 

따라서 우리의 목적은 http 상태에서 세션 쿠키를 훔치더라도 

https 상태에서는 무용지물이 되도록 하는 것입니다. 


------------------------------------------------------------------------------------------------------- 


1. 일단 그냥 세션을 시작합니다. $secure 옵션은 사용하지 않습니다. 

    PHP에서는 보통 PHPSESSID라는 이름의 세션 쿠키를 사용합니다. 


2. 로그인하는 순간에는 https 상태이겠죠? 이 때 쿠키를 하나 더 구워줍니다. 

    이 쿠키를 편의상 "보안쿠키"라고 부르고, 쿠키 이름은 SSLSESSID라고 하겠습니다. 

    랜덤으로 생성한 값을 이 쿠키에 넣고, 같은 값을 세션에도 하나 저장해 둡니다. 

    중요한 건, SSLSESSID 쿠키에는 $secure 옵션을 사용해야 한다는 점입니다. 

    당연히 이 쿠키는 https 상태일 때만 전송되겠죠? 

    다른 방법으로 쿠키를 훔치는 것을 막기 위해 $httponly 옵션도 넣어주면 좋습니다. 


3. 사용자를 http 페이지로 돌려보냅니다. 

    이 때는 세션 쿠키(PHPSESSID)만 전송되고, 보안쿠키는 전송되지 않습니다. 

    따라서 누가 세션 쿠키를 훔쳐가도 알아차릴 방법이 없습니다. 

    공격자가 실제 사용자와 같은 와이파이를 사용하고 있다면 IP도 당연히 같겠고, 

    세션 쿠키를 훔칠 정도면 User-Agent 같은 것도 얼마든지 훔쳐서 베낄 수 있을 테니까요. 

    이건 http의 한계입니다. 어쩔 수 없습니다. 


4. 반면, 사용자가 다시 https 페이지를 방문한다면 어떻게 될까요? 

    정상적인 사용자라면 세션 쿠키(PHPSESSID)와 보안쿠키(SSLSESSID)가 함께 전송되겠죠. 

    그러나 공격자는 세션 쿠키는 훔칠 수 있어도 보안쿠키는 훔칠 수 없습니다. 

    따라서 PHPSESSID만 전송하거나, SSLSESSID의 값을 짐작해야 합니다. 

    그런데 SSLSESSID의 값은 랜덤으로 생성했으므로 짐작하기가 매우 어렵습니다. 


5. https 페이지를 방문할 경우 서버에서 SSLSESSID 쿠키를 체크합니다. 


5-1. 만약 SSLSESSID 쿠키가 있다면 세션에 저장해 두었던 값과 비교합니다. 

      일치하면 정상적인 사용자입니다. 

      일치하지 않는다면 공격자입니다. 세션을 폭파해 버려야 합니다. 콰쾅. 


5-2. 만약 SSLSESSID 쿠키가 없다면 세션에 저장해 둔 값이 있는지 확인합니다. 

      세션에 저장해 둔 값이 없다면 2단계를 거치지 않았다는 뜻이므로 

      2단계와 같이 보안쿠키를 새로 발급해 주면 됩니다. 

      반면, 세션에 저장해 둔 값이 있는데도 보안쿠키를 전송하지 않았다면 

      (즉, 분명 아까 보안쿠키를 구워줬는데 어딘가에 흘리고 왔다면) 

      공격자가 SSLSESSID의 값을 짐작하지 못해서 비워둔 것이겠죠? 

      당연히 세션을 폭파해 버려야 합니다. 쿠콰쾅. 


6. 위와 같은 방법을 사용하면 공격자가 http 상태에서 세션 쿠키를 훔치더라도 

    https 페이지를 방문하는 순간 세션이 폭파되어 버리므로 

    훔친 세션 쿠키는 무용지물이 됩니다. 

    반면, 정상적인 사용자들이 웹사이트를 이용하는 데는 아무 지장이 없습니다. 


7. 단, 로그인 후에 단 한번도 https 페이지를 방문하지 않는다면 아무 소용이 없겠죠? 

    위의 방법으로 최대한의 효과를 얻으려면 

    종종 https 페이지를 방문하도록 해주어야 합니다. 

    로그인, 회원가입, 회원정보 열람 및 수정, 아이디/비번찾기, 결제페이지는 물론이고 

    가끔 막 엉뚱한 것을 https 페이지로 만들어서 공격자를 놀려주세요. 

    예를 들어 게시판에서 글 읽을 때는 평범한 http이지만 

    글 쓰는 폼의 action 주소는 https로 해둔다거나... 

    그러면 만약 세션 쿠키를 훔치더라도 다른 사람을 사칭해서 글을 쓰려고 하는 순간 

    세션 폭파 쿠콰콰콰! 


8. 그런데 대부분의 웹사이트들은 http로 접속하든 https로 접속하든 내용이 똑같습니다. 

    그래서 아주 조심스러운 공격자라면 https 링크를 http로 바꾸어 접속함으로써 

    세션이 폭파되는 것을 피할 수 있어요. 

    이런 꼼수를 막기 위해, https로 접속해야 하는 페이지에 http로 접속한 경우 

    아무 것도 보여주지 말고 곧바로 Location: 헤더를 사용해서 https로 넘겨주세요. 

    만약 공격자였다면 당연히 세션 폭파 쿠콰콰콰! 


------------------------------------------------------------------------------------------------------- 


9. 방법만 알려드리고 예제 소스가 없으면 그건 제 스타일이 아니죠? 

    위에서 언급한 모든 작업을 한 번에 해주는 함수입니다. 

    그 밖에도 3분마다 쿠키값을 바꿔주고 

    세션 관련 php.ini 속성들을 자동으로 조절해 주는 등 

    쓸만한 기능들이 좀 있어요. 

    session_start() 대신 쓰시면 됩니다. 


/** 

 * 합리적인 기본값으로 세션을 시작하는 함수 

 * 

 * @param int $lifetime = 0 

 * @param string $path = '/' 

 * @param string $domain = null 

 * @param bool $secure = false 

 * @param bool $httponly = true 

 * @return void 

 */ 

function session_start_better($lifetime = 0, $path = '/', $domain = null, $secure = false, $httponly = true) 

    // 세션 관련 php.ini 설정 조절 

    ini_set('session.gc_maxlifetime', max($lifetime, 86400)); 

    ini_set('session.hash_function', 1); 

    ini_set('session.use_cookies', 1); 

    ini_set('session.use_only_cookies', 1); 

    ini_set('session.use_strict_mode', 1); 

    if (defined('PHP_OS') && !strncmp(PHP_OS, 'Linux', 5)) 

    { 

        ini_set('session.entropy_file', '/dev/urandom'); 

        ini_set('session.entropy_length', 20); 

    } 

    

    // 실제로 세션을 시작 

    session_set_cookie_params($lifetime, $path, $domain, $secure, $httponly); 

    session_start(); 

    

    // HTTPS인 경우 보안쿠키 체크 

    if (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off') 

    { 

        // 보안쿠키를 처음 발급하는 경우 

        if (!isset($_SESSION['SSLSESSID'])) 

        { 

            $_SESSION['SSLSESSID'] = sha1(pack('V*', rand(), rand(), rand(), mt_rand(), mt_rand())); 

            setcookie('SSLSESSID', $_SESSION['SSLSESSID'], $lifetime, $path, $domain, true, true); 

            if (isset($_COOKIE[session_name()])) session_regenerate_id(); 

        } 

        // 보안쿠키를 발급했는데 제대로 돌아오지 않은 경우 공격자로 간주함 

        elseif (!isset($_COOKIE['SSLSESSID']) || $_COOKIE['SSLSESSID'] !== $_SESSION['SSLSESSID']) 

        { 

            $_SESSION = array(); 

            $sp = session_get_cookie_params(); 

            setcookie(session_name(), '', time() - 86400, $sp['path'], $sp['domain'], $sp['secure'], $sp['httponly']); 

            setcookie('SSLSESSID', '', time() - 86400, $sp['path'], $sp['domain'], true, true); 

            session_destroy(); 

        } 

        // 보안쿠키가 정상적으로 되돌아온 경우는 별도의 처리 불필요 

    } 

    

    // 세션을 발급한 지 3분이 경과하면 자동으로 쿠키값을 변경해줌 

    if (isset($_SESSION['AUTOREFRESH'])) 

    { 

        if ($_SESSION['AUTOREFRESH'] < time() - 180) 

        { 

            $_SESSION['AUTOREFRESH'] = time(); 

            session_regenerate_id(); 

        } 

    } 

    else 

    { 

        $_SESSION['AUTOREFRESH'] = time(); 

    } 


------------------------------------------------------------------------------------------------------- 


10. 소스가 너무 길어지지 않도록 하기 위해 몇 가지를 간단하게 처리하고 넘어갔는데, 

    실제로 쓰실 때는 아래의 두 군데를 적당히 고쳐쓰셔도 됩니다. 

    

    - 로드밸런싱, CDN 등을 사용할 경우 $_SERVER['HTTPS']가 정확하지 않을 수 있음 

    - 보안쿠키 발급시 난수생성 알고리듬을 더욱 강력한 것으로 변경 

      참고: http://www.phpschool.com/link/tipntech/79087 


11. 물론 최고의 해결책은 웹사이트 전체에 https를 적용하고 

    HTTP Strict Transport Security (HSTS) 헤더를 사용하여 

    아예 브라우저들이 http 사이트로는 접속 시도조차 하지 않도록 만드는 것입니다.

서버스캔 (Snooping) 막기 스크립트 (.htaccess ip deny)

서버스캔 (Snooping) 막기 스크립트 (.htaccess ip deny)



http://kb.site5.com/security/how-to-automatically-block-someone-who-is-snooping-around-your-site/ 

.htaccess 에서, 임의로 서버스캔해가는 놈들 감지되면, block.php 으로 보내고, 


http://kb.site5.com/security/how-to-automatically-block-someone-using-a-php-script/ 

이 스크립트에서, .htaccess 에, 아이피 deny 하는거에요. 



별건 아닌데, 아주 유용하게 쓰일수 있습니다. 


보통 해커들이 스캔 프로그램 임의로 돌리면 , 500 에러서부터, 실제로 뚫리기도 하고요. 


작은 작업으로 큰 효과를 볼수 있는.... 


미국 호스팅 회사인데, 잘 정리해놓은듯 해서 올려봅니다.

서버운영_웹 재요청 방지 및 트래픽 감소를 위한 방법

서버운영_웹 재요청 방지 및 트래픽 감소를 위한 방법


from cache 

서버에 요청자체를 하지 않는다. 

가장 효과가 좋다.(요청 자체가 없으므로) 

최초 한번 데이터를 가져오면, 그 후로는 웹 브라우저의 캐시에서 데이터를 가져온다. 

즉, 서버와의 통신이 없어진다. 

하지만 F5를 누를 경우 새로 데이터가 전송된다.(HTTP Code 200 발생) 

관련 응답 해더 및 PHP 적용법 ($g는 캐시 기간(초)) 

header('Cache-Control:public, max-age='.$g); // HTTP/1.1 

지정 초 이전까지는 재요청하지 않도록 권장함 (새로 고침에서는 무시됨) 

header("Expires: ".gmdate("D, d M Y H:i:s", time()+$g)." GMT"); //캐시 

지정 시간까지는 재요청 하지 않도록 권장함 (새로 고침에서는 무시됨) 

apache의 경우 mod_expires 적용 



304 Not Modified 

요청은 하지만, 트래픽이 아주 적게 발생된다.(해더 전송 정도만 발생) 

F5로 새로 요청해도 Etag나 Last-Modified의 조건에 맞으면 HTTP Code는 304가 발생된다.(실제 데이터 전송은 없음) 

(ctrl+F5의 경우 etag와 Last-Modified 가 없이 요청되므로 새로 가져온다.) 

관련 응답 해더 및 PHP적용법 

header("Etag: ".$etag_key); //etag 

파일의 수정내역을 Etag로 만들어서 출력한다. 

클라이언트가 같은 Etag로 요청하면, 304코드를 알려준다. 

아파치의 경우 FileETag 부분 참고 

파일 수정 시간을 사용할 경우 문제가 될 수 있다. 

서버를 여러대 사용할 경우 서버 간의 파일의 시간 차가 발생될 수 있기 때문이다. 

여러서버를 묶어쓰는(L4에 연결 해서) 경우 사용안하는게 좋다 

PHP에서 처리할 경우 요청에서 HTTP_IF_NONE_MATCH 관련 처리가 필요 

header('Last-Modified: '.gmdate("D, d M Y H:i:s", time()+$g)." GMT"); 

지정 시간까지는 파일이 수정되지 않는다는 것을 나타낸다. 

즉, 그 시간에 재요청해봤자 304 코드가 반환된다. 

apache의 경우 mod_expires 적용 

PHP에서 처리할 경우 요청에서 HTTP_IF_MODIFIED_SINCE 관련 처리가 필요


관련 링크 : http://www.mins01.com/home/board/board.php?type=read&b_id=tech&page=1&b_idx=903&t=1414993105

JENNIFER UI 차트 소개 (1.2 버전 릴리즈)


JENNIFER UI 라이브러리가 약 6개월 만에 정식 릴리즈를 하게 되었습니다. 이번 버전에서는 차트 라인업이 추가되었고, 아이콘 컴포넌트가 기존의 이미지 스프라이트 방식에서 벡터 타입의 폰트 아이콘으로 변경되었습니다.
 
차트는 SVG 기반으로 구현되었으며, 배경이 되는 5종의 그리드와 데이터를 표현할 수 있는 26종의 브러쉬 그리고 인터랙션을 담당하는 6종의 위젯으로 구성되어 있습니다. 또한 기존의 차트를 사용하여 구현한 래핑 컴포넌트로써 리얼타임 데이터를 보여주기 위한 컴포넌트도 제공합니다.
 
앞으로는 좀 더 다양한 종류의 브러쉬를 제공할 예정이며, 이 중에는 3D 브러쉬도 포함되어 있습니다. 그리고 커스텀 브러쉬를 구현할 수 있는 가이드 문서와 차트 구성에 대한 아키텍처 문서를 공개할 예정입니다.
 
관련해서 자세항 사항은 아래 링크를 참조하시면 됩니다.


메뉴얼 - http://seogi1004.github.io/jui
릴리즈 노트 - https://github.com/seogi1004/jui/releases


Link1 http://seogi1004.github.io/jui

Link2 https://github.com/seogi1004/jui/releases




윈도우에서 APM 설치하기

윈도우에서 APM 설치하기


윈도우에서 로컬에서 php를 개발하기 위한 세팅인 APM설치해보겠습니다.
APM 다운받는 곳
MySQL : http://mysql.org
PHP : http://php.net
Apache server : http://httpd.apache.org/
각각 자료실에서 쉽게 다운로드 하실수 있습니다.
MySQL 설치
MySQL은 아무 최신버전을 설치하면 됩니다. MySQL5버전을 설치할경우 설치중간에 root 비밀번호를 입력해주면
됩니다.
다음 중요한것은 php와 apache 설치인데요... 최신 apache2.2가 아직까지 php최신버전을 지원하지 않는 문제
로 인해 이 둘의 설치를 잘 해줘야 합니다.
여기서는 다음의 php와 apache버전을 설치합니다.
php5.1.6
Apache2.0.59
물론 정확히 위 버전대로 설치 안해도 되지만 만약 따라하시다가 설치가 제대로 안되시면 정확히 위 버전으로 설
치하시면 설치가 잘 될겁니다. MySQL은 아무 버전이나 상관없습니다.
PHP 설치
다운받은 PHP 5.1.6 의 압축을 C:\php 폴더에 풀어줍니다. php는 압축을 풀어준것만으로 설치가 다 됩니다.
- php 폴더의 php.ini-dist 파일의 이름을 php.ini로 변경한다.
- php.ini 파일을 C:\WINDOWS 폴더에 복사한다.
- php5ts.dll 파일을 C:\WINDOWS\system32 폴더에 복사한다.
- php 폴더의 libmysql.dll 파일을 C:\WINDOW\system32 디렉토리에 복사한다. (mysql설정)
이제 PHP가 제대로 돌아가도록 php.ini 파일의 설정 부분을 수정해야 한다. 메모장과 같은 편집기를 이용하여
php.ini 파일을 연뒤 extension_dir 부분을 찾아 디렉터리를 'c:\php\ext\로 바꾼다. MySQL의 사용과 관련된
설정인 ;extension=php_mysql.dll 부분을 찾아 앞의 주석 표시(;)를 지우고
'extension=php_mysql.dll' 로 바꾼다.
Apache 설치
apache_2.0.59-win32-x86-no_ssl을 다운받습니다. 이 파일을 더블클릭하여 설치를 시작합니다.
설치 중간에 Network Domain을 localhost 로 설정하고 Typical로 설치합니다.
Change 를 클릭하여 설치폴더를 C:\apache 로 변경합니다. install을 합니다.
이제 httpd.conf 파일의 환경설정이 남았습니다.
Apache가 설치된 폴더(C:\apache\Apache2\conf)를 찾아서 conf 폴더 내에 있는 httpd.conf 파
일을 엽니다. 메모장으로 열어도 되고 다른 에디터에서 열어도 됩니다.
httpd.con 파일의 최하단에 아래의 소스를 추가하고 저장하된 됩니다.
-------------------------------------------------------------------------
LoadModule php5_module "C:\php\php5apache2.dll"
AddType application/x-httpd-php .phtml .html .htm .inc .php .php3
AddType application/x-httpd-php-source .phps
Action application/x-httpd-php "/php/php.exe"
AddDefaultCharset euc-kr
-------------------------------------------------------
httpd.conf 파일의 환경설정이 끝났다면 반드시 Apache를 재실행시켜야 합니다. Apache를 재 실행하지 않으면
PHP가 실행되지 않습니다.
이제 C:\apache\Apache2\htdocs 폴더내에 파일을 저장하면 그 파일을 웹 브라우저에서 볼 수 있는 것입니
다. 메모장이나 에디터를 열어 아래와 같이 작성하고 C:\apache\Apache2\htdocs 폴더 내에 test.php로 저장
합니다.
-------------------------------------------------------------------------
<?
echo "<center><b>PHP 작동과 버전</b><p> ";
phpinfo();
?>
-------------------------------------------------------------------------
브라우저를 열고 주소 창에 http://localhost/test.php 라고 입력하고 이동하면 php 화면이 뜨면 설치가 성공한겁
니다.
참고 : test.php 파일을 htdocs 폴더에 저장하고 웹 브라우저를 실행하여 주소에 127.0.0.1/text.php 라고 하면
test.php 파일이 출력된다. 그런데 htdocs 폴더를 사요하기 싫고 다른 폴더를 설정하고 싶다면 httpd.conf 파일의
228라인의 DocumentRoot 값을 수정하면 된다.
이때 반드시 지정할 디렉터리가 생성되어 있어야 한다.

인터넷 에러코드 해독 모음

인터넷 에러코드 해독 모음 



100 : Continue(계속) 
101 : Switching protocols (통신규약 전환) 
200 : OK, 에러없이 전송 성공 
201 : Created, POST 명령 실행 및 성공 
202 : Accepted, 서버가 클라이언트 명령을 받음 
203 : Non-authoritative information, 서버가 클라이언트 요구중 일부만 전송 
204 : No content, 클라언트 요구을 처리했으나 전송할 데이터가 없음 
205 : Reset content (내용 원위치) 
206 : Partial content (부분내용) 
300 : Multiple choices, 최근에 옮겨진 데이터를 요청 
301 : Moved permanently, 요구한 데이터를 변경된 임시 URL에서 찾았음 
302 : Moved temporarily, 요구한 데이터가 변경된 URL에 있음을 명시 
303 : See other, 요구한 데이터를 변경하지 않았기 때문에 문제가 있음 
304 : Not modified (수정안됨) 
305 : Use proxy (프록시 사용) 
400 : Bad request, 클라이언트의 잘못된 요청으로 처리할 수 없음 
401 : Unauthorized, 클라이언트의 인증 실패 
402 : Payment required, 예약됨 
403 : Forbidden, 접근이 거부된 문서를 요청함 
404 : Not found, 문서를 찾을 수 없음 (특히 이게 많죠.) 
405 : Method not allowed, 리소스를 허용안함 
406 : Not acceptable, 허용할 수 없음 
407 : Proxy authentication required, 프록시 인증 필요 
408 : Request timeout, 요청시간이 지남 
409 : Conflict (충돌) 
410 : Gone, 영구적으로 사용할 수 없음 
411 : Length required (필요조건 너무 김) 
412 : Precondition failed, 전체조건 실패 
413 : Request entity too large, (본건 요구사항 너무 큼) 
414 : Request-URI too long, URL이 너무 김 
415 : Unsupported media type (인증 안된 미디어 유형) 
500 : Internal server error, 내부서버 오류(잘못된 스크립트 실행시) 
501 : Not implemented, 클라이언트에서 서버가 수행할 수 없는 행동을 요구함 
502 : Bad gateway, 서버의 과부하 상태 
503 : Service unavailable, 외부 서비스가 죽었거나 현재 멈춤 상태 
504 : Gateway timeout (접속장치 설정시간지남 
505 : HTTP version not supported (http 버전 지원않됨) 





php 중복 로그인 방지

php 중복 로그인 방지


몇년전 중복로그인 방지를 해야하는일이 있어 만들었던 소스입니다. 정확히는 A-pc에서 로그인했을때 B-pc에서 로그인이 되지 않는게 아니라, A-pc에서 로그인했을때 B-pc에서 로그인하면 2군데 모두 세션이 없어지고 로그아웃 처리되는 개념입니다. 스쿨에 괴수분들이 많아서 팁아닌 팁 올리는게 부끄럽네요;




 

<?php
/**

CREATE TABLE `avoid_duplication` (
  `idx`         int(11)         NOT NULL AUTO_INCREMENT,
  `mem_idx`     int(11)         DEFAULT NULL, # 회원의 index
  `sess_id`     varchar(100)    DEFAULT NULL, # 세션아이디 (회원의 아이디 아님.)
  `wrt_date`    int(11)         DEFAULT NULL, # 등록일 time()
  `ip`          varchar(255)    DEFAULT NULL, # 아이피.
  PRIMARY KEY (`idx`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

 
 
CREATE TABLE `member_block` (
  `mb_idx`          int(11)         NOT NULL AUTO_INCREMENT,
  `mem_idx`         int(11)         DEFAULT NULL, # 회원의 index
  `mem_wrt_date`    int(11)         DEFAULT NULL, # 차단된 날짜 time()
  `mb_code`         varchar(255)    DEFAULT NULL, # 차단해제 신청시 인증번호 체크
  PRIMARY KEY (`mb_idx`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
 
$sess_uidx : 회원의 index를 세션값으로..
 * */
Class AvoidDuplication extends DB
{
    var $TBL = "avoid_duplication";
    
    function __construct()
    {
        $this->ezSQL_mysql(
            DBUSER,
            DBPW,
            DBNAME,
            DBHOST
        );
    }

    function bloackChk($sess_uidx)
    {
        
        $sql = "select count(*) as cnt from member_block where mem_idx = '{$sess_uidx}'";
        $cnt = $this->get_row($sql)->cnt;
        if ($cnt!=0)
        {
            //alert("중복로그인으로 인해 블럭처리된 아이디입니다.\\n관리자에게 문의주시거나, \'중복로그인해지신청\'을 해주세요.");
			//location.href = 'logout.php';
        }
    }

    function processing()
    {
        global $sess_uidx;
        $nowTime    = time();
        $IP         = $_SERVER["REMOTE_ADDR"];
        
        $this->bloackChk($sess_uidx);
        
        $sql = "SELECT * FROM {$this->TBL} WHERE mem_idx = '{$sess_uidx}'";
        $row = $this->get_row($sql);
        
        $resTime    = $nowTime - $row->wrt_date;
        $time       = 60*10;
        
        if ($sess_uidx)
        {
            if ($row->mem_idx=="")
            {
                $sql = "INSERT INTO {$this->TBL} (mem_idx, ip, wrt_date) VALUES ('{$sess_uidx}','{$IP}','{$nowTime}')";
                $this->query($sql);
            }
            else
            {
                if ($row->ip!=$IP)
                {
                    if ($resTime < $time+1)
                    {
                        // 블럭처리
                        $sql ="INSERT INTO member_block (mem_idx, mem_wrt_date) VALUES ('{$sess_uidx}','$nowTime')";
                        $this->query($sql);
                    }
                    else
                    {
                        $sql = "UPDATE {$this->TBL} SET wrt_date = '{$nowTime}',ip = '{$IP}' WHERE mem_idx = '{$sess_uidx}'";
                        $this->query($sql);
                    }
                }
                else
                {
                    // do noting
                }
            }
        }
        else
        {
            // do noting
        }
    }

    function processingStop()
    {
        global $sess_uidx;
        $sql = "delete from {$this->TBL} where mem_idx = '{$sess_uidx}'";
        $this->query($sql);
        
    }
    
    // 인증번호 생성하여 발송하고 '차단'테이블에 인증번호 입력.
    function duplication($mem_id,$mem_pw,$mem_ssn1,$mem_ssn2,$mem_mail1,$mem_mail2)
    {
        global $sess_uidx;
        $sql = "
        SELECT *, count(*) AS cnt FROM member WHERE
        mem_id = '$mem_id' AND
        mem_pw = '$mem_pw' AND
        mem_ssn1 = '$mem_ssn1' AND
        mem_ssn2 = '$mem_ssn2' AND
        mem_mail1 = '$mem_mail1' AND
        mem_mail2 = '$mem_mail2' 
        ";
        $row = $this->get_row($sql);
        if ($row->cnt!=0)
        {
            $key = rand(0,9999);
            $sql = "UPDATE member_block SET mb_code = '$key' WHERE mem_idx = '$row->mem_idx'";
            $res = $this->query($sql);
            
            if ($res)
            {
                // 이곳에서 인증번호를 메일이나 문자로 발송. 인증번호는 $key 변수.
                echo true;
            }
        }
    }

    // 차단 해제.
    function duplicationDel($mem_id, $mb_code)
    {
        global $sess_uidx;
        $sql = "SELECT * FROM member WHERE mem_id = '{$mem_id}'";
        $row = $this->get_row($sql);
        $row->mem_idx;
        
        $sql = "SELECT count(*) AS cnt FROM member_block WHERE mem_idx = '$row->mem_idx'
        AND mb_code = '$mb_code'";
        $cnt = $this->get_row($sql)->cnt;
        
        if ($cnt!=0)
        {
            $sql = "DELETE FROM member_block WHERE mem_idx = '$row->mem_idx'
            AND mb_code = '$mb_code'";
            $res = $this->query($sql);
            echo true;
        }
        else {
            echo false;
        }
    }
}

$aDupli = new AvoidDuplication();
$aDupli->processing();

// 사용시
//$aDupli->bloackChk($sess_idx);
?>







[스크립트] jQuery 기반 숫자관련 플러그인.

- removeText: 숫자제외 텍스트 제거. 

- numberFormat: 3자리 마다 콤마 표시. 

- onlyNumber: 위의 모든 기능 포함. 


소스와 예제는 파일첨부하였습니다.

archive.zip



===========================================

http://www.phpschool.com/link/tipntech/64665 

음수와 소수점까지 어느정도 처리하는 버전.