아니 이런길도 있었나? ㅋㅋ

카테고리 없음 2007. 3. 2. 01:51

사용자 삽입 이미지

길을 걷다 우연히 눈에 띤 표지판.... ^^;


^ㅡ^*

훌쩍 떠나고 싶을 땐... 역시 경춘선이 쵝오 !!

카테고리 없음 2007. 3. 2. 01:46
사용자 삽입 이미지

기차 여행...


사용자 삽입 이미지

사용자 삽입 이미지

시간 참 빠른걸...



어느새 작년이 되버린... 겨울 어느날 in 경춘선

오늘의~~ 일기~~ ㅠ.ㅠ

카테고리 없음 2007. 1. 25. 16:29



아래는 형이 내게 보낸 증거사진이다;;;

Cross Browser DHTML Modal Dialogs For Web Apps

WEB STUDY 2007. 1. 20. 09:49

웹페이지를 만들 때 많이 쓰이면서도 지탄의 대상이 되는것이 있습니다. 바로 페이지를 접근 할 때 마다 뜨는 팝업창들이죠.

팝업창을 사이트에 꼭 필요한 부분에만 적절히 사용한다면 그것만큼 사이트의 주체가 방문자에게 무엇인가를 알릴 수 있는 좋은 방법은 없을 겁니다. 그런점을 악용해 광고나 이벤트성 팝업을 난발하는 사이트가 많아 진게 사실입니다.

오늘 소개할 내용은 Modal Dialogs 에 대한 내용입니다. 모달창은 팝업창과 비슷하지만 약간 다른 형태를 가지게 되죠. 창이 떠 있으면 부모창의 어떤 것도 제어가 안되는 그런 말이죠. 그런 모달 다이얼로그는 IE 브라우저에서 제공되는 기능중에 하나죠. 하지만 요즘처럼 IE 이외에 타 브라우저가 많아진 상태에서 기존 IE 호환 다이얼 로그로 작성된 페이지에서는 오동작을 하게 되니 문제가 생깁니다. ^^

그런 문제를 개선해서 만들어진게 subModal 이라고 불리는 것이구요. 서브모달의 개발자는 자신도 IE의 모달창을 좋아해서 쭉 써오다 크로스 브라우저 환경에서 동작을 하지 않아 subModal 을 만들게 됐다고 하네요 ^^;
(짧은 영어 실력이라 제대로 읽었는지 하하하~)

실제 사용법과 활용법은 원본글의 일부를 발췌 했습니다. 실제 써 보면 참 유용하게
많이 쓰일 수 있을것 같던군요. 물론 팝업창을 대체 하는것은 아니고 모달창이니
나름 쓰이는 용도가좀 다르겠지만. ^^;;

우선 한번 빠져~ 봅시다! ^^

How does it work?

The subModal works by placing a semi-transparent div over the browser, blocking access to the content below while still providing visibility. This maintains state and doesn’t make someone feel disoriented or lost by moving them completely to another page. Their frame of reference is kept while allowing them to perform a new task (usually closely associated with the content below).

Another div is layered and centered on top of the mask. This div contains an iframe which defaults to a “now loading” page. In my applications I usually place an animated gif inside of this page to make it appear the server is doing something while the user waits.

Finally the iframe’s source is swapped with the page you wish to display. When this page is loaded into the iframe it’s title is swapped with our fake title bar and displayed.

Note that this works best when used in concert with a scrollable div underneath. All of my apps make use of this layout technique. It’s rare that the browser window scrolls. This code supports scrolling the entire browser window, but I don’t recommend it.

Where does it work?

I’ve personally tested this technique with IE 6, FireFox 0.9+, and Opera 7. A good friend of mine tested it on Safari and also reports it works there. In theory it should work with IE 5.5, but I don’t have a 5.5 machine to test on currently.

UPDATE

Opera 7 works but with a hack. Since Opera’s css support doesn’t include opacity I’m using a 24 bit transparent PNG file for the demo. If you don’t care about Opera you can comment this out and it will still work in FireFox, IE, and Safari. I like that method better since you have full control over the mask color and opacity right from the CSS file.

View a demo

How do I use it?

First you might want to download the code. After that it’s as easy as including references to a couple files and inserting some HTML into your page.

At the head of your file you’ll want to add the following references…

<head>
    <link rel="stylesheet" type="text/css" href="subModal.css" />
    <script type="text/javascript" src="common.js"></script>
    <script type="text/javascript" src="subModal.js"></script>
</head>

The css contains sizing and display styles for the popup elements.

Common.js contains standard functions I find useful such as attaching event handlers and obtaining the browser’s dimensions.

subModal.js is where all the action happens. Inside event handlers are attached for the load and resize events of the browser. The load event initializes dhtml objects that are reused when showing, hiding, or resizing the window.

The following HTML also needs to be included in your file. I generally do it at the bottom of the page.

This code could be generated dynamically by the javascript, but for now I like it in HTML.

<div id="popupContainer">
  <div id="popupInner">
    <div id="popupTitleBar">
      <div id="popupTitle"></div>
      <div id="popupControls">
        <img src="close.gif" onclick="hidePopWin(false);" />
      </div>
    </div>
    <iframe src="loading.html" 
      style="width:100%;height:100%;background-color:transparent;" 
      scrolling="auto" frameborder="0" 
      allowtransparency="true" id="popupFrame" 
      name="popupFrame" width="100%" height="100%">
    </iframe>
  </div>
</div>

Now that everything’s in place all you have to do is add something that’s going to call the function to show the modal.

This is accomplished by doing the following

showPopWin('your_url_here.html', width, height, callback_function);

The first argument is the file to load, followed by width and height (integers). Any content that overflows these dimensions will scroll inside the modal, like a real window.

The fourth argument allows you to pass a javascript function that will be called when the window is closed – by calling hidePopWin(true). hidePopWin will not call the return function by default. This is useful for cancel button functions.

Conclusion

I’ve sort of glossed over the the DHTML, so if you have questions check out the code or ask me a question on the google group. In real-world implementations I usually wrap everything inside of a div that throws a shadow over the transparent mask, which adds to the floating effect.

I’m sure some of you are already thinking about how you can put this to use and modify it. Go right ahead! Please just drop me a line if you use it.

I hope it’s as useful to you as it is to me.

Bonus round, the callback function

Updated on 1/11/07

I’ve added a quick write-up about how to use the subModal callback function here.

출처 : http://sublog.subimage.com/articles/2006/01/01/subModal

황우석의 진실

카테고리 없음 2007. 1. 17. 23:22
네이버 붐에 황우석 박사에 관련한 비공개 동영상이 있어 봤습니다.

정말 진실이 무엇인지는 모르겠지만...

지들끼리 서로 치고 박고 싸우느라 남한테 다 뺐기는 꼬라지를 볼 때...

무엇이 진실인지는... 크게 중요하지 않을까 싶군요.

이미 결론은... 진실 너머에 있으니까요

http://boom.naver.com/SubSectionMain.nhn?iFrame=BoardRead&categoryId=1&articleNum=20070116194618307

Design Guidelines, Managed code and the .NET Framework By Brad Abrams

WEB STUDY 2007. 1. 16. 21:06

MS 내부에서 사용하는 .NET 코딩 가이드 라인이라고 하네요. ^^
평소에 깔끔한 스타일로 코딩을 즐겨 하시는 분들은 참고하세요 ~



Internal Coding Guidelines


Table of Contents

1. Introduction.......................................................................................................................................... 1

2. Style Guidelines.................................................................................................................................... 2

2.1 Tabs & Indenting................................................................................................................................ 2

2.2 Bracing............................................................................................................................................... 2

2.3 Commenting........................................................................................................................................ 2

2.3.1 Documentation Comments............................................................................................................. 2

2.3.2 Comment Style............................................................................................................................. 3

2.4 Spacing............................................................................................................................................... 3

2.5 Naming............................................................................................................................................... 4

2.6 Naming Conventions............................................................................................................................ 4

2.6.1 Interop Classes............................................................................................................................. 4

2.7 File Organization................................................................................................................................. 5

 

1. Introduction

First, read the .NET Framework Design Guidelines. Almost all naming conventions, casing rules, etc., are spelled out in this document. Unlike the Design Guidelines document, you should treat this document as a set of suggested guidelines.  These generally do not effect the customer view so they are not required.   

2. Style Guidelines

2.1 Tabs & Indenting

Tab characters (\0x09) should not be used in code. All indentation should be done with 4 space characters.

2.2 Bracing

Open braces should always be at the beginning of the line after the statement that begins the block. Contents of the brace should be indented by 4 spaces. For example:

if (someExpression)
{
   DoSomething();
}
else
{
   DoSomethingElse();
}

“case” statements should be indented from the switch statement like this:

switch (someExpression)
{

   case 0:
      DoSomething();
      break;

   case 1:
      DoSomethingElse();
      break;

   case 2:
      {
         int n = 1;
         DoAnotherThing(n);
      }
      break;
}

Braces should never be considered optional. Even for single statement blocks, you should always use braces. This increases code readability and maintainability.

for (int i=0; i<100; i++) { DoSomething(i); }

2.3 Single line statements

Single line statements can have braces that begin and end on the same line.

public class Foo
{
   int bar;

   public int Bar
   {
      get { return bar; }
      set { bar = value; }
   }

}

It is suggested that all control structures (if, while, for, etc.) use braces, but it is not required.

2.4 Commenting

Comments should be used to describe intention, algorithmic overview, and/or logical flow.  It would be ideal, if from reading the comments alone, someone other than the author could understand a function’s intended behavior and general operation. While there are no minimum comment requirements and certainly some very small routines need no commenting at all, it is hoped that most routines will have comments reflecting the programmer’s intent and approach.

2.4.1 Copyright notice

Each file should start with a copyright notice. To avoid errors in doc comment builds, you don’t want to use triple-slash doc comments, but using XML makes the comments easy to replace in the future. Final text will vary by product (you should contact legal for the exact text), but should be similar to:

//-----------------------------------------------------------------------
// <copyright file="ContainerControl.cs" company="Microsoft">
//     Copyright (c) Microsoft Corporation.  All rights reserved.
// </copyright>
//-----------------------------------------------------------------------

2.4.2 Documentation Comments

All methods should use XML doc comments. For internal dev comments, the <devdoc> tag should be used.

public class Foo
{

/// <summary>Public stuff about the method</summary>
/// <param name=”bar”>What a neat parameter!</param>
/// <devdoc>Cool internal stuff!</devdoc>
///
public void MyMethod(int bar) { … }

}

However, it is common that you would want to move the XML documentation to an external file – for that, use the <include> tag.

public class Foo
{

   /// <include file='doc\Foo.uex' path='docs/doc[@for="Foo.MyMethod"]/*' />
   ///
   public void MyMethod(int bar) { … }

}

UNDONE§ there is a big doc with all the comment tags we should be using… where is that?

2.4.3 Comment Style

The // (two slashes) style of comment tags should be used in most situations. Where ever possible, place comments above the code instead of beside it.  Here are some examples:

// This is required for WebClient to work through the proxy
GlobalProxySelection.Select = new WebProxy("http://itgproxy");

// Create object to access Internet resources
//
WebClient myClient = new WebClient();

Comments can be placed at the end of a line when space allows:

public class SomethingUseful
{
    private int          itemHash;            // instance member
    private static bool  hasDoneSomething;    // static member
}

2.5 Spacing

Spaces improve readability by decreasing code density. Here are some guidelines for the use of space characters within code:

  • Do use a single space after a comma between function arguments.
    Right:          Console.In.Read(myChar, 0, 1);
    Wrong:       Console.In.Read(myChar,0,1); 
  • Do not use a space after the parenthesis and function arguments
    Right:          CreateFoo(myChar, 0, 1)
    Wrong:       CreateFoo( myChar, 0, 1 )
  • Do not use spaces between a function name and parenthesis.
    Right:          CreateFoo()
    Wrong:       CreateFoo ()
  • Do not use spaces inside brackets.
    Right:    x = dataArray[index];
    Wrong:       x = dataArray[ index ];
  • Do use a single space before flow control statements
    Right:          while (x == y)
    Wrong:       while(x==y)
  • Do use a single space before and after comparison operators
    Right:          if (x == y)
    Wrong:       if (x==y)

2.6 Naming

Follow all .NET Framework Design Guidelines for both internal and external members. Highlights of these include:

  • Do not use Hungarian notation
  • Do not use a prefix for member variables (_, m_, s_, etc.). If you want to distinguish between local and member variables you should use “this.” in C# and “Me.” in VB.NET.
  • Do use camelCasing for member variables
  • Do use camelCasing for parameters
  • Do use camelCasing for local variables
  • Do use PascalCasing for function, property, event, and class names
  • Do prefix interfaces names with “I”
  • Do not prefix enums, classes, or delegates with any letter

The reasons to extend the public rules (no Hungarian, no prefix for member variables, etc.) is to produce a consistent source code appearance. In addition a goal is to have clean readable source. Code legibility should be a primary goal.

2.7 Naming Conventions

2.7.1 Interop Classes

Classes that are there for interop wrappers (DllImport statements) should follow the naming convention below:

  • NativeMethods – No suppress unmanaged code attribute, these are methods that can be used anywhere because a stack walk will be performed.
  • UnsafeNativeMethods – Has suppress unmanaged code attribute. These methods are potentially dangerous and any caller of these methods must do a full security review to ensure that the usage is safe and protected as no stack walk will be performed.
  • SafeNativeMethods – Has suppress unmanaged code attribute. These methods are safe and can be used fairly safely and the caller isn’t needed to do full security reviews even though no stack walk will be performed.

class NativeMethods
{
   private NativeMethods() {}


   [DllImport(“user32”)]
   internal static extern void FormatHardDrive(string driveName);
}

[SuppressUnmanagedCode]
class UnsafeNativeMethods
{
   private UnsafeNativeMethods() {}

   [DllImport(“user32”)]
   internal static extern void CreateFile(string fileName);
}

[SuppressUnmanagedCode]
class SafeNativeMethods
{
   private SafeNativeMethods() {}

   [DllImport(“user32”)]
   internal static extern void MessageBox(string text);
}

All interop classes must be private, and all methods must be internal. In addition a private constructor should be provided to prevent instantiation.

2.8 File Organization

  • Source files should contain only one public type, although multiple internal classes are allowed
  • Source files should be given the name of the public class in the file
  • Directory names should follow the namespace for the class

For example, I would expect to find the public class “System.Windows.Forms.Control” in “System\Windows\Forms\Control.cs”…

  • Classes member should be alphabetized, and grouped into sections (Fields, Constructors, Properties, Events, Methods, Private interface implementations, Nested types)
  • Using statements should be inside the namespace declaration.

namespace MyNamespace
{

using System;

public class MyClass : IFoo
{

      // fields
      int foo;

      // constructors
      public MyClass() { … }

      // properties
      public int Foo { get { … } set { … } }

      // events
      public event EventHandler FooChanged { add { … } remove { … } }

      // methods
      void DoSomething() { … }
      void FindSomethind() { … }

//private interface implementations
   void IFoo.DoSomething() { DoSomething(); }

// nested types
   class NestedType { … }

}

}

출처 : http://blogs.msdn.com/brada/articles/361363.aspx

애플의 차세대 휴대폰 iPhone !!

카테고리 없음 2007. 1. 11. 21:14
012345678910111213


얼마전 애플이 휴대폰 사업에 뛰어 든다는 소식을 접한적이 있습니다.

그동안 휴대용 기기 사업에 조금씩 시도했던 애플이 이번에도 강력한 무기를 들고

나타난듯 싶습니다.

딱 본 순간.. 아!.. 이거다 싶을 정도로 애플스럽습니다. ㅋ

애플 아이폰은 기존 3개 제품의 컨버전스된 기기로 모바일폰, 터치 컨트롤 기능이

가능한 ipod 그리고 무선 인터넷 장치가 내장되어 있다는 점입니다.

또한 닌텐도의 Wii 와 같은 모션센서가 내장되어 있어 흔들리거나 할때는 화면을

차단시켜 전원을 절약하고 터치 기능의 오동작을 막을 수 있다고 합니다. ㅋ

후.. 아 기능이 너무 많아 탐이 나는군요 ㅎㅎ

iphone 한국에서도 서비스 될지는 모르겠지만 ( 과연... ㅋ )

기존 휴대폰 업체들에게 상큼한(?) 자극이 되지 않을까 싶습니다. ^^

2007년 ANTI-VIRUS SOFRWARE REVIEW

카테고리 없음 2007. 1. 7. 10:53

여러분들은 어떤 백신을 쓰시는지요? ^^
새해도 됐고해서 컴퓨터 정리중 백신이 업데이트가 안되길래 새 백신을 구해볼까
하고 검색을 해 봤습니다. 아래 내용은 약간 어색하지만 저처럼 영어와 친하지 않으신분들을 위해 구글에서 검색하여 번역을 돌린 상태입니다.

우선 백신의 순위를 보면 아래와 같습니다. 각 제품마다 장단점이 있지만 검색률이
높은 백신일 수록 컴퓨터의 자원(CPU, 메모리 점유율) 사용률이 높습니다.
이점을 유념하시어 본인에게 맞는 백신을 찾아 보시면 좋을것 같습니다.
검색률 좋은 외국산 백신중에서 무료로 제공되는 백신도 있으니 참고하세요 ^^

#4
#5
#6
#7
#8
#9
#10
#11
#12
#13
#14
#15
#16
#17
NA
NA
NA


sitename Review - A Review of the top sitename product


당신의 컴퓨터를 자신을 가지고 보호하십시오


오늘 컴퓨터 바이러스는 그 어느때로 보다도 더 정교하다 호전적이다. 감사하게, 항 바이러스 소프트웨어와 더불어, 당신은 자부하 당신의 자료 안전한 및 감염의 자유로운 당신의 컴퓨터를 완전하게 유지할 수 있다.

항 바이러스 소프트웨어에 관하여 더 많은 것을 배우기 위하여는, 여기에서 누르십시오.

사용자 삽입 이미지

사용자 삽입 이미지

사용자 삽입 이미지

사용자 삽입 이미지

항 바이러스 소프트웨어는 어떻게 나의 자료를 안전한 유지할 수 있는가?

그것은 열심히 매일에 컴퓨터 바이러스가 제기한 위험에서 당신의 자료를 보호하기 위하여 되고 있다. 이 악의 있는 프로그램은 다수 모양으로 진전하고 다양한 방법을 통해, 개통 전자 우편 부착을 포함하여 계약될 수 있어, 스팸에 또는 방문 부정한 웹사이트에 의해 누른.

다만 바이러스가 힘과 복합성에서 수년에 걸쳐 성장하기 때문에, 다행히 이렇게 또한 공구를 그들을 싸우는 것을 사용하십시오. 항 바이러스 소프트웨어의 최신 발생과, 당신은 가능한의 앞에 당신의 컴퓨터에게 보호의 수준을 결코 줄 수 있지 않는다.

오늘 제일 항 바이러스 소프트웨어는 다수 바이러스 검사로 피해를 주어 좋을 전에 와, 검사를 허용해, 당신에게 그들을 바이러스 멈추기를 위한 당신의 컴퓨터를 몇분마다 검사하는 순간 스캐닝 조차 준 미리 계획하는 것을, 및 다양한 위치 특정한 검사에 접근을 당신이.

그리고, 새로운 바이러스가 창조하기 매일이고 있기 때문에, 가장 효과적인 항바이러스 프로그램은 편리한 바이러스 갱신을 제안한다. 몇몇 소프트웨어 제안 자동 갱신 조차, 새로운 바이러스에 정보를 당신에게 보호의 최고-수준 항상 제공하는 제조자와 일정하게 그리고 자동으로 후에 검사한다.

원문 보기 : http://anti-virus-software-review.toptenreviews.com/
그러나, 명백하게, 오늘 항 바이러스 소프트웨어가 그것의 소비자에게 가져오는 가장 귀중한 것은 보통, 좋 오래되 유행 마음의 평화 이다.

이 위치에서는, 당신은 당신이 항바이러스 프로그램이 당신을 위해 맞은 정보통 결정을 내릴 것을 도울 컴퓨터 바이러스 화제, 보도 기사 및 포괄적인 항 바이러스 소프트웨어 검토기사를 찾아낼 것이다. TopTenREVIEWS에서 - 우리는 연구를 한다 그래서 당신은 한다. ™


항 바이러스 소프트웨어에서 찾을 것이다 무엇

최고 항 바이러스 소프트웨어는 사용과 임명에 둘 다 컴퓨터 초보자를 위해 충분히 쉬워야 한다. 소프트웨어는 청결한 격리된 것에 의하여 감염된 파일 뿐 아니라 효과적으로 바이러스 위협을, 찾아내고 확인해야 한다. 유효한 도움 지원의 각 검사 그리고 많음을 위해 유효한 이해할 수 있는 보고가 이어야 한다, 그래서 당신은 소프트웨어의 활동 및 기능의 박식할 수 있다. 아래에는 항 바이러스 소프트웨어를 평가하는 이용된 표준 TopTenREVIEWS가 있다.

사용 용이 - 특별하은 항 바이러스 소프트웨어는 사람의 바이러스의 컴퓨터 경험 또는 지식에 관계 없이, 사용해 쉽다.
바이러스와 벌레 확인에 효과적인 - 제일 항 바이러스 제품은 등등 찾아봐 근원, 전자 우편을 포함하여, 즉시 메시지 신청, 웹의 군중에 있는 바이러스를 찾는 순간 스캐닝을 통해 감염한 파일을 빨리 확인한다.
청소 또는 감염된 파일을 고립시키기에 효과적인 - 정말 가능한 항 바이러스 소프트웨어는 철저하게, 감소 청소해거나 감염해 격리해에서 하드드라이브 또는 네트워크를 통하여 그들을 퍼지기 파일 지킨.
활동 보고 - 감염하는으로 한 무엇을 찾아낸 그리고 신청하는 무슨을을 포함하여 순간 스캐너에 의해 찾아낸 바이러스의 즉시 통보를 주고 제공하면 검사 결과의 읽기 쉬운 보고를, 항바이러스 프로그램은.
특징은 놓았다 - 다방면 특징 세트는 항 바이러스 소프트웨어가 절대 보호해주는 것을 허용한다. 제일 프로그램은 바이러스 보호에 올 막 기본적인 순간 스캐닝에서 더 진보된, 발견적인 스캐닝원본 제안하는 그들이다, 선택권에 더 다양한 공구를, 더 나은 것.
임명과 체제의 용이함 - 항바이러스 프로그램은 설치할 것이다 산들바람 이어야 해, 임명에서 쥐의 다만 한 쌍 누르기에 있는 검사를 가조인하기 위하여 간 것을 쉬운 한.
도움 문서 - 상한 항 바이러스 소프트웨어는 전자 우편을 통해 지원을 포함하여 도움, 온라인 잡담 또는 정상의 많음으로 전화 온다. 또한 빠르고 편리한 도움을 위해 유효한 지식 기준과 FAQs와 같은 온라인 자원이 이어야 한다.                         

심각한 컴퓨터 바이러스가 또는 빠르게 오늘 항 바이러스 소프트웨어와 더불어의 주위에, 통과되는지 얼마나 이어서 어떻게 할지라도 이렇게, 당신은 항상 치료가 있을 것이다.

우리의 최상위 항 바이러스 소프트웨어 검토를 읽기 위하여는, 여기에서 누르십시오.

NHN UI Library를 아시나요?

카테고리 없음 2007. 1. 4. 13:53


저는 친 네이버 성향을 가진 사람중에 하나랍니다. ^^

예전 네이버가 검색서비스를 시작할 때부터 네이버를 쓰기 시작해서 메일도
 
블로그도 카페도... 네이버가 서비스 하는 스타일이 좋아서 라죠 ^^

그 중에 가장 맘에 드는건 역시! 깔끔한 스타일의 디자인이랍니다.

단순하면서도 깔끔하고 꼭 필요한 요소들을 엮어 내는 노하우가

저를 네이버에게 반하게 만든거 같습니다.

그런 요소들의 대한 노하우를 네이버에서 공개했습니다.

좀 지난얘기지만 생각 난 김에 한번 올려 봅니다. ㅋㅋ


Welcome to the NHN UI Library

본 사이트는 Naver그리고 Hangame서비스 웹페이지 UI개발시 참고 해야할 내용들을 담고 있습니다.

이 사이트는 2005.3월 사내 전용으로 오픈하여 현재까지 계속적인 업데이트를 진행하고 있으며
NHN사내 내부 프로젝트 프론트 개발작업시 참고해야
하는 내부규약을 정리하고 배포하는 목적의 사이트 입니다.

2006.6월 같은 직군의 실무자들에게 관련 내용들을
공유하고자 외부에서도 볼수 있도록 오픈하였고,
2006.11.9 일날 Wordpress를 통한 블로깅을 시작했습니다.

NHN의 웹서비스의 품질을 책임지는 저희 UII팀 그리고
국내 웹사이트들의 품질향상에 "일조" 하겠다는
다짐을 가득 채운 모든 프론트개발 관련 분들 화이팅입니다!
Newest Report of UI Library
  • 업무관련 일본용어들을 정리했습니다.Reference, 2006-11-24
    NHN Japan 과 업무협조시 언어소통의 도움을 위해 자주쓰이는 UIT 업무관련 용어를 정리합니다.
  • 메인 페이지 사이트 소개글 수정하였습니다.Page, 2006-11-17
    오픈 목적과 History등 내/외부 분들이 궁금해 하시길 바라며 ^^;; 소개해 봤습니다.
  • 한게임 유지보수시 이미지 운용에 관한 부분들을 정리하였습니다. Image, 2006-11-17
    이미지명이 바뀌어야한다는 룰또한 전체 공유가 되지 않고 들쑥날쑥하게 개발쪽으로 전달된다는 의견이 있어서 업무상에 필요한 부분들을 개발자와 디자이너와 제가 짧은 회의 통해서 아래와 같이 정리하였습니다.
  • UII팀 블로그를 시작합니다 Blog, 2006-11-07
    저희 UII팀에서 블로깅을 시작하게 되었습니다. 블로깅의 주 목적은 저희 팀에서 HTML/CSS적인 측면들을 사내 그리고 외부에 관심있는 분들과 공유하고자 함 입니다.
  • 자바스크립트 샘플 모음페이지 추가 Javascript, 2006-09-19
    좌측 메뉴에 자바스크립트 예시란을 추가하였습니다. NHN UII팀에서 제작사용중인 스크립트들을 사내 작업자 분들 그리고 그외에 필요한 모든분들과 공유하고자 합니다. 조만간 피드백창구? 를 마련하여 여러분들과 커뮤니케이션 하길 기대하고 있습니다 :)
Newest Pattern's Template
[NAVER] 통검 우측 "실시간 검색어" box 템플릿 네이버 통합검색 결과 화면중 우측 "실시간 검색어"
박스 유형과 "연관검색어" 유형을 템플릿화 한것으로
컨텐츠 내용에 따라 height가 유동적으로 변경되야 한다.
[공통] 게시판 하단 페이징 리스트 기본적인 게시판 페이징 리스트로써
onclick이벤트없이 클릭포인트를 넓게 처리해야 하고
마우스 오버시 클릭포인트영역에 background컬러를
반전 시켜야 한다.
모든 동작은 js없이 처리되야 한다.

SQL 주입 공격(Injection Attack)을 사전에 차단하는 방법

일상속으로 Go~Go! 2007. 1. 4. 02:11
데이터 보안

SQL 주입 공격을 사전에 차단하는 방법



문서의 주제:
  • SQL 주입 공격(Injection Attack)의 작동 방식
  • 취약점 점검 테스트
  • 사용자 입력 확인
  • 공격 차단을 위한 .NET 기능 활용
  • 예외 처리의 중요성
본 문서에서 활용된 기술:
ASP.NET, C#, SQL


코드 다운로드:
SQLInjection.exe (153KB)

ASP.NET과 같은 고급 서버측 기술과 Microsoft SQL Server와 같은 강력한 데이터베이스 서버를 갖춤으로써 개발자들은 너무나 쉽게 동적 데이터 중심 웹 사이트를 만들 수 있게 되었습니다. 그러나 ASP.NET과 SQL의 위력은 SQL 주입 공격과 같은 너무나 흔한 부류의 공격을 감행하는 수단으로 해커에 의해 쉽게 활용될 수 있습니다. SQL 주입 공격의 기본 발상은 다음과 같습니다. 입력란에 사용자가 텍스트를 입력하면 이를 사용하여 데이터베이스에 대해 쿼리를 실행하도록 구성된 웹 페이지가 있습니다. 그런데 해커가 백 엔드 데이터베이스에 침입하거나 내용을 변경 또는 손상시키는 데 사용될 수 있도록 쿼리의 특성을 바꿔 놓는 잘못된 SQL 문을 이 입력란에 입력합니다. 어떻게 이러한 일이 가능할까요? 한 가지 예를 들어 설명하도록 하겠습니다.


정상적인 SQL의 변질

많은 ASP.NET 응용 프로그램들이 그림 1과 같은 폼을 사용하여 사용자를 인증합니다. 사용자가 BadLogin.aspx의 Login 단추를 클릭하면 cmdLogin_Click 메서드는 이 사용자가 폼의 입력란 컨트롤에 입력한 값과 UserName 및 Password가 일치하는 Users 테이블의 레코드 수를 계산하는 쿼리를 실행하여 사용자 인증을 시도합니다.

이 폼은 대부분의 경우 정확히 의도대로 작동합니다. 사용자가 Users 테이블의 레코드와 일치하는 사용자 이름 및 암호를 입력하면 동적으로 생성된 SQL 쿼리가 사용되어 일치하는 행의 수를 검색합니다. 그러면 이 사용자는 인증되어 요청한 페이지로 리디렉션됩니다. 잘못된 사용자 이름 및/또는 암호를 입력한 사용자는 인증되지 않습니다. 그러나 여기서 해커가 다음과 같이 해가 없어 보이는 텍스트를 UserName 입력란에 입력하면 올바른 사용자 이름과 암호를 몰라도 시스템에 진입할 수 있습니다.

' Or 1=1 --
해커는 잘못된 SQL을 쿼리에 주입하여 시스템에 침입합니다. 이 해킹 수법이 통하는 이유는 실행된 쿼리가 아래처럼 사용자가 입력한 값과 고정 문자열의 연결에 의해 구성되기 때문입니다.
string strQry = "SELECT Count(*) FROM Users WHERE UserName='" +
    txtUser.Text + "' AND Password='" + txtPassword.Text + "'";
사용자가 올바른 사용자 이름과 암호인 "Paul"과 "password"를 입력하는 경우 strQry는 다음과 같습니다.
SELECT Count(*) FROM Users WHERE UserName='Paul' AND Password='password'
그러나 해커가 다음과 같이 입력하면
Or 1=1 --
쿼리는 다음과 같이 구성됩니다
SELECT Count(*) FROM Users WHERE UserName='' Or 1=1 --' AND Password=''

하이픈 쌍은 SQL에서 주석의 시작을 가리키므로 이 쿼리는 간단히 다음과 같이 됩니다.

SELECT Count(*) FROM Users WHERE UserName='' Or 1=1
식 1=1은 테이블의 모든 행에 대해 항상 true이므로 true 식이 다른 식과 or로 연결되면 항상 true를 반환합니다. 따라서 Users 테이블에 행이 최소한 하나 있다고 가정하면 언제나 이 SQL은 0이 아닌 레코드 수를 반환합니다

모든 SQL 주입 공격이 폼 인증과 관련되는 것은 아닙니다. 동적으로 구성된 SQL과 신뢰할 수 없는 사용자 입력이 있는 응용 프로그램만 있으면 됩니다. 조건이 적절할 경우, 그러한 공격이 어느 정도의 손상을 발생시키느냐는 해당 해커가 SQL 언어 및 데이터베이스 구성을 어느 정도 알고 있느냐에 달려 있습니다.

다음으로 BadProductList.aspx에서 발췌한 그림 2의 코드를 살펴보겠습니다. 이 페이지에는 Northwind 데이터베이스의 제품들이 표시되며 사용자가 txtFilter라는 입력란을 사용하여 제품 목록을 필터링할 수 있게 되어 있습니다. 앞의 예와 마찬가지로 이 페이지 역시 SQL 주입 공격의 대상이 되기에 충분합니다. 이는 실행된 SQL이 사용자가 입력한 값으로 동적으로 구성되기 때문입니다. 특히 이런 페이지는 그야말로 해커의 천국입니다. 영리한 해커라면 이를 사용하여 기밀 정보를 노출시키고, 데이터베이스의 데이터를 변경하며, 데이터베이스 레코드를 손상시키고, 새 데이터베이스 사용자 계정을 만들 수도 있기 때문입니다.

SQL Server를 비롯한 대부분의 SQL 호환 데이터베이스는 sysobjects, syscolumns, sysindexes 등의 이름을 가진 일련의 시스템 테이블에 메타데이터를 저장합니다. 이것은 해커가 시스템 테이블을 사용하여 데이터베이스의 스키마 정보를 확인함으로써 나중에 그 데이터베이스를 위험에 빠뜨리는 데 활용할 수 있다는 뜻입니다. 예를 들어 아래와 같은 텍스트를 txtFilter 입력란에 입력하면 데이터베이스에 있는 사용자 테이블의 이름을 노출하는 데 사용될 수 있습니다.

' UNION SELECT id, name, '', 0 FROM sysobjects WHERE xtype ='U' --

특히 UNION 문은 한 쿼리의 결과를 다른 것에 접합할 수 있게 한다는 점에서 해커에게 특히 유용합니다. 이 경우 해커는 데이터베이스에 있는 사용자 테이블의 이름을 Products 테이블의 원래 쿼리에 접합시켰습니다. 여기서 유일한 트릭은 해당 열의 수와 데이터 형식을 원래의 쿼리에 대응시키는 것입니다. 이전의 쿼리를 통해 이 데이터베이스에 Users라는 이름의 테이블이 있다는 것이 드러날 것입니다. 두 번째 쿼리에서는 Users 테이블의 열이 드러날 것입니다. 이 정보를 활용하여 해커는 txtFilter 입력란에 다음을 입력할 수 있습니다.

' UNION SELECT 0, UserName, Password, 0 FROM Users --
이 쿼리를 입력하면 그림 3에 나타나는 것처럼 Users 테이블에 있는 사용자 이름과 암호가 드러납니다.
Figure 3 Querying the Users Table
그림 3  Users 테이블에 대한 쿼리

SQL 주입 공격은 데이터를 변경하거나 데이터베이스를 손상시키는 데에도 사용될 수 있습니다. SQL 주입 해커는 txtFilter 입력란에 다음과 같이 입력하여 첫 번째 제품의 가격을 18달러에서 0.01달러로 변경한 후 다른 사람이 알기 전에 신속하게 해당 제품 몇 개를 구입할 수 있습니다.

'; UPDATE Products SET UnitPrice = 0.01 WHERE ProductId = 1--

이 해킹 방식이 통하는 이유는 SQL Server에서는 여러 SQL 문을 세미콜론이나 공백으로 구분하여 같은 문자열에 넣을 수 있기 때문입니다. 이 예에서 DataGrid는 아무 것도 표시하지 않지만 업데이트 쿼리는 성공적으로 실행됩니다. 이와 같은 기법을 사용하여 DROP TABLE 문을 실행하거나 시스템 저장 프로시저를 실행하여 새로운 사용자 계정을 만들고 그 사용자를 sysadmin 역할에 추가할 수도 있을 것입니다. 이러한 모든 해킹이 그림 2의 BadProductList.aspx 페이지를 사용하여 수행될 수 있는 것입니다.


동일한 해킹 위험성

SQL 주입 공격이 SQL Server에만 한정되지 않는다는 점을 인식하는 것이 중요합니다. Oracle, MySQL, DB2, Sybase 등을 비롯한 다른 데이터베이스들도 이러한 유형의 공격에 노출될 수 있습니다. SQL 주입 공격이 가능한 것은 SQL 언어에 포함되어 이를 아주 강력하고 유연하게 만들어주는 여러 기능들 때문입니다. 이러한 기능을 나열하면 다음과 같습니다.

  • 하이픈 쌍을 사용하여 SQL 문에 주석을 포함시킬 수 있는 기능
  • 여러 SQL 문을 같은 문자열에 묶어 이를 일괄 처리로 실행할 수 있는 기능
  • SQL을 사용하여 표준 시스템 테이블 집합로부터 메타데이터를 쿼리할 수 있는 기능

일반적으로 데이터베이스에서 지원하는 SQL 언어가 강력할수록 그 데이터베이스는 공격에 더 취약합니다. 따라서 SQL Server가 주입 공격의 대상으로 널리 사용되는 것은 놀라운 일이 아닙니다.

SQL 주입 공격은 ASP.NET 응용 프로그램에만 한정되는 것이 아닙니다. 고전적인 ASP, Java, JSP 및 PHP 응용 프로그램도 똑같이 위험합니다. 사실 SQL 주입 공격은 데스크톱 응용 프로그램에도 영향을 미칠 수 있습니다. 예를 들어 필자는 본 문서를 위한 다운로드 파일에 SQLInjectWinForm이라는 이름의 Windows Forms 응용 프로그램 샘플을 포함시켜 뒀는데 이것 역시 SQL 주입 공격에 노출될 수 있습니다.

SQL 주입 공격 차단에 사용할 수 있는 주요 수단 1~2가지를 쉽게 지적할 수 있겠으나, 이 문제에는 계층적인 접근 방식을 취하는 것이 최선입니다. 계층적인 방식을 취한다면 일부 취약점 때문에 차단 수단 중 하나가 무너지는 상황에서도 보호 체계는 유지될 수 있습니다. 그림 4에는 권장할 만한 계층적 수단들이 요약되어 있습니다.


모든 입력을 경계할 것

그림 4 에 제시된 첫 번째 원칙은 극히 중요합니다. 모든 입력을 경계하십시오! 확인되지 않은 사용자 입력을 데이터베이스 쿼리에 절대 사용해서는 안 됩니다. ASP.NET 유효성 검사 컨트롤, 특히 RegularExpressionValidator 컨트롤은 사용자 입력의 유효성을 검사하는 데 유용한 툴입니다.

유효성 검사에 대한 기본적인 접근 방식은 두 가지입니다. 문제성 있는 문자의 사용을 금지하거나 필요한 문자 일부만 허용하는 것입니다. 하이픈이나 작은따옴표와 같은 일부 문제성 있는 문자를 금지하는 것은 쉽지만 이 방식은 두 가지 이유에서 최적의 방식은 아닙니다. 첫째, 해커에게 유용한 문자를 하나라도 놓칠 수 있습니다. 둘째, 악성 문자를 표현하는 방식이 여러 가지인 경우가 많습니다. 예를 들어 해커가 작은따옴표를 이스케이프 처리하면 유효성 검사 코드가 이것을 놓쳐 이 이스케이프 처리된 작은따옴표를 데이터베이스로 그냥 보낼 수 있는데 데이터베이스에서는 이것을 일반적인 작은따옴표 문자와 똑같이 취급할 수 있습니다. 더 나은 방법은 허용 가능한 문자를 정해서 그 문자만 허용하는 방식입니다. 이 방식에는 더 많은 작업이 필요하지만 입력에 대해 훨씬 강한 제어가 확보되고 더 안전합니다. 이 가운데 어떤 방식을 취했든 입력의 길이 역시 제한하는 것이 좋습니다. 일부 해킹에서는 많은 수의 문자가 사용되기 때문입니다.

GoodLogin.aspx(역시 코드 다운로드에 포함됨)에는 각각 사용자 이름과 암호를 위한 두 개의 정규 표현식 검사기 컨트롤이 입력의 길이를 숫자, 알파벳 문자, 밑줄을 포함하여 4~12자로 제한하는 다음과 같은 ValidationExpression 값과 함께 포함되어 있습니다.

[\d_a-zA-Z]{4,12}

해를 일으킬 가능성이 있는 문자를 사용자가 입력란에 입력할 수 있도록 허용할 필요가 있을 수도 있습니다. 예를 들어 사람 이름의 일부로 작은따옴표(또는 아포스트로피)를 입력해야 할 수도 있습니다. 이러한 경우에는 작은따옴표의 각 인스턴스를 큰따옴표로 바꿔주는 정규 표현식 또는 String.Replace 메서드를 사용하여 작은따옴표가 해를 일으키지 않게 만들 수 있습니다. 예를 들면 다음과 같습니다.

string strSanitizedInput = strInput.Replace("'", "''");

동적 SQL 사용 금지

필자가 본 문서에서 설명한 SQL 주입 공격은 모두 동적 SQL, 즉 사용자가 입력한 값과 SQL을 연결하여 구성된 SQL 문의 실행에 의존하고 있습니다. 그러나 매개 변수화된 SQL을 사용하면 해커가 여러분의 코드에 SQL을 주입할 수 있는 여지가 크게 줄어듭니다.

그림 5 의 코드에서는 주입 공격을 차단하기 위해 매개 변수화된 SQL을 사용하고 있습니다. 여러분이 반드시 임의 SQL을 사용해야 한다면 매개 변수화된 SQL은 훌륭한 처방입니다. 여러분의 IT 부서에서 저장 프로시저를 신뢰하지 않는다거나 버전 5.0까지는 이를 지원하지 않았던 MySQL과 같은 제품을 사용한다면 이 방식이 필수적일 것입니다. 그러나 가능하다면 저장 프로시저를 채택하여 데이터베이스의 기본 테이블에 대한 모든 허용을 제거하는 기능을 추가함으로써 그림 3의 경우와 같은 쿼리를 만들 수 없도록 하는 것이 좋습니다. 그림 6의 BetterLogin.aspx에서는 저장 프로시저인 procVerifyUser를 사용하여 사용자를 확인하고 있습니다.


최소 권한 실행

BadLogin.aspx와 BadProductList.aspx에서 확인된 나쁜 방법 중 하나는 sa 계정을 사용하는 연결 문자열을 사용하는 것입니다. 아래는 Web.config에서 볼 수 있는 연결 문자열입니다.

<add key="cnxNWindBad"
value="server=localhost;uid=sa;pwd=;database=northwind;" />

이 계정은 시스템 관리자 역할을 수행하므로 글자 그대로 모든 작업(로그인 만들기 및 데이터베이스 삭제 등)을 수행할 수 있습니다. 따라서 응용 프로그램 데이터베이스 액세스에 sa(또는 높은 권한을 가진 계정)를 사용하는 것은 아주 좋지 않다라고만 말해 두겠습니다. 제한된 액세스 계정을 만들어 이를 대신 사용하는 것이 훨씬 좋습니다. GoodLogin.aspx에 사용된 계정은 다음과 같은 연결 문자열을 사용하고 있습니다.

<add key="cnxNWindGood"
value="server=localhost;uid=NWindReader;pwd=utbbeesozg4d;
database=northwind;" />

NWindReader 계정은 데이터베이스의 테이블을 읽는 것으로만 액세스가 제한된 db_datareader 역할로 실행되고 있습니다. BetterLogin.aspx는 저장 프로시저, 그리고 이 저장 프로시저를 실행할 수 있는 권한 외에는 이 테이블에 대해 어떤 권한도 갖고 있지 않은 WebLimitedUser라는 로그인을 사용함으로써 상황을 더욱 개선하고 있습니다.


암호는 안전하게 저장할 것

그림 3에 제시된 SQL 주입 공격은 Users 테이블로부터 사용자 이름과 암호를 노출시켰습니다. 이런 종류의 테이블은 폼 인증을 사용했을 때, 그리고 암호가 일반 텍스트로 저장되는 많은 응용 프로그램에서 흔히 사용됩니다. 더 나은 방법은 암호화되거나 해시된 암호를 데이터베이스에 저장하는 것입니다. 해시된 암호는 암호가 해독될 수 없으므로 암호화된 암호보다 더 안전합니다. 해시에 솔트(암호화 방식으로 보호되는 임의의 값)를 추가하면 해시된 암호를 더욱 견고하게 만들 수 있습니다. BestLogin.aspx에는 사용자가 입력한 암호를 SecureUsers 테이블에 저장된 암호의 솔트된 해시 버전과 비교하는 코드가 들어 있습니다(그림 7 참조). 해시 퍼즐의 나머지 조각은 AddSecureUser.aspx입니다. 이 페이지는 솔트된 해시된 암호를 생성하여 SecureUsers 테이블에 저장하는 데 사용될 수 있습니다

BestLogin.aspx 및 AddSecureUser.aspx는 모두 그림 8과 같이 SaltedHash 클래스 라이브러리의 코드를 사용합니다. Jeff Prosise가 만든 이 코드는 System.Web.Security 네임스페이스로부터 FormsAuthentication.HashPasswordForStoringInConfigFile 메서드를 사용하여 암호 해시를 만들고 System.Security.Cryptography 네임스페이스로부터 RNGCryptoServiceProvider.GetNonZeroBytes 메서드를 사용하여 임의의 16바이트 솔트 값을 생성합니다(이것은 Convert.ToBase64String을 사용하여 문자열로 변환하면 24자가 됩니다).

SQL 주입 공격과 직접적인 관계는 없지만, BestLogin.aspx에는 또 다른 보안 최적 방법으로서 연결 문자열의 암호화 방식이 제시되어 있습니다. BestLogin.aspx의 경우처럼 포함된 데이터베이스 계정 암호가 들어 있는 경우에는 연결 문자열의 보안이 특히 중요합니다. 데이터베이스에 연결하려면 연결 문자열의 암호가 해독된 버전이 필요하기 때문에 연결 문자열을 해시할 수 없습니다. 그 대신 이 문자열을 암호화해야 합니다. 아래는 Web.config에 저장되고 BestLogin.aspx에서 사용되는 암호화된 연결 문자열의 모습입니다.

<add key="cnxNWindBest"
value="AQAAANCMnd8BFdERjHoAwE/
Cl+sBAAAAcWMZ8XhPz0O8jHcS1539LAQAAAACAAAAAAADZgAAqAAAABAAAABdodw0YhWfcC6+
UjUUOiMwAAAAAASAAACgAAAAEAAAALPzjTRnAPt7/W8v38ikHL5IAAAAzctRyEcHxWkzxeqbq/
V9ogaSqS4UxvKC9zmrXUoJ9mwrNZ/
XZ9LgbfcDXIIAXm2DLRCGRHMtrZrp9yledz0n9kgP3b3s+
X8wFAAAANmLu0UfOJdTc4WjlQQgmZElY7Z8"
/>

BestLogin은 그림 9에 나와 있는 것과 같이 SecureConnection 클래스로부터 GetCnxString 메서드를 호출하여 cnxNWindBest AppSetting 값을 가져와 다음과 같은 코드로 그 암호를 해독합니다.

 string strCnx = SecureConnection.GetCnxString("cnxNWindBest");

그러면 이번에는 SecureConnection 클래스가 DataProtect 클래스 라이브러리(본 문서에는 나타나 있지 않으나 본 문서를 위한 다운로드에 포함되어 있음)를 호출하는데 이것이 Win32 DPAPI(Data Protection API)에 대한 호출을 래핑합니다. DPAPI의 우수한 기능 중 하나는 여러분을 위해 암호화 키를 관리한다는 점입니다. 사용 시 고려해야 할 추가 옵션을 비롯한 DataProtect 클래스 라이브러리에 대한 자세한 내용은 Microsoft 패턴 및 관행(patterns and practices) 가이드 "안전한 ASP.NET 응용 프로그램 구축: 인증, 권한 부여 및 보안 통신" 을 참조하십시오.

Figure 10 EncryptCnxString.aspx
그림 10  EncryptCnxString.aspx

EncryptCnxString.aspx 페이지를 사용하면 시스템별로 암호화된 연결 문자열을 생성하여 구성 파일에 붙여넣을 수 있습니다.이 페이지는 그림 10에 나와 있습니다.물론, 암호 및 연결 문자열 외에도 신용 카드 번호를 비롯하여 해커에게 노출되었을 때 해가 될 수 있는 기타 정보 등 암호화 또는 해시가 필요한 다른 기밀 정보도 있습니다. ASP.NET 2.0에는 암호 해시와 연결 문자열의 암호화를 단순화하는 많은 기능이 들어 있습니다.


능숙한 오류 처리

런타임 예외를 미숙하게 처리하는 것도 해커들이 사용하고자 하는 또 다른 취약점입니다. 따라서 모든 프로덕션 코드에 예외 처리기를 포함시키는 것이 중요합니다. 또한 처리된 예외와 처리되지 않은 예외 모두 해커에게 도움이 될만한 정보 제공을 항상 최소화해야 합니다. 처리된 예외의 경우, 오류 메시지를 작성할 때 정직한 사용자에게 도움이 되는 선을 넘어서 부도덕한 해커에게 너무 많은 정보를 제공하지 않도록 균형을 유지해야 합니다.

처리되지 않은 예외의 경우, 컴파일 요소(Web.config 파일에서)의 디버그 특성을 false로 설정하고 customErrors 요소의 모드 특성을 On 또는 RemoteOnly로 설정하여 해커에게 도움이 될만한 부분을 최소한으로 유지해야 합니다. 예를 들어 아래를 참조하십시오.

<compilation defaultLanguage="c#"
    debug="false"
/>

<customErrors mode="RemoteOnly" 
/>

RemoteOnly 설정은 로컬 호스트에서 해당 사이트에 액세스하는 사용자에게는 일정한 정보를 담은 오류 메시지를 제공하되 원격 위치에서 해당 사이트에 액세스하는 사용자들에게는 예외에 대한 어떠한 유용한 정보도 노출하지 않는 일반 오류 메시지를 제공하도록 보장합니다. On 설정을 사용하면 로컬 사용자를 포함한 모든 사용자가 일반 오류 메시지를 받게 됩니다. 프로덕션 환경에서는 절대 Off 설정을 사용하지 마십시오.


결론

SQL 주입 공격은 안전하다고 생각되는 시스템에 침입하여 데이터를 절도, 변경 또는 파괴하는 행위에 사용될 수 있으므로 응용 프로그램 개발자에게는 심각한 문제가 됩니다. 어떤 ASP.NET 버전을 사용하든 이러한 공격에 노출되기는 너무나 쉽습니다. 사실은 ASP.NET을 사용하지 않아도 SQL 주입 공격에 노출될 수 있습니다. Windows Forms 응용 프로그램을 비롯하여 사용자가 입력하는 데이터를 사용하여 데이터베이스를 쿼리하는 모든 응용 프로그램은 주입 공격의 대상이 될 수 있습니다.

SQL 주입 공격으로부터 시스템을 보호하는 것은 그리 어렵지 않습니다. 모든 사용자 입력을 확인하여 문제 있는 부분을 제거하고, 동적 SQL을 절대 사용하지 않으며, 최소 권한의 계정을 사용하여 실행하고, 기밀 정보를 해시 또는 암호화하며, 해커에게 유용한 정보가 포함되지 않도록 오류 메시지를 작성하는 응용 프로그램은 SQL 주입 공격에 대한 저항력이 있습니다. 다층적인 보호 방식을 따른다면 방어 수단 하나가 무너지더라도 시스템이 안전하게 보호될 수 있습니다. [주입 공격에 대한 취약점이 있는지 응용 프로그램을 테스트하는 것에 대한 정보는 사이드바의 "주입 공격 테스트 "를 참조하십시오.]



Paul Litwin 은 시애틀의 Fred Hutchinson Cancer Research Center에 근무하는 수석 프로그래머입니다. 그는 Microsoft ASP.NET Connections 컨퍼런스의 회원으로 활동하고 있으며 .NET 교육 회사인 Deep Training을 소유하고 있습니다. Paul에 대한 자세한 정보는 http://www.deeptraining.com 을 참조하십시오..

출처: MSDN Magazine2004년호
가까운 신문판매점을 이용하시거나 구독 신청하십시오.

http://www.microsoft.com/Korea/MSDN/MSDNMAG/ISSUES/2004/SQLInjection/default.aspx