ข้อมูลคำขอ / ข้อมูล POST ของ IIS Log


33

ไม่มีใครรู้ว่าฉันจะได้รับ IIS เพื่อบันทึกข้อมูล POST หรือคำขอ HTTP ทั้งหมดหรือไม่


ModSecurity สามารถใช้ได้สำหรับการ IIS7 + มันจะช่วยให้เข้าถึงส่วนหัวและร่างกายของทั้งคำขอและการตอบสนอง
user2320464

คำตอบ:


32

IIS บันทึกเฉพาะการสอบถามการสืบค้นและข้อมูลส่วนหัวโดยไม่มีข้อมูล POST

หากคุณใช้ IIS7 คุณสามารถเปิดใช้งานการติดตามคำขอล้มเหลวสำหรับรหัสสถานะ 200 ซึ่งจะบันทึกข้อมูลทั้งหมดและคุณสามารถเลือกประเภทของข้อมูลที่จะรวม

ใน IIS6 หรือ 7 คุณสามารถใช้ Application_BeginRequest ใน global.asax และสร้างการบันทึกข้อมูล POST ของคุณเอง

หรือใน IIS7 คุณสามารถเขียนโมดูล HTTP ด้วยการบันทึกที่กำหนดเองของคุณเอง


+1 - ฉันชอบคำตอบของคุณดีกว่าของฉันเอง ฉันต้องอ่านการติดตามคำขอที่ล้มเหลวอย่างชัดเจนเนื่องจากฉันไม่ได้ใช้ IIS7 เท่าที่ควร
Evan Anderson

คุณจะ "เลือกประเภทข้อมูลที่จะรวม" ได้อย่างไร?
Pavel Chuchuva

1
ขั้นตอนสุดท้ายของตัวช่วยสร้างเมื่อสร้างกฎ FRT ช่วยให้คุณสามารถเลือกข้อมูลที่จะรวม เป็นค่าเริ่มต้นที่จะรวมทุกอย่าง
Scott Forsyth - MVP

ฉันกำลังมองหาบางอย่างสำหรับ IIS6 แต่เจอลิงค์นี้ซึ่งแสดงการบันทึกขั้นสูงเป็นตัวเลือกเสริมสำหรับ IIS7 iis.net/learn/extensions/advanced-logging-module/ …
andyknas

มันจะไม่ปรากฏ (จาก url Andyknas ที่แชร์) ว่า IIS "การบันทึกขั้นสูง" บันทึกการโพสต์แบบฟอร์ม มันมีตัวเลือกสำหรับ "การเข้าสู่ระบบของลูกค้า" ซึ่งจะเข้าสู่ระบบโพสต์ของการจัดเรียงโดยเฉพาะอย่างยิ่ง แต่ไม่ทั้งหมดโพสต์รูปแบบซึ่ง OP ที่ดูเหมือนว่าจะได้รับการร้องขอ (และผมสงสัยเกี่ยวกับตัวเอง.)
ชาร์ลี arehart

8

ในรหัสที่มีการจัดการคุณสามารถใช้การ Response.AppendToLog วิธี วิธีนี้จะผนวกข้อมูลไปยังฟิลด์ cs-uri-stem - ความยาวรวมได้ถึง 4100 ตัวอักษร (ไม่มีเอกสาร) หากคุณเกินขีด จำกัด นั้นค่าที่จะถูกบันทึกไว้จะถูกแทนที่ด้วย "... "

ตัวอย่างเช่นการเพิ่มสิ่งนี้ลงในไฟล์ Global.asax ของคุณควรทำเคล็ดลับ (C #):

void Application_EndRequest(Object Sender, EventArgs e)
{
    if( "POST" == Request.HttpMethod )
    {
        byte[] bytes    = Request.BinaryRead(Request.TotalBytes);
        string s    = Encoding.UTF8.GetString(bytes);
        if (!String.IsNullOrEmpty(s))
        {
            int QueryStringLength = 0;
            if (0 < Request.QueryString.Count)
            {
                QueryStringLength = Request.ServerVariables["QUERY_STRING"].Length;
                Response.AppendToLog( "&" );
            }

            if (4100 > ( QueryStringLength + s.Length ) )
            {
                Response.AppendToLog(s);
            }
            else
            {
                // append only the first 4090 the limit is a total of 4100 char.
                Response.AppendToLog(s.Substring(0, ( 4090 - QueryStringLength )));
                // indicate buffer exceeded
                Response.AppendToLog("|||...|||");
                // TODO: if s.Length >; 4000 then log to separate file
            }
        }       
    }
}
 

1
จากความคิดเห็นนี้ขีด จำกัด ไม่ได้เป็น 4100 เป็น 4KB ซึ่งเป็น 4096 ดังนั้นจึงต้องแก้ไขรหัสนี้เล็กน้อยเพื่อบันทึกข้อมูล POST> 4KB อย่างถูกต้อง
Steven V

1
ฉันต้องเพิ่ม HttpContext.Current.Request.InputStream.Position = 0; ก่อนที่จะร้องขอ
BinaryRead

3

ในขณะที่ฉันชื่นชมว่านี่เป็นคำถามเก่าฉันพบว่ารหัสนี้ให้สิ่งที่ฉันต้องการอย่างแน่นอนไฟล์ข้อความที่มีส่วนหัวคำขอที่สมบูรณ์และการตอบกลับใส่ไว้ใน global.asax.cs ของคุณ:

protected void Application_BeginRequest(Object Sender, EventArgs e)
{
    string uniqueid = DateTime.Now.Ticks.ToString();
    string logfile = String.Format("C:\\path\\to\\folder\\requests\\{0}.txt", uniqueid);
    Request.SaveAs(logfile, true);
}

การทำเช่นนี้จะสร้างไฟล์ข้อความสำหรับคำขอแต่ละรายการและทุกครั้ง (รวมถึงรูปภาพ) ดังนั้นโปรดระมัดระวังในการใช้งาน ฉันใช้เพื่อบันทึกคำขอโพสต์เฉพาะเท่านั้น


1

ลองสิ่งนี้ในไฟล์ web.config ของคุณเพื่อติดตามทุกอย่าง

<tracing>
  <traceFailedRequests>
    <remove path="*" />
    <add path="*">
      <traceAreas>
        <add provider="ASP" verbosity="Verbose" />
        <add provider="ASPNET" areas="Infrastructure,Module,Page,AppServices" verbosity="Verbose" />
        <add provider="ISAPI Extension" verbosity="Verbose" />
        <add provider="WWW Server" areas="Authentication,Security,Filter,StaticFile,CGI,Compression,Cache,RequestNotifications,Module,FastCGI,WebSocket,Rewrite" verbosity="Verbose" />
      </traceAreas>
      <failureDefinitions timeTaken="00:00:00" statusCodes="200-999" />
    </add>
  </traceFailedRequests>
</tracing>

แต่โปรดทราบว่าฟีเจอร์ FRT จะ จำกัด จำนวนไฟล์บันทึกที่สร้าง (ซึ่งเป็นสิ่งที่ดี) โดยปริยายดังนั้นคุณจะต้องเปลี่ยนสิ่งนั้นทั้งใน UI หรือผ่านรายการไฟล์ปรับแต่ง - และด้วยความระมัดระวังเนื่องจากปริมาณของ บันทึกที่จะสร้างในแอปทางเว็บที่เรียบง่าย
23420 charlie arehart

0

สิ่งนี้ดูมีกำลังใจแม้ว่าฉันยังไม่ได้ลอง:

https://www.codeproject.com/Tips/1213108/HttpModule-for-Logging-HTTP-POST-Data-in-IIS-Log

สิ่งนี้แตกต่างจากตัวเลือกอื่น ๆ ที่นำเสนอที่นี่ด้วยรหัสใน global.asax.cs อย่างไร ที่จะทำงานสำหรับการร้องขอหน้า ASP.NET เท่านั้นไม่ใช่หน้าอื่น IIS อาจดำเนินการ (php, cgi, jsp, cfml) ลิงก์ที่ฉันแชร์คือโมดูลที่สามารถเปิดใช้งานใน IIS สำหรับไซต์ใด ๆ (หรือที่ระดับเซิร์ฟเวอร์) เพื่อดำเนินการตามคำขอประเภทใดก็ได้


-4

ลองเปิดใช้งานสิ่งต่อไปนี้ในการตั้งค่าบันทึก IIS ของคุณ:

วิธีการ (cs-method)

URI Stem (cs-uri-stem)

URI Query (cs-uri-query)


ฉันพยายามแล้วยังไม่ได้ช่วย ... :(
Budda

3
การตั้งค่าเหล่านั้นจะไม่รวมข้อมูล POST
ปล้น
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.