문제

데이터베이스에서 레코드를 검색하고 웹 페이지에 표시해야 하지만(ASP.NET을 사용하고 있습니다) 나중에 해당 ID를 사용하여 데이터베이스로 돌아갈 수 있도록 해당 레코드의 ID(기본 키)를 어딘가에 저장해야 합니다. 아마도 업데이트를 할 것입니다).

ViewState나 숨겨진 필드에 ID를 저장하는 등 이를 수행하는 방법이 몇 가지 있다는 것을 알고 있습니다. 그러나 가장 좋은 방법은 무엇이며 다른 방법보다 이 방법을 선택하는 이유는 무엇입니까?

도움이 되었습니까?

해결책

때에 따라 다르지.

누군가가 레코드 ID를 보더라도 상관없나요?그렇게 하면 숨겨진 필드와 viewstate가 모두 적합하지 않습니다.세션 상태에 저장하거나 viewstate를 암호화해야 합니다.

누군가가 가짜 ID로 양식을 제출해도 상관없나요?그렇게 하면 숨겨진 필드를 사용할 수 없습니다(그리고 보너스로 CSRF 보호를 살펴봐야 합니다).

변경할 수 없기를 원하지만 (일부 작업을 통해) 볼 수 있도록 공개되는 것에 신경쓰지 않으시나요?viewstate를 사용하고 페이지에서(또는 전체적으로) 활성화ViewStateMac="true"를 설정하세요.

숨기고 보호하고 싶지만 세션 상태를 사용할 수 없나요?다음 web.config 항목을 설정하여 viewstate를 암호화하세요.

<pages enableViewState="true" enableViewStateMac="true" />
<machineKey ... validation="3DES" />

다른 팁

최종 사용자가 ID를 알기를 원하시나요?예를 들어 id 값이 데이터베이스의 표준 1,1 시드인 경우 숫자를 보고 고객 수를 확인할 수 있습니다.(viewstate가 할 수 있는 것처럼) 값을 암호화하면 키를 해독하는 것이 훨씬 더 어려울 것입니다(그러나 불가능하지는 않습니다).

대안은 이를 세션에 저장하는 것입니다. 이렇게 하면 애플리케이션에 (정수인 경우 매우 작은) 성능 저하가 발생하지만 사용자로서 해당 기본 키를 볼 수 없다는 의미입니다.또한 객체를 애플리케이션의 다른 부분에 노출합니다. 노출을 원하거나 원하지 않을 수 있습니다(세션 객체는 지워질 때까지 유지되거나 설정된 시간(예: 5분)이 경과하거나 브라우저 창이 닫힐 때까지 중 더 빠른 쪽이 적용됩니다). .

보기 상태 값은 다시 게시할 때마다 클라이언트에 추가 로드를 발생시킵니다. 왜냐하면 보기 상태는 페이지의 개체를 저장할 뿐만 아니라 뒤로 버튼을 사용하는 경우 개체도 기억하기 때문입니다.이는 다시 게시할 때마다 viewstate가 약간 더 커지고 사용하기가 더 어려워진다는 것을 의미합니다.브라우저가 다른 페이지로 이동할 때까지 해당 페이지에만 존재합니다.

이런 페이지에 ID를 저장할 때마다 항상 속성을 생성합니다.

public int CustomerID {
    get { return ViewState("CustomerID"); }
    set { ViewState("CustomerID") = value; }
}

또는

    Public Property CustomerID() As Integer
        Get
            Return ViewState("CustomerID")
        End Get
        Set(ByVal value As Integer)
            ViewState("CustomerID") = value
        End Set
    End Property

이렇게 하면 Viewstate에서 세션 변수나 숨겨진 양식 필드로 변경하기로 결정한 경우 속성 참조에서 변경하기만 하면 페이지의 나머지 부분에서 "Page.CustomerID"를 사용하여 변수에 액세스할 수 있습니다.

ViewState는 옵션입니다.현재 있는 페이지에만 유효합니다.Session 개체와 같은 다른 리소스에 대한 요청은 전달되지 않습니다.

숨겨진 필드도 작동하지만 페이지 소스를 볼 수 있을 만큼 똑똑한 사람에게 애플리케이션에 대한 약간의 정보가 누출되고 있습니다.

또한 전체 기록을 ViewState에 저장하고 해당 서버로의 또 다른 왕복을 피할 수도 있습니다.

나는 개인적으로 세션에 무엇이든 넣는 것에 대해 매우 경계합니다.작업자 프로세스가 너무 많이 순환되어 세션 상태가 손실되었습니다.

문제를 설명했듯이 숨겨진 필드나 페이지의 뷰 상태에 넣겠습니다.

또한, 이와 같은 데이터를 어디에 넣을 것인지 결정할 때는 항상 데이터의 범위를 살펴보세요.범위가 단일 페이지로 지정됩니까, 아니면 전체 세션으로 지정됩니까?대답이 '세션'이면 쿠키에 넣습니다.(부인 성명:우리는 쿠키가 활성화된 인트라넷 앱을 작성합니다.)

간단한 ID가 쿼리 문자열로 전달하도록 선택하면 포스트백을 수행할 필요가 없으며 사용자와 검색 엔진이 페이지에 더 쉽게 액세스할 수 있습니다.

Session["MyId"]=myval;

조금 더 안전하고 본질적으로 뷰 상태에 넣는 것과 동일한 메커니즘을 제공합니다.

저는 숨겨진 필드에 그런 걸 붙이는 편이에요. 조금만 해주세요.

 <asp:label runat=server id=lblThingID visible=false />
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top