programing

이 "Base-64 문자 배열에 대한 잘못된 길이"의 원인

bestprogram 2023. 4. 27. 22:53

이 "Base-64 문자 배열에 대한 잘못된 길이"의 원인

저는 여기서 할 일이 거의 없습니다.로컬로 복제할 수 없지만 사용자에게 오류가 발생하면 자동 전자 메일 예외 알림이 표시됩니다.

Invalid length for a Base-64 char array.

  at System.Convert.FromBase64String(String s)
  at System.Web.UI.ObjectStateFormatter.Deserialize(String inputString)
  at System.Web.UI.ObjectStateFormatter.System.Web.UI.IStateFormatter.Deserialize(String serializedState)
  at System.Web.UI.Util.DeserializeWithAssert(IStateFormatter formatter, String serializedState)
  at System.Web.UI.HiddenFieldPageStatePersister.Load()

뷰 상태에 할당되는 데이터에 문제가 있다고 생각하는 경향이 있습니다.예:

List<int> SelectedActionIDList = GetSelectedActionIDList();
ViewState["_SelectedActionIDList"] = SelectedActionIDList;

오류를 로컬로 재현하지 않고는 오류의 원인을 추측하기가 어렵습니다.

이 오류에 대한 경험이 있는 사람이 있다면, 저는 당신이 무엇을 발견했는지 정말 알고 싶습니다.

urlDecode는 텍스트를 처리한 후 모든 '+' 문자를 '...' 문자로 대체하므로 오류가 발생합니다.이 문을 호출하여 Base 64와 다시 호환되도록 해야 합니다.

        sEncryptedString = sEncryptedString.Replace(' ', '+');

저는 이러한 오류가 적절한 크기의 뷰 상태와 공격적인 콘텐츠 필터링 장치/방화벽(특히 K-12 교육 기관을 다룰 때)의 조합으로 인해 발생하는 것을 보았습니다.

우리는 SQL Server에 Viewstate를 저장하여 이 문제를 해결했습니다.그 경로를 가기 전에 큰 것을 저장하지 않고 필요 없는 모든 컨트롤에 대해 해제하여 뷰 상태 사용을 제한하는 것이 좋습니다.

SQL Server 를 ViewState 저 하장조
- - PageStatePersister
Alliance - ASP 방법 - SQL Server에서 사용할 수 .
프로젝트 - Provider - 코드 프로젝트

제 생각에는 어떤 것이 인코딩 또는 디코딩을 너무 자주 하거나 여러 줄이 있는 텍스트를 가지고 있는 것 같습니다.

Base64 문자열은 4자 길이의 배수여야 합니다. 매 4자는 3바이트의 입력 데이터를 나타냅니다.어떻게든, 보기 상태 데이터가 ASP에 의해 다시 전달됩니다.NET이 손상되었습니다. 길이가 4의 배수가 아닙니다.

이 경우 사용자 에이전트를 기록합니까?어딘가에서 브라우저가 잘못 작동한 것이 아닌지 궁금합니다.또 다른 가능성은 나쁜 짓을 하는 대리인이 있다는 것입니다.마찬가지로 요청의 내용 길이를 기록하여 큰 요청에 대해서만 발생하는지 여부를 확인합니다.

사용해 보십시오.

public string EncodeBase64(string data)
{
    string s = data.Trim().Replace(" ", "+");
    if (s.Length % 4 > 0)
        s = s.PadRight(s.Length + 4 - s.Length % 4, '=');
    return Encoding.UTF8.GetString(Convert.FromBase64String(s));
}
int len = qs.Length % 4;
            if (len > 0) qs = qs.PadRight(qs.Length + (4 - len), '=');

qs 인코딩 "base64" 입니다.

다른 사람들이 언급했듯이 일부 방화벽과 프록시가 많은 양의 ViewState 데이터가 포함된 페이지에 대한 액세스를 금지할 때 이 문제가 발생할 수 있습니다.

ASP.NET 2.0은 ViewState를 관리 가능한 청크로 분할하여 ViewState가 문제 없이 프록시/방화벽을 통과할 수 있도록 하는 ViewState 청크 메커니즘을 도입했습니다.

이 기능을 사용하려면 web.config 파일에 다음 행을 추가하기만 하면 됩니다.

<pages maxPageStateFieldLength="4000">

이 방법을 ViewState 크기를 줄이는 대신 사용해서는 안 되지만 공격적인 프록시 등으로 인해 발생하는 "Invalid length for a Base-64 char array" 오류에 대한 효과적인 백스톱이 될 수 있습니다.

슬프게도 이것은 답이 아닙니다.한동안 간헐적인 오류에 부딪혔고 마침내 그것을 고치려고 할 정도로 짜증이 났지만, 저는 아직 해결책을 찾지 못했습니다.하지만 저는 다른 사람들에게 도움이 될 수도 있는 제 문제를 재현하는 방법을 결정했습니다.

나의 경우 앱의 DB도 있는 것은 오로지 로컬 호스트 문제입니다.이거는.VS2005로 편집 중인 NET 2.0 앱.Win7 64비트 시스템에는 VS2008 및 도 있습니다.NET 3.5가 설치되었습니다.

다음은 다양한 형식에서 오류를 생성하는 방법입니다.

  1. 양식의 새 사본을 로드합니다.
  2. 일부 데이터를 입력하거나 양식의 컨트롤을 사용하여 포스트백을 입력합니다.상당한 지연이 없는 한 원하는 대로 반복하고 오류가 발생하지 않습니다.
  3. 잠시 기다린 후(1~2분, 5분 이내) 다른 포스트백을 시도합니다.

"에서 " is reset" (이 재설정됨), "localhost" (로컬호스트) 1~2분 지연, "연결이 재설정되었습니다.global.asax error logs: " 응용 프로그램 오류 트랩 로그:

Application_Error event: Invalid length for a Base-64 char array.
Stack Trace:
     at System.Convert.FromBase64String(String s)
     at System.Web.UI.ObjectStateFormatter.Deserialize(String inputString)
     at System.Web.UI.Util.DeserializeWithAssert(IStateFormatter formatter, String serializedState)
     at System.Web.UI.HiddenFieldPageStatePersister.Load()

이 경우 보기 상태의 크기가 아니라 페이지 및/또는 보기 상태 캐싱과 관련된 문제입니다.<pages> 변수 - 매개 변수enableEventValidation="false",그리고.viewStateEncryption="Never"에 시대에Web.config동작을 변경하지 않았습니다.▁did▁▁neither도 설정하지 않았습니다.maxPageStateFieldLength다소곳이

HttpHandlers를 살펴봅니다.압축 툴(Telerik의 RadCompression)을 구현한 후 지난 몇 달 동안 몇 가지 이상하고 완전히 무작위적인 오류를 발견했습니다.다음과 같은 오류를 발견했습니다.

  • 시스템. 웹.HttpException:데이터의 유효성을 검사할 수 없습니다.

  • 시스템. 웹.HttpException:클라이언트의 연결이 끊어졌습니다.---> 시스템.Web.UI.ViewStateException:보기 상태가 잘못되었습니다.

그리고.

  • System.FormatException:Base-64 문자 배열의 길이가 잘못되었습니다.

  • 시스템. 웹.HttpException:클라이언트의 연결이 끊어졌습니다. ---> 시스템.Web.UI.ViewStateException:보기 상태가 잘못되었습니다.

저는 이것에 대해 제 블로그에 썼습니다.

이것은 거대한 뷰 상태 때문입니다, 저의 경우 뷰 상태를 사용하지 않았기 때문에 운이 좋았습니다.방금 추가했습니다.enableviewstate="false"양식 태그 및 보기 상태가 35k에서 100자로 변경되었습니다.

구성원 자격에 대한 초기 테스트 중.ValidateUser with a SqlMembershipProvider, salt와 결합된 해시(SHA1) 알고리즘을 사용하는데, salt 길이를 4로 나눌 수 없는 길이로 변경하면 이 오류가 발생했습니다.

위의 수정 사항을 시도해 본 적은 없지만, 소금이 변경되고 있다면, 누군가가 이 특정 오류의 원인을 지적하는 데 도움이 될 수 있습니다.

Jon Skeet가 말했듯이, 문자열은 4바이트의 배수여야 합니다.하지만 여전히 오류가 발생했습니다.

적어도 디버그 모드에서는 제거되었습니다.중단점을 지정합니다.Convert.FromBase64String()그런 다음 코드를 통과합니다.기적적으로 저는 오류가 사라졌습니다 :) 아마도 다른 사람들이 보고한 것처럼 View 상태 및 유사한 다른 문제와 관련이 있을 것입니다.

저를 도와준 @jalchr의 솔루션 외에도, 저는 전화할 때 그것을 발견했습니다.ATL::Base64EncodeC++ 응용 프로그램에서 ASP로 전달하는 콘텐츠를 인코딩합니다.NET 웹 서비스, 당신은 다른 것도 필요합니다.에 더하여

sEncryptedString = sEncryptedString.Replace(' ', '+'); 

@httpschr의 솔루션에서, 당신은 또한 당신이 플래그를 사용하지 않는지 확인할 필요가 있습니다.ATL::Base64Encode:

 BOOL bEncoded = Base64Encode(lpBuffer,
                    nBufferSizeInBytes,
                    strBase64Encoded.GetBufferSetLength(base64Length),
                    &base64Length,ATL_BASE64_FLAG_NOCRLF/*|ATL_BASE64_FLAG_NOPAD*/);

언급URL : https://stackoverflow.com/questions/858761/what-causing-this-invalid-length-for-a-base-64-char-array