Analizar el encabezado HTTP utilizando Python y TCPFLOW -- python campo con http camp codereview Relacionados El problema

Parse HTTP header using Python and tcpflow


10
vote

problema

Español

Escribí un programa que lee un archivo PCAP y analiza el tráfico HTTP en la PCAP para generar un diccionario que contiene encabezados HTTP para cada solicitud y respuesta en esta PCAP.

Mi código hace lo siguiente:

  1. utiliza TCPFLOW para volver a montar los segmentos de TCP
  2. Lea los archivos generados por TCPFLOW y verifique si se relaciona con HTTP
  3. Si el archivo contiene tráfico HTTP, mi código leerá el archivo y generará un diccionario correspondiente que contiene los campos de encabezado HTTP.

Pruebe mi código con múltiples casos de prueba, pero honestamente no tengo una buena experiencia en Python, ¡así que alguien podría verificarlo por favor, por favor?

  function removeWarning() {   var els = document.getElementsByClassName("hero-action");   var el = els[0]    if (el.textContent.indexOf("office" > -1) && el.textContent.indexOf("is" > -1) && el.textContent.indexOf("closed" > -1)) {     el.style.display = "none";    } }  removeWarning(); 0  
Original en ingles

I wrote a program that reads a pcap file and parses the HTTP traffic in the pcap to generate a dictionary that contains HTTP headers for each request and response in this pcap.

My code does the following:

  1. Uses tcpflow to reassemble the tcp segments
  2. Read the files generated by tcpflow and check if it related to HTTP
  3. If the file contains HTTP traffic, my code will read the file and generate a corresponding dictionary that contains the HTTP header fields.

I test my code with multiple test cases, but honestly I don't have a good experience in Python, so could anyone check it for me please?

import os from os import listdir from os.path import isfile, join from StringIO import StringIO import mimetools def getFields(headers):     fields={}     i=1     for header in headers:         if len(header)==0:            continue          # if this line is complement for the previous line            if header.find(" ")==0 or             header.find("\t")==0:            continue          if len(header.split(":"))>=2:            key = header.split(":")[0].strip()             # if the key has multiple values such as cookie            if fields.has_key(key):               fields[key]=fields[key]+" "+header[header.find(":")+1:].strip()            else:               fields[key]=header[header.find(":")+1:].strip()                while headers[i].find(" ")==0 or                       headers[i].find("\t")==0 :                     fields[key]=fields[key]+" "+headers[i].strip()                     i=i+1               # end of the while loop           # end of the else          else:              # else for [if len(header.split(":"))>=2: ]              print "ERROR: RFC VIOLATION"        # end of the for loop     return fields                 def main():     # you have to write it in the terminal "cd /home/user/Desktop/empty-dir"     os.system("tcpflow -r /home/user/Desktop/12.pcap -v")      for f in listdir("/home/user/Desktop/empty-dir"):         if f.find("80")==19 or f.find("80")==41:            with open("/home/user/Desktop/empty-dir"+f) as fh:                 fields={}                 content=fh.read()  #to test you could replace it with content="any    custom http header"                 if content.find("\r\n\r\n")==-1:                    print "ERROR: RFC VIOLATION"                    return                 headerSection=content.split("\r\n\r\n")[0]                 headerLines=headerSection.split("\r\n")                 firstLine=headerLines[0]                 firstLineFields=firstLine.split(" ")                             if len(headerLines)>1:                    fields=getFields(headerLines[1:])                 if len(firstLineFields)>=3:                                         if firstLine.find("HTTP")==0:                       fields["Version"]=firstLineFields[0]                       fields["Status-code"]=firstLineFields[1]                       fields["Status-desc"]=" ".join(firstLineFields[2:])                    else:                       fields["Method"]=firstLineFields[0]                       fields["URL"]=firstLineFields[1]                       fields["Version"]=firstLineFields[2]                 else:                   print "ERROR: RFC VIOLATION"                   continue                  print fields                 print "__________________"      return 0  if __name__ == '__main__':  main() 
     
       
       

Lista de respuestas

5
 
vote

Nuevas líneas e hendiduras Ayuda al intérprete saber a dónde terminan el código y los bloques terminan, debe ser súper cuidadoso con ellos

Como en su condición de IF, no puede tener una nueva línea entre las condiciones.

  main()1  

Este código se emitirá porque no puede tener una nueva línea en su declaración de condición.

Python es una nueva línea terminada. Debe leer así

  main()2  

mismo con esta pieza de código

  main()3  

Debe leer:

  main()4  
 

New Lines and indentations help the interpreter know where the code terminates and blocks end, you have to be super careful with them

Like in your if condition, you can't have a newline in between the conditions.

if header.find(" ")==0 or      header.find("\t")==0:     continue 

This code will error out because you can't have a new line in your condition statement.

Python is New Line Terminated. It should read like this

if header.find(" ")==0 or header.find("\t")==0     continue 

Same with this piece of code

while headers[i].find(" ")==0 or       headers[i].find("\t")==0 :     fields[key]=fields[key]+" "+headers[i].strip()     i=i+1 

It should read:

while headers[i].find(" ")==0 or headers[i].find("\t")==0 :     fields[key]=fields[key]+" "+headers[i].strip()     i=i+1 
 
 
         
         
3
 
vote

Algunos comentarios breves:

  • Usa cuatro espacios para cada nivel de sangría
  • Usa un espacio alrededor de cada operador ( main()5 , main()6 , ...)
  • Utilice el operador main()7 en lugar del método main()8
  • Uso main()9 en lugar de main()0
  • use main()1 (devuelve un booleano directamente) en lugar de main()2

Algunos comentarios más largos:

  • No estoy seguro de cuál es la lógica con respecto a los nombres de archivos que necesita implementar, pero recomiendo que eche un vistazo al módulo 99887766655443323 .
  • Para el análisis de los campos HTTP, es posible que desee usar una expresión regular.
  • Además, un comentario para dejar claro cuando una solicitud o una respuesta se está analizando haría que el código sea más legible.
  • Cambiar nombre del main()4 Variable Para aclarar lo que se está utilizando para (es main()5 que se supone que es el mismo que main()6 ?). < / li>
  • no reinventar la rueda a menos que necesite. Compruebe si ya hay una biblioteca de análisis HTTP.
 

A few brief comments:

  • Use four spaces for each indentation level
  • Use a space around each operator (==, >=, ...)
  • Use the in operator instead of the has_key method
  • Use subprocess.Popen instead of os.system
  • Use x.startswith(y) (returns a boolean directly) instead of x.find(y) == 0

A few longer comments:

  • I'm not sure what is the logic regarding filenames that you need to implement, but I recommend to have a look at the fnmatch module.
  • For the parsing of the HTTP fields, you might want to use a regular expression.
  • Also, a comment to make clear when a request or a response is being parsed would make the code more readable.
  • Rename the i variable to make clear what is being used for (is headers[i] supposed to be the same as header?).
  • Do not reinvent the wheel unless you need to. Check if there's an HTTP parsing library around already.
 
 
   
   

Relacionados problema

2  Este código frágil ODATA a SQL Server C # no es sostenible con el tiempo  ( This brittle odata to sql server c code isnt sustainable over time ) 
La intención de este código es acceder a una API de ODATA de terceros para capturar solo los datos relevantes a un conjunto interno existente de tablas de ser...

5  C ++ Socket Part-3  ( C socket part 3 ) 
En mis intentos en curso de convertirse en un mejor escritor de blog, tengo algunos códigos más que necesitan revisar. Fuente completa: https://github.com/...

7  ¿Qué es mejor para el segmento de código, los enchufes o los procesos múltiples?  ( What is better for the code segment sockets or multiple processes ) 
Estoy tratando de buscar información de Shoutcast para los usuarios de mutiple al mismo tiempo. Aquí está mi código actual: buf0 Me preguntaba si hace...

1  Clase HTTPRequest usando AsintsTask para la aplicación Android  ( Httprequest class using asynctask for android application ) 
Estoy usando la siguiente clase para recuperar una respuesta HTTP, que contiene datos para mi aplicación de Android. Todo funciona bien, pero hay un problema ...

1  Script por lotes para descargar y extraer nodos.js y paquetes NPM  ( Batch script to download and extract node js and npm packages ) 
El siguiente es mi primer intento real de Scripting por lotes, y lo soy nuevo, así que no estoy seguro de si lo que he hecho es practicar mejor. El código fun...

4  Implementar el servidor HTTP utilizando libevent  ( Implement http server using libevent ) 
#include "fmt/format.h" #include <cstdint> #include <cstdio> #include <event2/event-config.h> #include <event2/util.h> #include <evhttp.h> #include <memory> ...

31  Solicitudes de cliente HTTP realizado a la derecha  ( Http client requests done right ) 
según lo aconsejado por muchos, estoy usando un grupo de clientes, específicamente el Apache poolinghttpclientconnectionmanager . Por simplicidad, lo envuel...

7  Descarga concurrente en Go  ( Concurrent download in go ) 
Escribí un programa para descargar archivos en manera concurrente / paralelo (gomaxprocs & gt; 1). Este es mi programa 2 nd (no juguete) escrito en Go. Po...

10  Analizando un archivo XML para una sola palabra / frase  ( Parsing an xml file for a single word phrase ) 
Esta es una pequeña parte de mi código que me permite solicitar un archivo a través de un balanceador de carga, leer este archivo XML le da el nombre del serv...

0  C ++ Socket Part-4  ( C socket part 4 ) 
En mis intentos en curso de convertirse en un mejor escritor de blog, tengo algunos códigos más que necesitan revisar. Fuente completa: https://github.com/...




© 2022 respuesta.top Reservados todos los derechos. Centro de preguntas y respuestas reservados todos los derechos