[ASP.NET] 잠재적 위험이 있는 Request.Form 값을 발견했습니다.

[■Web Programing/OO ASP.NET OO]

[펌] : http://thankee.tistory.com/67


Form의 데이터를 Request할때, Form값에 태그가 포함 되어 있을 경우 다음과 같은 에러를 발생시킵니다.
클라이언트 (txtContent="<STRONG>Content</STRONG>...")에서 잠재적 위험이 있는 Request.Form 값을 발견했습니다.

Form의 값으로 태그와 몇몇 특수문자들을 그대로 전송받아 처리하게되면 XSS나 SQL Injection과 같은 공격을 회피하지 못하거나, 공격자에 의해 사이트가 변조 당하는 등의 문제가 발생할 수 있습니다.

따라서 ASP.NET에서는 Request한 값을 validate, 즉 유효성을 검사하여 사용자에게 알림으로서 보다 견고한 웹 어플리케이션을 구축할 수 있도록 하고 있습니다. 이 에러를 처리하는 방법으로는 다음과 같이 세가지 방법이 있으며, 첫 번째 방법이 가장 안전하고 권장되는 방법입니다.

1. Client에서 Form값을 전송하기 전 또는 Request한 값을 사용하기 전에, 특정 문자들을 제거하거나 HTML Encoding 등을 사용하여 특수문자들을 다른문자로 치환하는 방법입니다. Javascript 또는 Server Side Script 에서 제거할 수 있으며 개발자가 필요에 따라 선택하면 됩니다.

2. 특정페이지에서만 에러 발생을 무시하는 방법입니다. 에러가 발생하는 페이지의 Page 지시자에 validateRequest="false" 를 추가하면 해당 페이지에서는 이 에러가 발생하지 않게 됩니다.

<%@ Page
     language
="C#" Codebehind="...." AutoEventWireup="true" Inherits="..."
     validateRequest="false" %>
3. 전체 웹 어플리케이션에 해당 에러가 나타자니 않게 하는 방법입니다. web.config에서 <system.web>엘리먼트 내부에 <pages validateRequest="false" />를 넣어두면 모든 페이지에서 해당 에러는 발생하지 않게 됩니다.
<?xml version="1.0"?>
<configuration>
    <appSettings/>
    <system.web>
        <pages validateRequest="false" />
    </system.web>
    ....
</configuration>
크리에이티브 커먼즈 라이센스
Creative Commons License

[ASP.NET] system.runtime.interopservices.comexception .net

[■Web Programing/OO ASP.NET OO]
[펌] http://cathy99.egloos.com/3634227

system.runtime.interopservices.comexception .net



크리에이티브 커먼즈 라이센스
Creative Commons License

[ASP.NET] OnClientClick 호출 후 onclick 이벤트 호출

[■Web Programing/OO ASP.NET OO]
<asp:button id="Button1" runat="server" OnClientClick="return confirm('Ok to post?')" onclick="Button1_Click" Text="Click!" />


이런

크리에이티브 커먼즈 라이센스
Creative Commons License

[ASP.NET] 그리드뷰 셀 병합

[■Web Programing/OO ASP.NET OO]
출처 : http://blog.naver.com/makemeha2?redirec ··· 41344456

    private void MergeGridView(GridView grid, int colIndex)
   {
        int RowSpan = 1;

        for (int i = grid.Rows.Count - 1; i > 0; i--)
        {
            if (grid.Rows[i].Cells[colIndex].Text ==

                                                 grid.Rows[i - 1].Cells[colIndex].Text)
            {
                RowSpan++;
                grid.Rows[i - 1].Cells[colIndex].RowSpan = RowSpan;
                grid.Rows[i].Cells[colIndex].Visible = false;
            }
            else
            {
                RowSpan = 1;
            }
        }
    }

위 코드의 사용법은 그리드뷰 바인딩 후에 셀병합 대상 Gridview id 와 대상 컬럼을 인자로 설정하여

호출하면 원하는 화면을 얻을 수 있다.

화면예제는 생략합니다.

====================================================================================================

위의 방법을 응용하여 Textbox에 담긴 데이터를 병합 할 때에는 아래코드를 이용하면 된다.

    private void MergeGridViewTextBox(GridView grid, int colIndex, string textbox)
    {
        int RowSpan = 1;
        for (int i = grid.Rows.Count - 1; i > 0; i--)
        {
            if (((TextBox)grid.Rows[i].Cells[colIndex].FindControl(textbox)).Text == ((TextBox)grid.Rows[i - 1].Cells[colIndex].FindControl(textbox)).Text)
            {
                RowSpan++;
                grid.Rows[i - 1].Cells[colIndex].RowSpan = RowSpan;
                grid.Rows[i].Cells[colIndex].Visible = false;
            }
            else
            {
                RowSpan = 1;
            }
        }
    }

음 작업중 문제 발생 !!!!

위 와 같이 할 경우 자바스크립트에서 처리를 할 수 없다.

단순 display:none으로 처리하면 자바스크립트에서 처리가 가능하다. 목적에 맞게 사용하자

    public void MergeGridViewTextBox(GridView grid, int colIndex, string textbox)
    {
        int RowSpan = 1;
        for (int i = grid.Rows.Count - 1; i > 0; i--)
        {
            if (((TextBox)grid.Rows[i].Cells[colIndex].FindControl(textbox)).Text == ((TextBox)grid.Rows[i - 1].Cells[colIndex].FindControl(textbox)).Text)
            {
                RowSpan++;
                grid.Rows[i - 1].Cells[colIndex].RowSpan = RowSpan;
                //grid.Rows[i].Cells[colIndex].Visible = false;
                grid.Rows[i].Cells[colIndex].Style.Add("display", "none");
            }
            else
            {
                RowSpan = 1;
            }
        }
    }

크리에이티브 커먼즈 라이센스
Creative Commons License

[ASP.NET] [펌] Gridview에 DataSet을 DataBind()했을 때 페이징 하기

[■Web Programing/OO ASP.NET OO]
[펌] http://blog.outsider.ne.kr/33

이것저것 하다보면 GridView에 수동으로 다른 데이터를 바인딩 시켜야 할 때가 있다. 최근에 사용했을 때는 비연결지향으로 DataSet을 얻어서 DataBind를 시켰는데 이렇게 했을때 페이징이 제대로 되지 않는 문제점이 있었다.

GridView에 DataBide를 꼭 저렇게 안하고 아래에 적혀있듯이 Datasource자체를 바꿔주는 방법을 취할 수도 있고 그럴게 했을 경우는 큰 문제가 생기지 않을 것으로 예상된다.(테스트는 못해봤지만 일단 타입이 동일하므로...)

페이징을 하려면 별도로 비하인드 코드에서 처리르 해주어댜 한다.

해당 Gridview의 속성에서 PageIndexChanging를 생성해 주고 그 Behind코드에 다음 코드를 넣어주면 된다.

  1. protected void AllItemGridView_PageIndexChanging(object sender, GridViewPageEventArgs e)  
  2. {  
  3.     AllItemGridView.PageIndex = e.NewPageIndex;  
  4.     AllItemGridView.DataBind();  
  5. }  

Gridview의 이름이 AllitemGridView이다. 내가 찾은 코드중에는 가장 간단한 코드이며 잘 작동한다.
-- 펌 끝 --

<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" CellPadding="0" CellSpacing="1" BorderWidth="2" AllowPaging="true" OnPageIndexChanging="AllItemGridView_PageIndexChanging"
                    BackColor="#bbbbbb" ForeColor="#333333" GridLines="None" Width="100%">

CS단에서 바인딩하는 경우에 이런식으로 처리하면 잘된다.

크리에이티브 커먼즈 라이센스
Creative Commons License

[ASP.NET] Parent 속성 사용

[■Web Programing/OO ASP.NET OO]
    protected void setUnit(object sender, EventArgs e)
    {
        ((TextBox)((DropDownList)sender).Parent.FindControl("yyyy")).Text = xxx;
    }

    그리드뷰 사용시 이벤트가 발생한 Row의 Cell에서 다른 위치의 Cell에 값을 저장하고 싶은 경우
    Parent 속성을 이용하여 처리해줄 수 있다
크리에이티브 커먼즈 라이센스
Creative Commons License
TAG. ASP.NET, Parent

[ASP.NET] GridView Field 를 Hidden Field 로 변경하여 사용

[■Web Programing/OO ASP.NET OO]
    <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False"
    DataKeyNames="MATNR" OnRowCreated="SetItemVisibleFalse">

   asp:BoundField DataField="xxx" visible="false" />
   인 경우 CS단에서도 값을 받아 올 수가 없게 된다.

    아래와 같이 Row 생성 시점에 처리를 해주면 CS단에서 값을 받아 처리할 수가 있다.
    protected void SetItemVisibleFalse(object sender, GridViewRowEventArgs e)
    {
        e.Row.Cells[9].Visible = false;
        e.Row.Cells[10].Visible = false;
        e.Row.Cells[11].Visible = false;
    }
크리에이티브 커먼즈 라이센스
Creative Commons License

[ASP.NET] SMTP 메일전송

[■Web Programing/OO ASP.NET OO]
asp.net 2.0 SMTP 메일 보내기를 위하여 아래와 같은 순서로 진행되어져야 한다.

1. 우선 자신의 SMTP 가상 서버를 만들어야 한다.
 -  IIS(인터넷 정보 서비스)관리를 깔때 옵션으로 선택할 수 있다.
 -  속성 -> 액세스 -> 릴레이에 "127.0.0.1"(로컬서버) 추가


2. System.Net.Mail 을 사용한다.
 -  System.Web.Mail 에서 System.Net.Mail으로 바뀌었다.(asp.net 2.0)
 -  MailMessage, SmtpClient 객체를 사용할 수 있게 해준다.
 -  StringBuilder객체(String 모아 담기 - 주로 메일의 본문 내용 담기에 사용)을 위하여 System.Text사용


3. StringBuilder 객체 생성후 정보를 모아 본문 내용을 만든다. 후에 String 변수에다가 ToString()으로 변환하여 담아둔다.
 - 그냥 해도 되지만 메일의 본문 내용을 깔끔하게 정리할 수 있게 된다.
 - Append()함수를 사용하여 문자를 연결시킨다.


4. MailMessage 객체 생성 (  MailMessage mail = new MailMessage();)
       
        mail.From = new MailAddress("보내는 메일 주소");
        mail.To.Add("받을 메일 주소");
        mail.Subject = 메일제목;
        mail.Body = 메일본문;
        mail.SubjectEncoding = System.Text.Encoding.Default;
        mail.BodyEncoding = System.Text.Encoding.Default;
        mail.IsBodyHtml = true; // HTML 형식 사용함


5. SmtpClient객체 생성 ( 메일 발송)

SmtpClient smtp = new SmtpClient("서버이름", 포트번호);
smtp.Credentials = new NetworkCredential("인증메일주소", "인증메일비번");
smtp.Send(보낼 내용);
크리에이티브 커먼즈 라이센스
Creative Commons License

[ASP.NET] 크리스탈리포트 적용 성적서

[■Web Programing/OO ASP.NET OO]
플젝이 중반을 달리고 있다.

크리스탈 리포트도 처음 해보는데 2일만에 끝내야 한다

인터넷 고수들의 도움으로 슬슬 마무리가 되는데 잼있기도 하고 어렵다 ㅎㅎ

개발자 홧팅!!
==========================================================================
[펌] http://hoons.kr/lecture/lectureview.asp ··· ind%3D27
==========================================================================

저번 강좌에서는 간단한 리포트 파일을 만들어 보았습니다. crystalreport1.rpt라는 파일을 만든것을 기억하고 있을 것입니다. 음;; 그리고 크리스탈리포트를 만들기 위해서 웹프로젝트에 있는 크리스탈 리포트 프로젝트를 생성하여 리포트를 마든것 역시 기억하고 있을 것입니다. 이번 강좌에서는 만든 리포트를 이제 웹에서 보는 방법을 알아보도록 하겠습니다.


.NET 2.0의 CrystalReportViewer와 CrystalReportSource

기존의 닷넷 1.x버전에서부터 지원되어 왔던 CrystalReportViewer컨트롤을 살펴 보도록 하겠습니다. CrystalReportViewer는 보고서를 HTML 형식으로 변환해주고, 웹응용 프로그램에서 데이터의 상호 작용을 해주는 컨트롤입니다. 구조는 아래와 같습니다. 왼쪽 아래에는 LogonInfo(로그인관련)와 ParameterFieldInfo(파라메터 관련) 그리고 ReportSource(리포트소스)의 객체들이 연결되어져 있는데 이 객체들은 반드시 알아야 할 객체들입니다. 크리스탈리포트를 닷넷에서 어느정도 다루어 보았다면 아래그림이 아하! 하게 받아들여 지겠지만, 맨땅에 해당하시는 분에게는 아래 그림이 전혀 눈에 들어 오지 않을 것입니다. 그렇기 때문에 간단한 예제를 통해서 일단 리포트를 출력좀 해보고 다시 이 그림을 살펴보도록 하겠습니다.


<CrystalReportViewer의 구조>

ASP.NET2.0 에서의 리포트 출력

편리해진 ASP.NET 2.0에서 소스코드 없이 드래그와 몇번의 설정으로 바로 리포트를 출력해 낼 수가 있습니다. 너무 오바 하는거 아니냐구요?! 그럼 한번 해보겠습니다. 먼저 이번에 사용될 예제는 저번 강좌에서 만든 ASP.NET Crystal Reports프로젝트를 이용할 것입니다. 혹시 기억이 안날것 같아서 다시 복습해 보겠습니다. 필자는 아래와 같이 프로젝트를 생성했고, CrystalReport1.rpt라는 파일로 간단하게 보고서를 만들었습니다. 준비가 되지 않았다면 전 강좌에서 소스를 다운받아 오기 바랍니다.


<Crystal Report 프로젝트>


자 그럼 이제 Default.aspx라는 파일에서 전에 작성한 리포트파일을 만들어 보도록 하겠습니다.  Default.aspx파일을 열었으면 왼쪽의 도구상자에 Crystal Reports 부분에 보면 다음과 같은 도구들이 있을 것입니다. 여기서 CrystalReportViewer와 CrystalReportSource컨트롤을 페이지 추가해 봅시다. 참고로 CrystalReportSource는 asp.net2.0에서 새로 추가된 컨트롤입니다.(Source 컨트롤들이 다수 추가될때 묻어 추가되었다는-_-ㅋ)

 
<도구상자안의 리포트 과련 컨트롤>

먼저 CrystalReportSource컨트롤의 속성을 설정해 보도록 하겠습니다. 이 컨트롤을 이용해서 리포트파일을 연결하는 이유는 데이터 파일을 연결하고, 또한 캐쉬기능을 이용할 수 있기 때문입니다. Report속성의 FileName속성에 우리가 연결시킬 CrystalReport 파일의 경로를 적어주기 바랍니다.

<CrystalReportSource의 속성설정>

그다음에는 CrystalReportViewer를 설정해 보도록 하겠습니다. 설정은 간단합니다. ReportSourceID의 아이디를 앞에서 만든 Source와 매칭해주면 되는것입니다.


<CrystalReportViewer의 속성설정>

속성을 위와 같이 설정해주고 나면 아래와 같이 미리 리포트의 모습이 드러나게 됩니다.



믿기지 않겠지만 일단 보고서를 보기 위한 준비는 끝이 났습니다.자 이제 브라우저에서 확인해 보도록 하겠습니다. 그럼 아래와 같이 DB 로그인을 요구하는 페이지가 출력 됩니다. “어!! 연결은 보고서를 만들때 해주지 않았었나?!“ 생각할 수 있습니다. 하지만 보고서에서의 DB연결은 단지 보고서를 디자인하기 위한 스키마를 얻기 위해서 입니다. 즉, 연결정보는 리포트가 가지고 있지 않고, 리포트를 사용하는 툴에서 설정을 해주어야 하는 것이죠. 뭐 일단 결과를 봐야 하기 때문에 암호를 쓰고 넘어가 보도록 하겠습니다.


<Default.aspx의 실행화면>



<암호를 입력한 후의 실행화면>

암호를 넣고 넘어가게 되면 아래와 같이 리포트가 출력되는 것을 볼 수 있습니다. 소스코드를 전혀 손대지 않고 설정만으로도 이런 리포트를 출력할 수 있습니다. 자!! 그런데 저 위의 로그인 창은 어떻게 할 것인지..  이 강좌 맨 처음에 설명한 그림을 살펴보면 답을 찾을 수 있습니다. 바로 TableLogonInfo 클래스를 이용해서 이 로그인 정보를 소스코드로 작성할 수 있는것입니다. 그럼 한번 코드를 작성해 보겠습니다.

protected void Page_Load(object sender, EventArgs e)

{

    //TableLogOnInfo객체생성

    CrystalDecisions.Shared.TableLogOnInfo cryLogonInfo = new CrystalDecisions.Shared.TableLogOnInfo();

   

    //계정정보설정

    cryLogonInfo.ConnectionInfo.ServerName = "HOONS";

    cryLogonInfo.ConnectionInfo.Password = "123";

    cryLogonInfo.ConnectionInfo.UserID = "sa";

    cryLogonInfo.ConnectionInfo.DatabaseName = "pubs";

   

    //계정추가

    CrystalReportViewer1.LogOnInfo.Add(cryLogonInfo);

    //로그인창 false 설정

    CrystalReportViewer1.EnableDatabaseLogonPrompt = false;

}

자 이 코드를 작성해 주면 이제 로그인정보를 입력하지 않아도 바로 아래와 같은 리포트를 실행 할 수 있습니다.


<Default.aspx의 실행화면>

이번 강좌에서는..

이번 강좌에서는 ASP.NET2.0에서 크리스탈 리포트 데이터를 바인딩하는 부분을 다루어 보았습니다. 다음 단원에서는 Windows Form에서 리포트를 바인딩해서 보여지는 부분을 간단히 다루어 보도록 하겠습니다. 웹폼과는 크게 다르지는 않기 때문에 쉽게 다룰 수 있을 것입니다. 기초부터 차근차근 써 나갈 예정이므로 이 글이 너무 쉽다고 생각하시는 분은 조금씩 참고 기달려 주시기 바랍니다. 그럼 다음시간에 뵙겠습니다~

크리에이티브 커먼즈 라이센스
Creative Commons License

[ASP.NET] 특정 폴더에 권한 허용

[■Web Programing/OO ASP.NET OO]
 <!--
  해당 폴더에 사용자 접근을 허용함.
 -->
 <location path="App/SYSTEM">
  <system.web>
   <authorization>
    <allow users="*"/>
   </authorization>
  </system.web>
 </location>

web.config 속성에 추가 하면 됨.

특정 사이트에서 운영사이트의 웹서비스나 혹은

폴더에 접근할 경우 폴더별로 사용자 접근 제한을 할 수 있다.
크리에이티브 커먼즈 라이센스
Creative Commons License