서버에서받은 중복 헤더


119

서버에서받은 중복 헤더

서버의 응답에 중복 헤더가 있습니다. 이 문제는 일반적으로 잘못 구성된 웹 사이트 또는 프록시의 결과입니다. 웹 사이트 또는 프록시 관리자 만이 문제를 해결할 수 있습니다.

오류 349 (net :: ERR_RESPONSE_HEADERS_MULTIPLE_CONTENT_DISPOSITION) : 여러 개의 고유 한 콘텐츠 처리 헤더가 수신되었습니다. 이것은 HTTP 응답 분할 공격으로부터 보호하기 위해 허용되지 않습니다.

크롬에서 pdf로 내보내는 동안이 오류를 발견했습니다.

Response.Buffer = false;
Response.ClearHeaders();
string ext = objProp.PACKAGEFILENAME.Substring(objProp.PACKAGEFILENAME.LastIndexOf("."));
string ext1 = ext.Substring(1);
Response.ContentType = ext1;
Response.AddHeader("Content-Disposition", "target;_blank,attachment; filename=" + objProp.PACKAGEFILENAME);
const int ChunkSize = 1024;
byte[] binary = objProp.PACKAGEDOCUMENT;
System.IO.MemoryStream ms = new System.IO.MemoryStream(binary);
int SizeToWrite = ChunkSize;

for (int i = 0; i < binary.GetUpperBound(0) - 1; i = i + ChunkSize)
{
    if (!Response.IsClientConnected) return;
    if (i + ChunkSize >= binary.Length) SizeToWrite = binary.Length - i;
    byte[] chunk = new byte[SizeToWrite];
    ms.Read(chunk, 0, SizeToWrite);
    Response.BinaryWrite(chunk);
    Response.Flush();
}
Response.Close();

이 문제를 해결하는 방법?


18
또한 파일 이름의 쉼표가 해당 오류를 발생시키는 것으로 나타났습니다 (Chrome에서만). filename = "abc, xyz.pdf"가 유효하다는 것을 알려주는 방법이 있어야한다고 생각합니다. ","를 다른 것으로 바꿀 수 있지만 파일 이름을 그대로 유지하고 반환하고 싶습니다. 내가 시도한 다른 브라우저 (IE, FireFox, Safari, Opera)에는이 문제가 없습니다.
— cusman 2014

29
따라서 파일 이름에 쉼표를 여전히 포함하는 방법이 있습니다. 파일 이름을 인용하면됩니다. Response.AddHeader("content-disposition", "attachment; filename=\"" + FileNameWithCommas + "\"");
— cusman 2014

3
감사합니다 @cusman. 그것은 정확히 내 문제였습니다. 파일 이름에 쉼표가 있고 Chrome에만 문제가 있습니다.
— PeterKA

답변:


236

이것은 조금 오래되었지만 Google 순위에서 높았으므로 Chrome, pdf 디스플레이, 서버에서받은 중복 헤더 에서 찾은 답변을 던질 것이라고 생각했습니다.

기본적으로 내 문제는 파일 이름에 쉼표가 포함되어 있다는 것입니다. 쉼표를 교체하여 제거하면 괜찮습니다. 유효한 파일 이름을 만드는 기능은 다음과 같습니다.

    public static string MakeValidFileName(string name)
    {
        string invalidChars = Regex.Escape(new string(System.IO.Path.GetInvalidFileNameChars()));
        string invalidReStr = string.Format(@"[{0}]+", invalidChars);
        string replace = Regex.Replace(name, invalidReStr, "_").Replace(";", "").Replace(",", "");
        return replace;
    }

22
링크 된 답변에서 @roryok의 의견에서 파일 이름을 따옴표로 묶으면 문제가 해결됩니다. 그리고 실제로 사양 은 파일 이름을 인용해야한다고 말합니다.
— Touko 2013

따옴표는 도움이되지만 추가되어야하지만이 기능은 유효하지 않은 문자를 제거하는 추가 이점이 있으므로 끝에 더 친숙한 이름을 만들 수 있습니다.
— Bryan Roberts

@Younisbarznji는, 당신은 파일 이름에 따옴표를 이스케이프 할 필요가 나를 위해 일한
— coffekid

3
그것은 나를 위해 작동합니다! 쉼표와 공백은 파일 이름에 적합하지 않습니다!
— Hugo

.Replace(";", "").Replace(",", "")이미 RegEx로 대체하는 이유는 무엇 입니까? ;,RegEx 패턴에 추가 :string invalidReStr = string.Format(@"[{0};,]+", invalidChars); string replace = Regex.Replace(name, invalidReStr, "_");
— SBF

97

서버 는 @cusman과 @Touko가 답글에 언급 한대로 파일 이름을 큰 따옴표로 묶어야합니다.

예를 들면 :

Response.AddHeader("Content-Disposition", "attachment;filename=\"" + filename + "\"");

또한 파일 이름의 큰 따옴표를 밑줄로 바꿨습니다.
— Peter L

나는 똑같은 일을했고, 여기에서도 밑줄이있는 파일 이름을 얻었습니다.
— Jamsheer

5

나에게 문제는 파일 이름이 아닌 쉼표에 관한 것이지만 아래와 같습니다.-

Response.ok (streamingOutput, MediaType.APPLICATION_OCTET_STREAM_TYPE) .header ( "content-disposition", " attachment, filename = your_file_name"). build ();

실수로 첨부 파일 뒤에 쉼표를 넣었습니다. 쉼표를 세미콜론으로 바꾸어 해결했습니다.


3

다음과 같이 파일 이름 주위에 큰 따옴표 쌍을 넣으십시오.

this.Response.AddHeader ( "Content-disposition", $ "attachment; filename = \"{outputFileName} \ "");


그러나 다운로드 한 파일 이름에 밑줄이 있습니다.
— Jamsheer

당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.