ASP.NET 서버 정보 방지 기초

아주 기본적인 서버 정보를 웹 서버 응답에서 제거하는 방법이다.

기본적으로 IIS 웹 서버는 다음과 같이 응답한다.

HTTP/1.1 200 OK
Cache-Control: private
Content-Length: 1234
Content-Type: text/html; charset=utf-8
Set-Cookie: ASP.NET_SessionID=1234; path=/; HttpOnly
Date: Mon, 02 Feb 2009 05:33:41 GMT
Server: Microsoft-IIS/6.0
X-Powered-By: ASP.NET
X-AspNet-Version: 2.0.1234
Connection: close

이 중에서 위의 굵고 기울림꼴로 표시된 것을 제거한다.

1. URLScan을 사용하여 IIS 버전 정보 제거

%WINDIR%\System32\Inetsrv\URLscan\URLScan.ini 파일

[Options] 안의RemoveServerHeader 값을 1로 설정

명령 프롬프트에서 iisreset 실행하여 변경된 UrlScan 적용

2. IIS에서  Custom HTTP Headers 삭제

IIS 관리자에서 웹 사이트의 등록정보 중 HTTP Headers 탭안에 Custom HTTP Headers의 X-Powered-By: ASP.NET 삭제

3. ASP.NET 버전 정보 제거

web.config 파일

<system.web> 안에 <httpRuntime enableVersionHeader=”false”/> 설정

참고

ASP.NET에서 도메인 변경하여 보내기

제목이 조금 이상하지만, 내용을 보면 무엇인지 이해가 될 것이다.

일부 사이트는 도메인이 2가지가 가지고 있다. 예를 들면 some.com과 some.co.kr 이다.

이런 경우 둘 중에 하나의 도메인에 우선 순위를 주기 마련이다. 보통 .com 도메인이 될 것이다.

즉, some.co.kr 로 사이트에 접속하면 some.com 으로 도메인을 변경하여 응답한다.

이렇게 전환하는 방법은 별도의 페이지를 만들거나 Redirect 모듈을 이용하는 것이다.

ASP.NET에서 이와 같은 것을 하려면 다음과 같이 할 수 있다.

global.aspx 파일

<%@ Application Language="C#" %>
<%@ Import Namespace="System.Text.RegularExpressions" %>
<script RunAt="server">
/// <summary>
/// 요청 도메인을 변경한다.
/// </summary>
protected void Application_BeginRequest(object sender, EventArgs e) {
    string fromUrl = "http://some.co.kr";
    string toUrl = "http://some.com";
    string url = HttpContext.Current.Request.Url.ToString();
    if(Regex.IsMatch(url, fromUrl, RegexOptions.IgnoreCase)) {
        HttpContext.Current.Response.Status = "301 Moved Permanently";
        HttpContext.Current.Response.AddHeader("Location",
        Regex.Replace(url, fromUrl, toUrl, RegexOptions.IgnoreCase)
    );
}
</script>

이와 같이 하면 다음과 같이 웹 서버가 응답하게 된다.

GET http://some.co.kr/some/some.aspx HTTP/1.0

HTTP/1.1 301 Moved Permanently
Connection: close
Date: Mon, 02 Feb 2009 05:33:41 GMT
Location: http://some.com/some/some.aspx
Cache-Control: private
Content-Length: 0

참고

.NET에서 Excel 생성

.NET에서 Excel 생성하는 좋은 방법이 무엇이 있을까?

가장 먼저 떠오르는 것은 HTML 식으로 생성하는 방법이다.

두 번째로 XML을 사용하여 생성하는 방법이다.

세 번째로는 미리 Excel 파일을 생성한 후 OleDB를 사용하여 로드하여 쓰는 것이다.

첫 번째, 두 번째 방법은 호환성 문제가 있다.

아무래도 바이너리 파일이 아니다 보니 제대로 인지 못하는 경우가 있다.

세 번째 방법은 시스템을 타는 현상이 나타났다.

개발서버에서는 정상으로 동작하는 실 서버에서는 제대로 동작을 하지 않는 문제가 있었다.

실 서버가 해외의 경우에는 문제 해결에 시간이 많이 소요된다.

이번에 찾은 다른 방법은 MyXLS 라이브러리를 사용하는 것이다.

MyXLS

사이트: http://sourceforge.net/projects/myxls/

Java에서 Excel 만드는 것과 비슷하게 프로그래밍 방식으로 Excel 파일을 만든다.

이것에 단점은 Excel 로드에 문제가 있다는 것이다.

여러 가지 기능이 지원되지만 간단한 쓰기만 테스트해 보았다.

다음은 사용 예이다.

<%@ Page Language="C#" AutoEventWireup="true" %>
<%@ Import Namespace="org.in2bits.MyXls" %>
<script runat="server">
void Page_Load(object sender, EventArgs e) {
    try {
        XlsDocument xls = new XlsDocument();
        xls.FileName = "story_" + DateTime.Now.ToString("yyyy-MM-dd_HH_mm") + ".xls";
        xls.SummaryInformation.CodePage = 2;
        xls.SummaryInformation.Author = "Barney Kim";
        xls.SummaryInformation.Title = "Excel Write Test";
        xls.SummaryInformation.Subject = "Test";
        xls.SummaryInformation.Comments = ""; // To remove default value
        xls.DocumentSummaryInformation.Company = "barney.PE.kr";
        int sheetCount = 0;
        int rowCount = 1;
        int colCount = 1;
        Worksheet sheet = null;
        for(int i=0; i < 70000; i++) {
            Cells cells = null;
            if (rowCount == 1) {
                if (sheetCount == 1) {
                    sheet = xls.Workbook.Worksheets.AddNamed("Shee");
                } else {
                    sheet = xls.Workbook.Worksheets.AddNamed("Sheet" + sheetCount);
                }
                cells = sheet.Cells;
                cells.Merge(rowCount, rowCount, colCount, 7);
                Cell c = cells.Add(rowCount, colCount++, "My Excel Write Test");
                c.Font.Bold = true;
                c.Font.Height = 20 * 12;
                rowCount++;
                colCount = 1;
                //
                cells.Add(rowCount, colCount++, "No");
                cells.Add(rowCount, colCount++, "Name");
                cells.Add(rowCount, colCount++, "Email");
                cells.Add(rowCount, colCount++, "Title");
                cells.Add(rowCount, colCount++, "Date");
                cells.Add(rowCount, colCount++, "View Count");
                cells.Add(rowCount, colCount++, "IP Address");
                colCount = 1;
                rowCount++;
            } else {
                cells = sheet.Cells;
            }
            //
            cells.Add(rowCount, colCount++, i);
            cells.Add(rowCount, colCount++, "테스터");
            cells.Add(rowCount, colCount++, "some@some.com");
            cells.Add(rowCount, colCount++, "테스트라네");
            cells.Add(rowCount, colCount++, DateTime.Now.ToString("yyyy-MM-dd HH:mm"));
            cells.Add(rowCount, colCount++, 2);
            cells.Add(rowCount, colCount++, "127.0.0.1");
            rowCount++;
            colCount = 1;
            if (rowCount > 50003) {
                rowCount = 1;
                sheetCount++;
            }
        }
        xls.Send();
    } catch (Exception ex) {
        Response.Write("Error occurred");
    }
}
</script>