2013-08-01 2 views
2

저는 여전히 상대적인 멍청한 놈입니다. 그러나 제가 한 작은 테스트의 결과에 놀랐습니다.viewstate에서 항목 수정하기 - 안전할까요?

viewstate에 문자열 목록을 저장하려고합니다. 지금까지 내가 viewstate에서 검색 한 목록을 수정하려면 List.Add를 수행하고 viewstate에 다시 저장했습니다. 당신이 볼 수 있듯이, 나는 목록을 작성

protected void Page_Load(object sender, EventArgs e) 
    { 
     if (!IsPostBack) 
     { 
      List<string> s = new List<string>(); 
      s.Add("abc"); 
      s.Add("def"); 
      ViewState.Add("test", s); 

      s.Add("one"); 
      s.Add("two"); 
     } 
     var t = (List<string>)ViewState["test"]; 

     foreach (var str in t) 
     { 
      Response.Write(str + "<br>"); 
     } 
    } 

, 다음 목록을 수정, viewstate가에 추가 :

그러나, 나는 여기에 그것은 다음과 같습니다, 간단한 테스트를하기로 결정했다. 필자의 경우 목록은 postback 후에도 viewstate에서 수정됩니다.

질문은, 이것을하는 것이 안전한지, 그렇다면 나쁜 습관이라고 생각합니다.

미리 감사드립니다.

답변

0

일종의 주관적이지만, 연습으로 이것에 문제가있는 것은 아닙니다. 이것은 페이지의 다른 양식 컨트롤 내에서 항상 발생하는 것입니다. 컨트롤은 자신에 관련된 viewstate 정보를 편집하고 포스트 백을 통해이를 유지합니다. 뷰 상태에 목록을 추가 한 후 수정하면 목록이 변경되는 이유는 즉시 직렬화되지 않는다는 것입니다. 이 목록은 요청을 완료하기 직전에 페이지가 viewstate를 직렬화 할 때까지 viewstate 컬렉션에 대한 참조로 전달됩니다.

+0

매우 유익한 - 왜 이런 일이 벌어지고 있는지 이해할 수 있으며, 따라서이 방법을 사용하기에 용인 할 수 있고 받아 들일 수없는 시점을 결정할 수 있습니다. – dotnetnoob

+0

viewstate에 데이터를 저장하는 데 심각한 결과가 있기 때문에 정확한 정보가 없다고 말할 수는 없습니다. 제어 상태는 사용자가 제어 상태를 직접 변경할 수 있기 때문에 한 가지 일이지만 임의의 데이터는 다른 것입니다. – Andy

+0

@dotnetnoob ViewState에 데이터를 저장하는 데 약간의 부정적 결과가있을 수 있습니다. 그 대답은 항상 안전하거나 좋은 생각이 아닙니다. – Andy

1

ViewState는 다시 게시 할 때 클라이언트 페이지에만 serialize됩니다. 이전에는 메모리에 저장되어있어 편집하기에 안전합니다.

  1. 저장 민감한 데이터 : 일반적으로

    public Class1 MyClass1 
    { 
        get { return (Class1)ViewState["MyClass1"]; } 
        set { ViewState["MyClass1"] = value; } 
    } 
    

    , 나는 다음을 제외하고, 그렇게 그것을 나쁜 관행을 고려하지 않을 것이다 : 나는 종종 속성에 후원자로의 ViewState를 사용

    - 데이터가 클라이언트에 직렬화되기 때문에 변경되기 쉽습니다.
  2. 많은 양의 데이터 - 데이터가 클라이언트에 유지되므로 많은 양의 페이지로드 시간이 현저하게 늘어납니다.
+0

나는 그것을 나쁜 습관이라고 생각할 것이다. 다른 단계를 밟지 않는 한보기 상태가 변경되어 보안 문제가 발생할 수 있습니다. 또한 더 많이 보낼수록 응답에 더 많은 데이터가 전송되어 페이지로드 시간이 늘어납니다. – Andy

+0

@Andy 대용량의 데이터 나 민감한 데이터는 절대적으로 중요합니다. 그러나, 거기에 저장하는 것이 좋습니다 데이터 형식보다 viewstate 데이터를 편집하는 특정 더 질문 것 같습니다. – Khan

+0

답변이 수정되면 다운 vote를 제거하겠습니다. – Andy

1

이 현상이 나타나는 이유는 Asp.Net WebForms page life cycle 때문입니다. 뷰 상태를 수정하는 시점에서 Asp.Net은 아직 페이지 출력을 HTML로 렌더링하지 않았습니다. 사전에 대한 참조를 추가하고 있기 때문에 렌딩 이전에 변경 한 내용이 표시됩니다. 그러한 변화가 나타나지 않을 수도있는 라이프 사이클의 또 다른 포인트가 있습니다. 그렇다고해서 그것이 사실인지 아닌지를 조사하지는 않았습니다.

그러나 나는이 좋은 방법을 고려하지 않을 것입니다. ViewState는 웹 페이지의 숨겨진 양식 필드로 직렬화되므로 페이지의 모든 데이터가 페이지의 일부입니다. 이것은 클라이언트에게 보내지는 응답의 크기를 증가시킬 수 있습니다 (많은 데이터를 저장하는 경우). 숨겨진 양식 필드이기 때문에 서버에 대한 요청도 더 커집니다.

보안 구멍이 열릴 수도 있습니다. 비록 당신이 secure it 수있는 방법이 있지만, 당신은 절대적으로 페이지를 렌더링하지 않아도 모든 데이터를 보내지 않는 것이 더 좋다고 말할 것입니다.

웹 팜의 부하 분산 장치 뒤에 응용 프로그램이있는 경우 추가 작업을해야하지만 사용자에게 특정한 상태를 Session에 저장하는 것이 좋습니다. 세션에 데이터를 저장하면 다른 사용자와 격리되어 데이터를 클라이언트에 노출시키지 않아도됩니다.