2015. 3. 20. 11:25

최근 홈페이지의 보안도 이슈가 되고 있는데요.

취약점을 찾고 해킹을 하기 위해 SQL Injection이나 XSS등의 공격을 하기도 합니다.

이에 대응하는 공개된 많은 자료들이 있으며 잘 알려진 공개 보드에도 적용이 되어있습니다.

 

또한 인터넷침해대응센터에서는 홈페이지 보안 강화도구 캐슬을 무료로 배포하고 있습니다.

 

 

 

다운로드를 클릭하면 새 팝업이 뜨면서 이메일을 입력해 달라고 합니다.

이메일을 입력하면 해당 소스와 매뉴얼이 첨부파일로 도착합니다.

 

지원해주는 언어는 다음과 같습니다.

1. PHP

2. ASP

3. ASP.net

4. JSP

5. SPRING Framework

 

 

설치 방법은 의외로 간단합니다.

 

1.압축을 풀고 서버에 맞는 소스를 찾아서 FTP로 전송

2. 해당 폴더 및 하위 폴더의 권한을 707로 변경

3. 브라우저에서 해당폴더에 접근(어드민 설정등 install이 시작)

4. 로그인 후 설정을 필요에 맞게 수정

5. 홈페이지 소스에서 공통적으로 불러오는 코드에 캐슬 관련 코드 삽입(2줄)

 

 

다운로드를 바로 연결하지 않고 메일로 보내주기 때문에

어떤 이유가 있는것인지 몰라서

실제 설치한 화면과 메뉴얼등의 이미지와 코드등은 첨부하지 않았습니다.

 

 

2015-03-23 추가

* 적용한 사이트에서 문제가 좀 발생하였습니다.

POST등으로 넘어온 변수의 값이 날라가는 현상이 보여지네요

좀 더 확인한 후 포스팅하겠습니다.

 

** 추가 2

소스가 제작된지 좀 오래되어서 preg_replace와 같은 deprecate된 함수들이 있어서 알림문구등이 발생!!

Posted by 작은0악마
2015. 3. 17. 10:30

프로젝트를 진행하다보면 소스에 대한 버전관리를 할 필요가 있습니다.

여러가지 버전관리툴을 이용하는 방법도 있을것이며

소스를 통째로 압축해서 별도로 보관할 수도 있을것입니다.

 

저는 요즘 버전관리툴로서 인기를 끌고있는 GIT에 대해 관심을 가지게 되었습니다.

그래서 책을 사기는 했지만 무엇인가를 손에 들고 다니는 것을 싫어하다 보니 읽지 않게되네요...ㅡㅡ;

 

그래서 검색을 해보았습니다.

출판된 책을 홈페이지에 그대로 올려놓은 사이트를 찾았습니다.

 

git eBook 바로 가기 (1st Edition)

 

1st Edition은 별도의 다운로드는 없습니다.

그러나 모든 페이지가 한글을 지원합니다.

 

 

 

 

git eBook 바로가기 (2nd Edition)

 

2nd Edition은 다양한 형태의 다운로드를 지원합니다.

그리고 한글화가 되어 있지만 일부 페이지는 아직도 한글이 지원되지 않고 있습니다.

한글화가 진행중인것으로 보입니다.

 

 

 

다운로드는 위 이미지와 같이 4가지 형태로 지원합니다.

 

만약 GIT에 대해 공부를 하고 싶으시다면 위 사이트에서 어느정도 공부하신 후

책을 구매하시면 좋을것 같습니다.

Posted by 작은0악마
2015. 3. 13. 10:46

오랜만에 글을 쓰네요...

이번에 안드로이드 롤리팝으로 업데이트 후 생긴 문제점에 대해 쓰겠습니다.

 

지난 1월말경에 구입을 하였고 1달 넘게 쓰다가 이달(3월)초에 롤리팝으로 업데이트를 하였습니다.

그런데 업데이트 후 하루에 3번에서 많을때는 6~7번까지 아무 이유없이 생기는 메시지가 있습니다.

 

 

 

위 이미지는 폰을 캡쳐한 것입니다.

 

이미지에서 보이는 것처럼 연락처 앱이 종료된것도 아니고....

연락처 앱을 중지하였습니다??

 

폰을 가만히 두고 있다가 전화를 걸기위해 홈버튼을 눌렀을 뿐인데

위와 같은 메시지가 나오네요...

 

한두번도 아니고 하루에 몇번씩 위 메시지를 보게되니 솔직히 짜증이 납니다.

 

2일전인 3월 11일에 혹시나 추가 업데이트가 있나 확인을 위해 kies3로 연결을 해보니

업데이트가 없네요... 아마도 모든 폰에서 나오는 현상은 아닌가 봅니다.

 

혹시나 업데이트를 고려하시는 분이 계시다면 좀더 안정화된 버젼이 나올때까지 기다렸다가

업데이트를 하시길 권하고 싶습니다.

Posted by 작은0악마
2015. 2. 25. 16:50

요즘 반응형 웹들이 많이 나오고 있습니다만 여러가지 상황에 따라서

반응형이 아닌 별도의 모바일 웹을 만들어서 사용하기도 합니다.

이럴때 홈페이지에 접근한 장비가 모바일장비인지 아닌지를 확인할 필요가 있는데요.

괜찮은 오픈소스가 있어서 소개를 해드리겠습니다.

 

Mobile Detect 라는 오픈소스입니다.

라이선스는 MIT 라이선스입니다.

 

 

 

파일을 다운받아서 압축을 풀게되면 4개의 폴더와 파일들이 있습니다.

그중 Mobile_Detect.php 파일만 있어도 됩니다.

 

해당 홈페이지에 보시면 많은 기능들이 있습니다만

제가 필요했던 기능에 대해서만 잠깐 살펴보겠습니다.

(코드는 Syntax Highlighter가 적용되어 모바일에서는 안보일 수 있습니다.)

 

// Include and instantiate the class.
require_once 'Mobile_Detect.php';
$detect = new Mobile_Detect;

// 모바일 장비 확인 (폰과 테블릿 모두)
if ( $detect->isMobile() ) {
 //필요한 기능 코딩
}

// 테블릿 장비인지 확인
if( $detect->isTablet() ){
 //필요한 기능 코딩
}

// 모바일 장비중 테블릿을 제외
if( $detect->isMobile() && !$detect->isTablet() ){
 //필요한 기능 코딩
}

// Check for a specific platform with the help of the magic methods:
// 장비의 OS가 iOS(아이폰)인지 확인
if( $detect->isiOS() ){
 //필요한 기능 코딩
}

//장비의 OS가 안드로이드인지 확인
if( $detect->isAndroidOS() ){
 //필요한 기능 코딩
}

 

사용법이 쉬워서 더 설명이 필요없을것 같네요 ^^;

 

위와 같이 모바일을 체크했다면 보통은 모바일 웹 페이지로 redirect를 시켜주는데요.

이때 자바스크립트의 location.href를 사용해도 되지만

meta 태그를 이용하시는 것도 좋을것 같습니다.

<meta http-equiv='refresh' content='0; url=모바일 페이지 주소'></meta>

 

 

Posted by 작은0악마
2015. 2. 24. 11:26

얼마전 갤럭시 노트4를 구입하였습니다.

초기에 세팅을 마치고 DMB를 실행시키니 신호를 전혀 잡지 못하더군요.

그래서 폰을 살펴보니 안테나가 없습니다. ㅡㅡ;

 

검색을 해보니 노트4에는 안테나가 없고 이어폰을 연결해야 한다고 하더군요.

이어폰을 연결해 보니 신호가 잘 잡힙니다.

 

처음엔 불편하게 느껴졌습니다.

 

그러나

지하철이나 버스에서 DMB를 마치 자기집 안방인 것 처럼 소리를 크게해놓고 보는

기본 매너도 없는 사람들을 종종 봅니다.

 

이어폰을 연결해야만 DMB가 동작한다면

이러한 사람들을 줄어들지 않을까 하는 생각을 하니

이어폰을 활용하는 방법이 더 좋은것 같습니다.

 

 

이어폰은 제조사랑은 상관이 없는것 같습니다.

저는 말리 이어폰을 사용하는데 이 이어폰을 사용해도 신호가 잘 잡힙니다.

Posted by 작은0악마
2015. 2. 16. 17:01

그전에는 아래와 같은 메시지를 거의 못봤으나 최근 들어 종종 보게되네요.

"error 145 (hy000) table 'DB명/Table명' is marked as crashed and should be repaired"

이는 특정 테이블이 깨졌다는 것입니다.

 

해당 상황을 격었을때 마다 매번 검색해서 처리하다 보니 시간적 손해가 심하더군요. ㅜㅜ

그래서 이번 포스팅은 매번 찾는 시간을 줄이고자 "메모"차원에 서 남깁니다.

 

1. check table Table명;
2. analyze table Table명;
3. repair table Table명;

 

지금까지는 2, 3번만 사용했었기 때문에 1번은 확인하지 않았습니다.

 

자세한 사항은 아래 참고 사이트를 방문해 보시면 자세히 설명되어 있습니다.

( 제목에 링크 걸어놨습니다. ^^; )

 

[참고]

1. jeongppappa님의 [CentOS_MySQL_trouble] './<DB_name>/<TABLE_name>' is marked as crashed and should be repaired

2. NaNNa님의 [MySQL Error]Table 'problem_table' is marked as crashed and should be repaired.

 

* NaNNa님의 블로그에는 위 1~3번 항목으로 시도했을 때도 실패했을때 "myisamchk.exe" 파일을 이용하는 방법까지

설명되어 있습니다. (myisamchk -r problem_table; )

 

 

Posted by 작은0악마
2015. 2. 12. 17:16

mysqldump나 phpMyAdmin에서 DB를 다운받으면 자료가 많을 경우 파일의 크기가 무척 큰 경우가 있습니다.

제 경우는 약 900메가가 넘었는데요. 이렇게 파일의 크기가 크면 일반적인 텍스트 에디터로는 읽을 수가 없습니다.

그래서 PHP로 해당 파일을 처리하는 코드를 작성하였습니다.

 

1. 아래 코드는 dump받은 sql파일에서 테이블을 생성하는 코드만 남기고

데이터를 INSERT하는 부분을 제거하여 다른 파일로 저장하는 코드입니다.

(코드는 Syntax Highlighter가 적용되어 모바일에서는 안보일 수 있습니다.)

 

$fileName_ori = "bigdata.sql";
$handle_ori = fopen($fileName_ori, "r");//읽기 모드로 파일 열기

$fileName_target = "tables.sql";
$handle_target = fopen($fileName_target, "w");//쓰기 모드로 파일 열기

while( !feof($handle_ori) ) {
 $buffer = fgets($handle_ori, 4096);
 //echo $buffer;
		
 if(strpos($buffer, "INSERT INTO") === false)
  fwrite($handle_target, $buffer);											
}

fclose($handle_ori);//파일닫기
fclose($handle_target);//파일닫기

 

2. 다음 코드는 테이블을 생성하는 코드와 데이터를 INSERT하는 코드를 모두 포함하지만

다른 텍스트 에디터로 읽을 수 있도록 파일을 나누는 코드입니다.

(코드는 Syntax Highlighter가 적용되어 모바일에서는 안보일 수 있습니다.)

 

$fileName_ori = "bigdata.sql";
$handle_ori = fopen($fileName_ori, "r");//읽기 모드로 파일 열기

$file_num = 1;
$line_limit = 1000; //각 파일에 저장할 line 수

$fileName_target = "slice_".$file_num.".sql";
$handle_target = fopen($fileName_target, "w");//쓰기 모드로 파일 열기

$i = 1;
while( !feof($handle_ori) ) {
 $buffer = fgets($handle_ori, 4096);
 //echo $buffer;
 fwrite($handle_target, $buffer);
		
 if($i >= $line_limit){
  fclose($handle_target);//파일닫기
  $file_num++;
  $i = 0;
  $fileName_target = "slice_".$file_num.".txt";
  $handle_target = fopen($fileName_target, "w"); //쓰기 모드로 파일 열기
 }
 $i++;		
}

fclose($handle_ori);//파일닫기
fclose($handle_target);//파일닫기

 

쓰기 모드로 파일을 열때 인수를 "w"로 주었기 때문에

실행시 같은 이름의 파일이 있을 경우 그 파일의 이전 내용은 사라집니다.

 

만약 한줄의 길이가 매우 길다면 fgets()함수에서 4096의 값을 더 늘려주시면 됩니다.

 

문자열 encoding에 대해서는 고려하지 않았습니다.

읽는 파일과 저장할 파일의 문자셋을 확인하여

저장전에 iconv() 함수를 사용하셔서 처리하시면 됩니다.

 

위 두 코드는 원본 sql 파일의 크기에 따라서 실행시간이 매우 길기 때문에

브라우저에서 호출하시면 time out에 걸릴(?) 수 있습니다.

따라서 콘솔에서 실행하시는것을 권합니다.

 

또한 해당 폴더에 쓰기 권한이 없으면 권한을 주어야 합니다.

 

 

Posted by 작은0악마
2015. 2. 11. 11:08

개발을 하다보면 DB를 변경해야 할 경우가 생길 수 도 있으며

DB 서버를 이전해야 하는 경우도 생깁니다.

이때 데이터를 이전해야 합니다.

이럴때 사용할 수 있는 쿼리를 알려드리겠습니다.

 

mysql의 경우 phpMyAdmin을 사용하여 sql파일로 받을 수도 있습니다만

이번에 포스팅하는 내용은 프로그램으로 이전하는 기능을 작성할때

사용하는 쿼리입니다.

직접 작업하고 테스트한 mysql과 sqlite에 대해서만 다루겠습니다.

다른 DB에 관해서는 mkyojung님의 작성하신 "오라클, MySQL, MS-SQL 테이블 / 컬럼 정보 조회"를 참고하세요.

 

1. 테이블 정보 가져오기

  1.1 mysql  - 2가지 쿼리 중 하나를 사용하시면 됩니다.

    1.1.1 "SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'DB 이름'";

           * 대신 'TABLE_NAME' 등 필드명 사용도 가능합니다.

    1.1.2 "SHOW TABLES FROM DB 이름";

 

  1.2 sqlite

"SELECT * FROM sqlite_master WHERE type='table'";

"SELECT name FROM sqlite_master WHERE type='table'"; //필드명을 지정

*sqlite의 경우 사용자가 만든 테이블 외에도 시스템상의 테이블까지 반환하므로 where절에 "name like '%aa%'"등과 같이

조건을 사용하시면 수월하실 것입니다.

 

2. 테이블의 필드정보 가져오기

  2.1 mysql - 2가지 쿼리 중 하나를 사용하시면 됩니다.

    2.1.1 "SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = '테이블 이름'";

    2.1.2 "SHOW FIELDS FROM 테이블 이름";

 

  2.2 sqlite

     "PRAGMA TABLE_INFO (테이블 이름);

 

위와 같이 사용하시면 됩니다.

 

참고로 sqlite에 insert를 하다보면 데이터가 많을때 시간이 너무 오래걸립니다.

이럴때는 아래 두 코드를 이용하시면 속도가 많이 빨라진 것을 느끼실 수 있습니다.

단, 데이터에 문제가 생길 수 도 있습니다.

"PRAGMA cache_size=6000";
"PRAGMA synchronous=OFF";

 

 

 

   

 

'Mysql' 카테고리의 다른 글

mysql 테이블이 깨졌을때  (0) 2015.02.16
mysql과 sqlite를 사용할때 주의할 점  (0) 2015.02.10
insert 시 VALUE 와 VALUES ??  (0) 2014.10.13
Posted by 작은0악마
2015. 2. 10. 17:31

웹개발을 하다보면 DB를 사용하게 됩니다.

일반적으로 PHP의 경우에는 mysql을 가장 많이 사용하죠...

최근에 sqlite와 mysql을 사용하다가 알게된 주의할 점을 알려드리겠습니다.

 

물론 차이점은 이번엔 포스팅하는 것외에도 많이 있습니다만

작업을 하면서 체험한것 4가지만 포스팅하겠습니다.

 

1. 테이블 비우기

테이블을 완전히 비우고 auto increment값 까지 초기화를 하려고 합니다.

 

mysql : "TRUNCATE TABLE 테이블명" 을 사용합니다.

 

그러나 sqlite는 위 쿼리가 동작하지 않습니다.

sqlite에서 관련기능을 찾아본 결과는 저는 다음의 2가지 방법을 찾았습니다.

1.1 "DELETE FROM 테이블명"
     "VACUUM"

     위 2개의 쿼리를 순차적으로 실행합니다.

1.2 "DELETE FROM 테이블명";
     "DELETE FROM sqlite_sequence WHERE name='테이블명'";

     역시 위 두개의 쿼리를 순차적으로 진행합니다.

 

 

2. AUTOINCREMENT (자동증가)

테이블 생성 시 키필드등에 자동으로 값이 증가하게 만들때 사용합니다.

그러나 두 DB는 스펠링이 다릅니다.

mysql : AUTO_INCREMENT

sqlite : AUTOINCREMENT

이 부분에서 sqlite에 "AUTO_INCREMENT" 키를 넣어 보지는 않았습니다.

 

 

3. '\'와 같은 특수 문자 처리

DB에 값을 입력할때 '\'와 같은 특수 문자를 입력하려 할때 두 DB가 차이점을 보입니다.

mysql에서는 특별한 처리를 해줍니다.

일반적으로 addslashes()와 같은 함수를 이용하여 '\'문자가 '\\'로 변환하여 입력합니다.

 

그러나 sqlite는 그 값을 그대로 받아들입니다. mysql처럼 addslashes()함수를 사용하면

DB에 '\'가 아닌 '\\'값 그대로 입력되게 됩니다.

 

 

4. 테이블 생성시 default 값 설정

테이블을 생성할때 필드에 초기값을 지정할 수 있습니다.

이때 사용하는 Default키에 대해 비교하겠습니다.

 

이번엔 sqlite 부터 설명드리겠습니다.

sqlite에서는 "txtDesc TEXT DEFAULT 'aaa' NOT NULL" 등과 같이

TEXT 타입의 필드에 기본값을 지정할 수 있습니다.

 

그러나 mysql에서는 위 문구는 오류를 발생합니다.

확인해보면 mysql에서는 BLOB, TEXT 타입의 필드에는 기본값을 지정할 수 없다고 나옵니다.

 

먼저 이야기했던것 처럼 두 DB는 더 많은 차이가 있습니다.

이번에 포스팅 하고자 했던 것은 코딩을 할 때

자주 사용하는 부분에서 직접 겪은 차이점만 거론한것입니다. ^^

 

Posted by 작은0악마
2015. 2. 5. 13:45

이번엔 배열을 다룰때 중간에 추가하는 방법을 다루겠습니다.

이 방법에는 배열과 관련한 2개의 함수를 사용합니다.

각 함수는 array_slice()array_merge()함수입니다.

 

아래 코드를 보시겠습니다.

(코드는 Syntax Highlighter가 적용되어 모바일에서는 안보일 수 있습니다.)

 

$arr = array("aaa", "bbb", "ccc", "ddd","eee", "fff");
print_r($arr);

 

위 코드를 실행하면 결과는 다음과 같습니다.

"Array ( [0] => aaa [1] => bbb [2] => ccc [3] => ddd [4] => eee [5] => fff )"

 

이제 코드를 수정해 보겠습니다.

(코드는 Syntax Highlighter가 적용되어 모바일에서는 안보일 수 있습니다.)

 

$arr = array("aaa", "bbb", "ccc", "ddd","eee", "fff");
$add = "jjj";

function insert_array($arr, $idx, $add){		
 $arr_front = array_slice($arr, 0, $idx); //처음부터 해당 인덱스까지 자름
 $arr_end = array_slice($arr, $idx); //해당인덱스 부터 마지막까지 자름
 $arr_front[] = $add;//새 값 추가
 return array_merge($arr_front, $arr_end);
}
$arr = insert_array($arr, 2, $add);
print_r($arr);

 

위 코드를 실행해보면 다음과 같은 결과가 나옵니다.

"Array ( [0] => aaa [1] => bbb [2] => jjj [3] => ccc [4] => ddd [5] => eee [6] => fff )"

 

insert_array()함수를 호출할 때 삽입할 idx를 2를 제시했기 때문에 해당 인덱스에 추가된 것을 보실 수 있습니다.

 

여기서 한가지 덧붙이자면...

지난번 포스팅한 "PHP에서 배열에 값이 포함되어 있는지 여부와 해당 인덱스 가져오기" 와 혼용하여

특정 인덱스 다음에 추가를 하고자 하실때는 insert_array()함수를 호출할때 가져온 인덱스 + 1을 하시면 됩니다.

Posted by 작은0악마