Badan Permintaan Log IIS / Data POST

33

Adakah yang tahu bagaimana saya bisa membuat IIS mencatat data POST atau seluruh permintaan HTTP?

HopelessN00b
sumber
ModSecurity tersedia untuk IIS7 + . Ini akan memungkinkan akses penuh ke tajuk dan isi permintaan dan tanggapan.
user2320464

Jawaban:

32

Log IIS hanya merekam informasi querystring dan header tanpa data POST.

Jika Anda menggunakan IIS7, Anda dapat mengaktifkan Pelacakan Permintaan Gagal untuk kode status 200. Itu akan merekam semua data dan Anda dapat memilih jenis data yang akan disertakan.

Di IIS6 atau 7, Anda dapat menggunakan Application_BeginRequest di global.asax dan membuat pendataan data POST Anda sendiri.

Atau, di IIS7, Anda dapat menulis Modul HTTP dengan pencatatan kustom Anda sendiri.

Scott Forsyth - MVP
sumber
+1 - Saya sangat menyukai jawaban Anda, jauh lebih baik daripada jawaban saya. Saya jelas perlu membaca tentang penelusuran permintaan yang gagal, karena saya jelas belum menggunakan IIS7 sebanyak yang seharusnya.
Evan Anderson
Bagaimana Anda bisa "memilih tipe data mana yang akan dimasukkan"?
Pavel Chuchuva
1
Langkah terakhir panduan saat membuat aturan FRT memungkinkan Anda memilih data mana yang akan disertakan. Ini default untuk memasukkan semuanya.
Scott Forsyth - MVP
Saya sedang mencari sesuatu untuk IIS6 tetapi menemukan tautan ini yang menunjukkan logging lanjutan adalah opsi tambahan untuk IIS7. iis.net/learn/extensions/advanced-logging-module/…
andyknas
Tidak muncul (dari url yang Andyknas bagikan) bahwa IIS "logging lanjutan" membentuk posting. Ini menawarkan opsi untuk "klien log", yang akan mencatat posting dari jenis tertentu, tetapi tidak semua posting bentuk, yang OP tampaknya meminta (dan saya bertanya-tanya tentang, saya sendiri.)
charlie arehart
8

Dalam kode yang dikelola, Anda dapat menggunakan metode Response.AppendToLog. Metode ini akan menambahkan data ke bidang cs-uri-stem - total panjang hingga 4100 karakter (tidak berdokumen). Jika Anda melebihi batas itu, maka nilai yang akan dicatat diganti dengan "..."

Misalnya, menambahkan sesuatu seperti ini ke file Global.asax Anda harus melakukan trik (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
            }
        }       
    }
}
 
Geoffrey McGrath
sumber
1
Pada komentar ini, batasnya bukan 4100, ini 4KB yaitu 4096. Jadi kode ini perlu sedikit dimodifikasi untuk mencatat data POST> 4KB dengan benar.
Steven V
1
Saya harus menambahkan HttpContext.Current.Request.InputStream.Position = 0; sebelum request.BinaryRead, jika tidak maka akan mengembalikan array kosong
alex440
3

Sementara saya menghargai bahwa ini adalah pertanyaan lama, saya menemukan kode ini memberi saya apa yang saya butuhkan, file teks dengan header permintaan lengkap dan jawabannya, masukkan ke global.asax.cs Anda:

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);
}

Ini akan membuat file teks untuk setiap permintaan (termasuk gambar) jadi berhati-hatilah saat Anda menggunakannya. Saya hanya menggunakannya untuk mencatat permintaan posting tertentu.

Terry Kernan
sumber
1

Coba ini di file web.config Anda untuk melacak semuanya

<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>
DeepSpace101
sumber
Tetapi perhatikan bahwa fitur FRT secara implisit membatasi jumlah file log yang dibuatnya (yang merupakan hal yang baik), jadi Anda harus mengubahnya, baik di UI atau melalui entri file konfigurasi - dan dengan hati-hati untuk volume log yang akan dibuat bahkan di aplikasi web sederhana.
charlie arehart
0

Ini terlihat menggembirakan, meskipun saya belum mencobanya:

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

Bagaimana ini berbeda dari opsi lain yang ditawarkan di sini, dengan kode di global.asax.cs? Itu hanya akan berfungsi untuk permintaan halaman ASP.NET, bukan halaman lain yang dapat diproses IIS (php, cgi, jsp, cfml). Tautan yang saya bagikan adalah modul yang dapat diaktifkan di IIS untuk situs apa pun (atau di tingkat server) untuk memproses segala jenis permintaan.

charlie arehart
sumber
-4

Coba aktifkan yang berikut ini di pengaturan log IIS Anda:

Metode (metode cs)

Batang URI (batang cs-uri)

URI Query (cs-uri-query)

joeqwerty
sumber
Saya sudah mencoba, belum membantu ... :(
Budda
3
Pengaturan itu tidak akan termasuk data POST
rob