C에서 코드 길이를 줄이고 깔끔하게 만들기 위해 많이 사용하는 것이 바로 삼항 연산자(ternary operator)이다. ?:으로 구성되는 삼항 연산자의 사용법은 다음과 같다.


result = Condition ? resultWhenTrue : resultWhenFalse;

위 코드는 Condition이 true일 때 result에 resultWhenTrue가 대입되고, Condition이 False일 때 result에 resultWhenFalse가 대입된다. if문을 쓰면 오히려 소스가 보기 싫어지고 이해하기 어렵게 될 때 복잡한 연산 사이에 잘 사용하면 참 간편한 녀석이다.


그러나 Python을 배우면서 삼항 연산자는 공부한 기억이 없다. 코딩을 하면서 색상값을 증가시켜야 하는 부분이 있었다. 색상값이기에 최댓값을 255로 제한해야 했는데, C 같았으면 삼항 연산자를 이용해서 할 터였다. newColor=(oldColor*factor)>255?255:oldColor*factor와 같이 말이다. 그러나 Python에서는 if문을 쓰자니 지저분해지고, 분명히 다른 방법이 있을 것이라는 생각이 들어 찾아보았더니 여러 가지 방법이 존재했다.


  1. 2.5부터 지원되는 공식 삼항 연산자

    다행스럽게도, Python 2.5부터 기본적으로 공식 삼항 연산자가 지원된다고 한다. C와 비교하면, ?와 : 대신 if, else를 쓰고, 순서가 조금 바뀌었다.,


    result = resultWhenTrue if Condition else resultWhenFalse

    읽었을 때 자연스럽게 의미가 있는 문장으로 읽히는 것은 좋지만 resultWhenTrue와 resultWhenFalse 사이에 Condition이 들어 있어 가독성 면에서는 조금 부정적인 면이 있지 않나 생각한다.

  2. 튜플을 이용한 방법:

    Python에서 True는 1이고, False는 0이다. 따라서 조건을 시퀀스의 인덱스로 사용할 수 있다.


    result = ( resultWhenFalse, resultWhenTrue )[ Condition ]

    형태는 간결하지만 처음 보는 사람의 경우 그 의미를 이해하기까지 시간이 걸린다. 또한 resultWhenFalse와 resultWhenTrue를 미리 계산해 놓기 때문에 미리 계산하면 안되는 경우(조건에서 인덱스의 범위를 검사하여 범위 안에서만 원소에 접근해야 하는 경우 등)에는 부적절하다.

  3. 논리 연산자를 이용한 방법:

    x and y는 x를 먼저 실행한 후 결과가 False이면 x를 리턴하고, True이면 y를 계산한 후 이를 리턴한다.
    x or y는 x를 먼저 실행한 후 결과가 True이면 x를 리턴하고, False이면 y를 계산한 후 이를 리턴한다.
    자세한 설명은 Documentation 에 잘 나와 있다. 이와 같은 특성을 이용하면 논리 연산자로도 삼항 연산자를 구현할 수 있다.


    result = Condition and resultWhenTrue or resultWhenFalse

    만약 Condition이 True라면 and 연산자는 resultWhenTrue를 리턴할 것이다. resultWhenTrue가 True라면 or 연산자는 resultWhenTrue를 리턴하므로 결과적으로 전체 문장은 resultWhenTrue를 리턴한다. 만약 Condition이 False라면 and 연산자는 Condition, 즉 False를 리턴할 것이다. or 연산자는 앞에 있는 문장이 False이므로 뒤에 있는 resultWhenFalse를 리턴하므로, 전체 문장은 resultWhenFalse를 리턴한다.
    이 방법의 큰 문제는 resultWhenTrue가 항상 True일 때에만 사용할 수 있다는 것이다. 만약 resultWhenTrue가 False라면 Condition이 True일 때 or 연산자는 resultWhenTrue 대신 resultWhenFalse를 리턴할 것이다. 이를 해결하기 위해 약간의 수정을 한다.


    result = (Condition and [resultWhenTrue] or [resultWhenFalse])[0]

    resultWhenTrue를 담고 있는 리스트는 항상 True이므로(원소 개수가 1개 이상이면 True) 둥근 괄호는 resultWhenTrue와 resultWhenFalse 중 하나를 원소로 가지는 리스트를 리턴할 것이고, 이의 첫 번째 원소를 취하면 우리가 원하는 값을 얻을 수 있다.
    논리 연산자의 특성상 이 방법은 조건이 거짓일 때에는 아예 resultWhenFalse를 계산하지 않는다.


2.5버전부터는 새로운 연산자가 생겨 굳이 편법을 사용하지 않아도 되게 되었지만 편법을 쓴 사람들이 쓴 다른 코드를 읽을 때에는 조금 도움이 되지 않을까.




2008년 1월 19일 이후 작성된 모든 글에 대해서 퍼가는 것을 금지합니다.
퍼가고자 하시는 분은 링크를 달아 주시기 바랍니다.
Posted by Harry

Uway.com 은 대부분의 대학에서 이용하는 원서 접수 대리 사이트이다. 또한 물리 올림피아드 , 수학 올림피아드 등 각종 올림피아드의 수상자 발표 서비스 및 성적 컨설팅 서비스도 제공한다.

사용자 삽입 이미지

때문에 굉장히 많은 학생들의 신상 정보를 포함하기 마련이다. 사실 대한민국의 모든 수험생의 신상 정보를 담고 있다고 해도 과언이 아니다.

지난 8월 13일 한국 물리올림피아드의 수상자가 온라인으로 발표되었다. 발표 페이지는 Uway에서 제작한 대행 서비스를 사용하고 있었다. 주소는 http://ipsi9.uway.com/ksi/kps/pass/1/index.htm 이며, 이 포스트를 작성할 때는 서비스를 중단한 상태였다.

페이지는 단순했다. 성명과 주민등록번호를 입력하고 확인을 누르면 수상 정보를 알려 주는 것이었다. HTML 코드를 분석해 본 결과 form1이라는 폼에 namekor, juminno라는 이름의 Text field와 mode라는 이름의 hidden field가 있었다. method는 POST 방식을 사용하고 있었으며 onsubmit에는 값 검사 함수가 할당되어 있어 각 필드의 유효성을 검사했다.

여기서 두 가지 흥미로운 점을 발견할 수 있었다. 즉, form1의 action 페이지가 설정되어있지 않았다는 점mode라는 hidden field의 값은 check로 설정된 채 바뀌지 않는다는 점이었다. action에 주소가 할당되지 않으면 submit시 현재 페이지가 리로딩되며 데이터가 전달된다. 즉, action의 기본값은 현재 페이지이다. 따라서 이 페이지는 한 페이지에서 값의 입력과 출력을 모두 담당하며, 입력 페이지를 표시할 것인지 출력 페이지를 표시할 것인지는 mode라는 변수가 check라는 값을 가지고 있는지를 이용해 판단할 것임을 추측할 수 있다.

기본적으로 POST 방식으로 전송되는 데이터는 변조가 쉽지 않다. 따라서 입력 필드를 통해서만 공격을 해야 되기 때문에 공격이 많이 제한될 수밖에 없다. 특히 필드 검사 함수가 있는 상황에서는 더욱 힘들다. 그러나 만약 GET 방식의 파라미터를 받아들일 수 있다면, 입력 검사 함수를 회피하여 더욱 다양한 형태의 공격이 가능하다. 혹시나 하는 기대를 품고 주소 표시줄에 다음을 입력했다.

(생략)/index.htm?mode=check&namekor=홍길동

mode=check은 입력 페이지가 아닌 출력 페이지를 호출하기 위함이며, namekor 필드를 GET 형식으로 넘기고 있다. 결과는 놀라웠다. 데이터 에러가 아닌 '수상내역 없음' 페이지가 떴다. 알고 있는 수상자의 이름을 입력하여 보았더니 수험 번호와 이름, 주민등록번호, 상급, 여름학교 참가 여부가 정상적으로 표시되었다!

이 공격에서 POST로는 어떠한 값도 넘기지 않았다. 심지어 GET으로도 주민등록번호는 넘기지 않았다. 그러나 이름만 가지고도 정상적인 출력을 했으며, 이는 매우 위험하다.

결과를 통해 이 페이지가 범하고 있는 실수들을 추측해보면 다음과 같다.


  1. POST value와 GET value를 구분하지 않고 사용한다.

    서버사이드 언어를 PHP로 사용했을 경우를 예로 들어 보자. PHP에서 POST value와 GET value에 접근하기 위해서는 각각 $_POST['varname'], $_GET['varname']과 같이 사용해야 한다. 그러나 PHP 배포판의 기본 설정상, POST value와 GET value 모두 단순히 $varname으로도 접근할 수 있다. 만약 POST value에 접근하기 위해 $varname을 사용하였는데 공격자가 POST value 대신 GET value를 전달한다면, 프로그램은 GET value를 POST value로 인식하고 사용할 것이다. 물리 올림피아드 수상자 발표 페이지에 대한 공격이 성공한 결정적인 이유는, POST value 대신 GET value를 넘길 수 있었기 때문이다. 만약 두 값이 구분되었다면, mode를 인위적으로 check로 바꾸기는 힘들었을 것이다.


  2. 폼 값을 검사하지 않는다.

    웹 페이지를 작성하며 가장 하기 쉬운 잘못은 바로 값을 전달할 때 송신자와 수신자 중 한 쪽에서만 검사를 한다는 것이다. 로컬로 실행되는 프로그램은 상대적으로 값이 조작될 가능성이 낮기 때문에 값 전달시 한 쪽에서만 검사하는 것도 큰 문제가 되지 않는다. 그러나 웹 프로그래밍에서 값은 언제 어디서 어떻게 조작될 지 알 수 없으므로 언제나 값을 사용하기 전에는 검사해야 한다. 즉, 폼 값을 전송하기 전에 Javascript를 이용하여 유효성 검사를 했다고 하더라도, 서버사이드에서 이 값을 사용할 때에는 다시 유효성 검사를 해야 한다는 것이다. 물리 올림피아드 수상자 발표 페이지가 서버사이드에서 다시 유효성 검사를 했더라면, juminno 필드가 비어 있는 것을 발견하고 에러를 냈을 것이다.


  3. 적절한 Query문을 작성하지 않는다.

    주민등록번호가 전달되지 않으므로 juminno=""라고 예상할 수 있다. 만약 Query가 적절히 작성되었다면, 주민등록번호가 ""인 데이터는 검색되지 않아야 한다. 예상컨대 Query를 작성할 때 해당 필드가 빈 문자열이 아닐 때에만 조건을 추가하도록 한 것으로 보이며, 이는 이 코드가 재활용되기 때문일 것이다. 어떤 수상자 발표 페이지에서는 이름과 수험번호를, 어떤 페이지에서는 수험 번호와 주민등록번호를 요구하는 등 서로 다른 필드를 요구하기 때문에 빈 문자열이 아닌 경우에만 조건을 추가하도록 한 것이 문제의 원인으로 보인다.


만약 모든 가능한 이름에 대하여 Brute-force 공격(마구잡이 대입 공격)을 시도한다면 1초에 10개의 이름을 처리할 수 있다는 가정 하에 약 900시간만에 모든 이름에 대해 공격을 시도할 수 있으며 한국인의 이름은 주요 성씨에 대부분이 모여 있다는 점을 이용하면 훨씬 짧은 시간 안에도 대다수의 이름에 대해 공격을 시도할 수 있다. 이름만으로 주민등록번호를 포함한 수상 정보를 얻을 수 있다는 것은 매우 위험한 일이다.

9월 초에는 한국 수학올림피아드의 수상자가 또 Uway의 페이지를 통해 발표되었다. 코드를 재활용할 것이라는 예상과 같이, 수학 올림피아드와 물리 올림피아드의 수상자 발표 페이지는 출력 형식을 제외하고는 거의 100% 일치했다.

사용자 삽입 이미지

단일 페이지에서 mode 변수를 이용해 출력을 컨트롤하는 점, POST value와 GET value를 필터링하지 않는 점 등 모든 보안 문제가 그대로였기 때문에 정확히 같은 방법으로 공격을 할 수 있다. 다른 점이라면 출력 페이지에 주민등록번호가 표시되지 않는다는 것이다. 따라서 이름과 주민등록번호를 연결시켜 개인 정보를 얻기 위해서는 이름이 아닌 주민등록번호에 대해 Brute-force 공격을 시도해야 한다.

가장 큰 문제는 보안 의식이다. Uway에서 발생한 문제는 절대 기술적인 문제가 아니다. 공격법이 새로운 것도 아니고, 그렇다고 복잡한 것도 아니다. 심지어 기본적인 PHP 입문서에나 나올 법한 보안 예제이다. 아주 단순하고 초보적인 공격에 개인 주민등록번호를 노출하고 만 것이다. 조금만 보안에 관심을 가졌다면 쉽게 발견하고 고칠 수 있는 문제이다.

문제는 이러한 보안 문제가 이 페이지에만 국한된 것이 아니라는 것이다. 얼마 전 전자신문 에 '학교에서 주민번호가 줄~줄 샌다 '라는 기사가 떴다. Uway와 같이 온라인 서비스가 주된 사업 영역이고, 그 규모도 동종 기업 중 1위라고 자부하는 회사에서조차 너무나 허술한 보안의식으로 심각한 보안 문제가 나타났는데, 학교야 어련하랴 싶은 마음이 들었다.

이제 프로그램을 개발할 때 보안에 신경을 쓰는 것은 필수이다. 프로그래머가 보안을 담당할 수 없다면, 보안 기술자를 고용하는 것이 현명할 것이다. 이 공격법은 주민등록번호 노출에서 그쳤지만, 이와 같은 보안 의식으로 설계한 프로그램이라면 다른 허점도 존재할 것이고, 이는 더 심각한 문제를 야기할 수 있다. 이러한 사태를 맞는 것보다는 보안 분야에 예산을 더 투입하는 것이 훨씬 경제적인 판단이다.

복잡하고 교묘한 공격을 막기는 힘들더라도, 기초적 보안 의식 결여에 의한 보안 허점은 이제 사라지길 바라며 마친다.


2008년 1월 19일 이후 작성된 모든 글에 대해서 퍼가는 것을 금지합니다.
퍼가고자 하시는 분은 링크를 달아 주시기 바랍니다.
Posted by Harry
프로그램을 개발하던 도중 10진수로 표현된 Unicode, 즉 &#으로 시작하여 10진수 Unicode가 있고 세미콜론(;)으로 끝나는 문자를 출력해야 할 상황이 생겼다. Javascript에서 문자열 변수 안에 있는 문자열은 '並ぶ'와 같았으며, 그냥 단순히 출력할 경우 코드 부분이 변환되지 않고 그대로 출력되는 문제점이 있었다.

10진 Unicode를 코드에 해당하는 실제 문자로 변환하기 위해서는 String.fromCharCode라는 Javascript 함수를 써야 한다. 그러나 이 함수는 문자 코드를 문자로 변환하는 역할만 할 뿐 문자 코드가 섞여 있는 문자열을 변환하는 기능은 없었다.

그래서 다음과 같은 함수를 만들었다.



str에 변환하고자 하는 문자열을 넘기면 정규식을 이용해 십진 유니코드를 파싱한 뒤 이를 실제 문자로 치환하여 리턴한다.


2008년 1월 19일 이후 작성된 모든 글에 대해서 퍼가는 것을 금지합니다.
퍼가고자 하시는 분은 링크를 달아 주시기 바랍니다.
Posted by Harry

드디어 My Apps 카테고리에 글이 올라오는군요.


거의 1달간 야심차게 만든 단어 암기 프로그램 記憶のカケラ(키오쿠노카케라 : 기억의 파편)입니다. 이름만 일본어이지, 사실 일본어와는 아무 상관 없습니다.

사용자 삽입 이미지


사실 이 프로그램의 콘솔판은 3년 전부터 개인적으로 사용해 왔으나 버그도 많고 도저히 공개할 수준이 못 되어서 이제서야 공개판을 냅니다.

어디선가에서 읽은 책에 한 외교관의 이야기가 소개되어 있었습니다. 매 회의마다 다른 외교관들의 얼굴과 이름, 성격이나 특징 등을 외워야 했던 외교관은 독특한 방법으로 쉽게 외울 수 있었고, 이 방법을 단어 암기에 응용한 것이 記憶のカケラ입니다.

사용자 삽입 이미지

개발 환경이 C#인 관계로 .NET Framework 2.0 이상이 필요합니다. 설치 과정에서 .NET Framework가 설치되어 있지 않으면 설치 페이지가 열리므로 설치하시거나 다음 링크를 참조하시기 바랍니다. (http://www.microsoft.com/downloads/details.aspx?FamilyID=0856eacb-4362-4b0d-8edd-aab15c5e04f5&displaylang=ko )

왜 프로그램 이름이 記憶のカケラ가 되었냐고 하면 그냥 장난 삼아 X-Japan의 Rusty Nail이라는 곡의 첫 가사인 記憶のカケラ를 프로젝트명으로 삼은 것이 결국 프로그램 이름으로 굳어졌습니다. 본래 개인적으로 사용하던 콘솔판 프로그램의 이름은 'Memory Helper'였습니다(-_-).

아이콘도 도저히 만들 자신이 없어서 '내 그림' 폴더에서 가장 눈에 띄는 '귀리' 사진의 일부를 잘라서 만들었습니다. 누런 아이콘의 정체는 바로 '귀리'입니다.

단어장은 맨 윗줄에 단어의 개수가, 그 다음 줄부터 단어와 뜻이 번갈아 한 줄에 하나씩 있는 형태를 취합니다. 즉, 다음과 같습니다.

3
dog

cat
고양이
pig
돼지


아무튼, 첫 프로그램이다보니 이것 저것 부족한 게 많습니다. 단어장 형식도 제한이 심하고, 여러 가지 허접해 보이는 것이 사실입니다만, 자체 기능은 쓸 만 하니 너그러이 봐 주셨으면 합니다. 버그가 있을 경우 이 포스트에 댓글로 남겨 주시면 다음 판올림에 적용하도록 하겠습니다.

개발 환경 : Microsoft Visual Studio 2005
개발 언어 : Visual C#
개발 기간 : 약 1달




2008년 1월 19일 이후 작성된 모든 글에 대해서 퍼가는 것을 금지합니다.
퍼가고자 하시는 분은 링크를 달아 주시기 바랍니다.
Posted by Harry

위치

HKCU\Software\Microsoft\Windows\CurrentVersion\Policies\System\DisableRegistryTools

기능

레지스트리 편집기 사용을 금지시킨다.

DWORD 값으로 저장된다. 0이거나 값이 없을 경우 레지스트리 편집기 실행이 허용되며, 값이 1일 경우 레지스트리 편집기 실행이 금지된다. 단 레지스트리 편집기만 금지될 뿐 다른 프로그램에 의한 레지스트리 접근은 허용된다.


2008년 1월 19일 이후 작성된 모든 글에 대해서 퍼가는 것을 금지합니다.
퍼가고자 하시는 분은 링크를 달아 주시기 바랍니다.
Posted by Harry
블로그 방문자의 유입 경로의 대부분은 검색엔진이다. 필자는 Daum WebInside로 분석한 결과 유입 검색엔진에서 네이버가 약 75%로 1위를, 구글이 약 15%로 2위를 차지하고 있고 야후, 엠파스, 다음이 그 뒤를 잇고 있다. 국내 2위의 검색엔진인 다음과 성능으로는 최고를 자부하는 엠파스로부터의 유입이 왜 이렇게 적을까 고민하다가 다음과 엠파스에서 Harry's_Lab을 찾아보기로 하였다.

방문자 유입이 적은 데에는 이유가 있었던 것이었다. 어쩌다가 웹 페이지 검색 결과에서 노출되는 것 이외에 블로그 검색결과에는 필자의 글이 한 건도 노출되지 않았다. 네이버의 경우 블로그 검색결과 노출 신청이 따로 존재하지만 다음이나 엠파스의 경우 아무리 찾아도 신청하는 방법을 찾을 수 없어 직접 문의를 했다.

문의 내용블로그 검색 결과에 노출되고 싶습니다.

블로그 이름 : Harry's_Lab
블로그 주소 : http://harrys.co.kr/blog/lab
피드 주소 : http://harrys.co.kr/blog/lab/rss


그러자 며칠 후 다음과 엠파스에서 메일로 답변이 도착했다.

사용자 삽입 이미지

사용자 삽입 이미지

블로그 등록하는 다른 방법을 안내하지 않은 것으로 보아 원래 문의하여 신청하는 것이 옳은 방법이었는지도 모른다.

앞으로 다음과 엠파스가 방문자 유입에서 활약해 주길 바란다.


2008년 1월 19일 이후 작성된 모든 글에 대해서 퍼가는 것을 금지합니다.
퍼가고자 하시는 분은 링크를 달아 주시기 바랍니다.
Posted by Harry
바탕화면의 아이콘은 시스템 리소스를 잡아 먹는 원인 중 하나라고 한다. 때문에 필자의 바탕화면에는 주로 사용하는 프로그램들의 아이콘이 보이지 않는다. 또한 시작 메뉴의 모든 프로그램에도 몇 가지 안되는 프로그램만이 자리하고 있다. 그렇다고 매번 프로그램을 실행시킬 때마다 program files 폴더로 들어가서 직접 exe 파일을 실행시키지도 않는다. 어떻게 가능할까?

바로 환경변수를 최대한 이용하는 것이다. 환경변수란, OS상에서 사용하는 변수인데, Windows XP에는 path라는 환경변수가 존재한다. 이 path라는 환경변수를 조작하면 실행 창만을 통해 대부분의 프로그램을 구동시킬 수 있다. 실행 파일의 이름만 알고 있으면 실행 창에 이를 입력하여 실행시키는 것이다.

가령, Windows에서 기본으로 제공하는 계산기 프로그램의 경우 실행파일 이름이 calc.exe이다. 시작->실행으로 들어가서 calc라고 입력한 후 확인을 눌러 보자. 계산기가 뜬다. 하지만 대부분의 사람들이 사용하는 한글과 컴퓨터의 한글 프로그램의 실행파일 이름인 hwp를 입력해도 파일을 찾을 수 없다는 경고 창만이 뜰 뿐이다. 바로 환경 변수가 등록되지 않았기 때문이다.

calc.exec:\windows\system32 폴더에 존재한다(시스템 폴더의 위치를 변경시키지 않았을 경우). 이 경로는 환경 변수에 존재하고, 실행 창에 calc라고 입력할 경우 환경 변수에 등록된 모든 경로에 calc.exe가 있는지를 검사하여 있을 경우 실행시키게 된다. 하지만 hwp.exe가 존재하는 c:\hnc\hwp70 폴더(한글 2007버전 기준)는 환경 변수에 등록되어 있지 않기 때문에 실행되지 않는 것이다.

그렇다면 프로그램이 설치된 모든 폴더를 환경 변수에 등록하면 실행 창에서 실행 파일의 이름을 입력하는 것만으로도 손쉽게 프로그램을 실행시킬 수 있게 된다. 하지만 이는 매우 귀찮은 작업이다. 때문에 필자는 모든 프로그램의 바로가기를 한 폴더에 모아 놓고, 그 폴더의 주소를 환경 변수로 등록한다. 가령 c:\QuickLnk라는 폴더를 생성하고 폴더 아래에 주로 사용하는 프로그램의 바로가기를 생성한 후 기억하기 편한 이름으로 수정한다.

사용자 삽입 이미지

다음은 환경 변수를 수정할 차례이다. WIN+PauseBreak 키를 눌러서 시스템 등록정보 창을 띄운 뒤 고급 탭으로 이동하여 환경 변수 버튼을 클릭한다.

사용자 삽입 이미지

환경 변수 창이 뜨면 아래에 있는 리스트에서 path라는 변수를 찾아 편집을 누른다.

사용자 삽입 이미지

기존에 있는 환경변수 뒤에 등록하고자 하는 폴더의 경로를 적는다. 각 경로 간의 구분은 세미콜론(;)으로 한다.

사용자 삽입 이미지

확인을 눌러 창을 닫는다. 이제 실행을 해 보도록 하자. Win+R 키를 누르거나 시작->실행을 눌러 실행 창을 띄운다. 만든 바로가기 이름을 입력하고 확인 버튼을 눌러 보자.

사용자 삽입 이미지

프로그램이 정상적으로 실행될 것이다.

이와 같이 하면 바탕화면에서 아이콘이 줄어들고, 덕분에 시스템 리소스도 확보된다. 하지만 단점이라면 모든 프로그램에 대해 바로가기 이름을 외우고 있어야 하며, 내 컴퓨터에 어떤 프로그램이 설치되었는지 눈에 보이지 않기 때문에 필요 없는 프로그램을 지우지 않게 되는 경향도 있다. 본인의 판단 아래 사용하길 바란다.


2008년 1월 19일 이후 작성된 모든 글에 대해서 퍼가는 것을 금지합니다.
퍼가고자 하시는 분은 링크를 달아 주시기 바랍니다.
Posted by Harry
일반적으로 가정에서 서버를 돌리게 되면 가장 불편한 점이 아이피가 자주 바뀐다는 것이다. 이는 보통 가정에는 유동 아이피를 할당하기 때문이다. 아이피 주소가 고정되어 있지 않기 때문에 홈페이지 운영은 아예 불가능하고 접속할 때마다 아이피 주소를 체크해야 하기 때문에 여간 번거로운 작업이 아닐 수 없다.

이를 해결하여 주는 것이 DNIP 서비스이다. DNIP란 유동 IP에 도메인을 할당하여 정상적인 서버 운영이 가능하도록 해 주는 서비스이다. 원리는 간단하다. 컴퓨터가 부팅될 때마다 네임서버에 아이피 주소를 전송하여 갱신하여 주면 된다. DNIP 서비스를 제공하는 곳은 여러 곳이 있는데, 여기서는 dnip.net이라는 곳에서 제공하는 서비스를 이용해 보도록 한다.

먼저 dnip.net 에 접속한다. 상단 메뉴 중 Signup 메뉴를 클릭하여 'I agree'를 클릭하여 약관에 동의한 후 간단한 정보를 입력하여 가입한다. User ID/Hostname - 아이디를 입력한다. 이후 'http://아이디.dnip.net'이 도메인으로 쓰이므로 신중히 결정한다. Email Address - 이메일 주소를 입력한다. 이메일을 통해 2차 인증을 진행하기 때문에 정확히 입력해야 한다. Name(Real Name) - 실명을 입력한다. Service Type - 서비스 유형을 선택한다. 하나의 도메인만을 사용할 경우 'Address Only'를, 서브도메인을 사용할 경우 'Sub Nameserver'를 선택한다. IP Address - 도메인을 할당할 서버의 아이피 주소를 입력한다. 이후 갱신되는 주소이다. * 이후 입력사항은 생략해도 된다. 가입이 완료되면 가입시 입력했던 이메일을 확인해 본다. 인증 주소로 접속하여 비밀번호를 설정한 후 가입을 최종적으로 완료한다.

아이피 주소를 업데이트하는 방법은 두 가지이다. 아이피 주소가 바뀔 때마다 사이트에 접속하여 수동으로 업데이트하는 방법, 또 한 가지는 컴퓨터 부팅 시 자동으로 업데이트가 되도록 하는 방법이다. 이 중 두 번째 방법에 대해 설명한다. 메뉴 중 'Update utility'를 클릭한다. 대부분의 서버 시스템에 perl은 설치되어 있으므로 UPDATE_PERL을 클릭하여 update_perl.sh 파일을 다운로드 받는다. 텍스트 편집기를 이용하여 22, 23번째 줄의 ID와 PASSWORD 위치에 자신의 dnip 아이디와 비밀번호를 써 넣고 저장한다.

이후 자신의 시스템의 적당한 위치에 저장한 뒤 부팅될 때 실행되도록 설정한다. 이는 시스템마다 방법이 다르므로 생략하도록 하겠다.

고정 IP는 주소 하나 당 수십~수백만원씩 하기 때문에 개인이 운영하기에는 부적절한 것이 사실이다. 고정 IP를 구입하지 않고 서버를 운영해 보고 싶다면 이와 같은 DNIP 서비스를 이용해 보는 것도 좋을 것이다.


2008년 1월 19일 이후 작성된 모든 글에 대해서 퍼가는 것을 금지합니다.
퍼가고자 하시는 분은 링크를 달아 주시기 바랍니다.
Posted by Harry

위치

HKCU\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer\NoDrives

기능

드라이브를 숨기는 기능을 한다. 드라이브 문자별로 해당 드라이브가 내 컴퓨터에서 보이지 않게 할 수 있다.

DWORD 값으로 저장된다. 값을 이진수로 나타내었을 때 드라이브 문자 하나 당 우측부터 한 자리를 차지한다. 즉 값은 최대 226-1의 값을 가질 수 있으며 어떤 드라이브도 숨기지 않을 경우 0의 값(default)을 가진다.

A부터 Z까지 순서대로 0~25의 번호를 매기고 N번째 드라이브를 숨기려면 기존 값에 2N을 OR 연산 해 주면 된다.

가령 C:와 D:를 숨기는 경우에는, C:는 2, D:는 3의 값을 가지므로 2223을 OR연산한 결과인 12를 저장하면 된다.


2008년 1월 19일 이후 작성된 모든 글에 대해서 퍼가는 것을 금지합니다.
퍼가고자 하시는 분은 링크를 달아 주시기 바랍니다.
Posted by Harry

위치

HKCU\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer\StartMenuLogOff

기능

시작 메뉴에 로그오프 버튼을 표시할 것인지를 설정한다.

DWORD값으로 1 또는 0의 값을 가진다.
  0 : 로그오프 메뉴 표시
  1 : 로그오프 메뉴 표시 안함


2008년 1월 19일 이후 작성된 모든 글에 대해서 퍼가는 것을 금지합니다.
퍼가고자 하시는 분은 링크를 달아 주시기 바랍니다.
Posted by Harry