[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] 그리드뷰 셀 병합

[■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