Guten Morgen zusammen,
ich habe eine Frage zur Softwareentwicklung und zwar kennt
wahrscheinlich der ein oder andere diese Datenbank:
https://cve.mitre.org/data/downloads/index.html
Ich würde gerne diese CVE Meldungen automatisieren, also das im Prinzip
die Mailinglisten oder Feeds dort (bin mir nicht sicher was da zur
Verfügung steht) automatisch gescannt und nur die Teile der
Open-Source-Software dann ausgegeben werden.
Das müsste ja irgendwie geskriptet werden. Es könnte sich dabei um ein
einfaches Tool handeln, dass 1x pro Tag aufgerufen wird oder auch etwas,
dass auf einem Server läuft und automatisiert 1x pro Tag eine Abfrage
startet.
Die Programmiersprache spielt an sich keine Rolle. XML sollte es nicht
sein, da die Syntax sehr gewöhnungsbedürftig ist. Mit C/C++ und ein
bishen Java bin ich vertraut. Theoretisch würde auch ein Tool reichen,
wo einfach die Daten von der Webseite abgerufen und in eine txt-Datei
abgelegt werden.
Das Ablegen in eine Datei ist ja kein Problem, da es dafür genügend
fstream-Funktionen gibt. Aber erst einmal interessiert mich, wie ich die
Daten vom oben angegebenen Link auf meinem Rechner über ein einfaches
Tool bekomme? Natürlich wäre ein google-spreedsheet was feines. Auch
über Exel wäre sowas denkbar, aber für den Anfang wäre ein einfaches
C/C++ oder Java Programm am sinnvollsten. Oder über eine Skriptsprache
entweder lokal oder auf einem Server. Ich hoffe, dass hier einige
Experten sind, die mir helfen können.
Am Ende sollten die Datei in einem Dokument auf google-Drive auftauchen
und verschiedenen Statusmeldungen haben, aber davon bin ich noch weit
entfernt.
Ich habe jetzt eine Lösung, wo ich mithilfe von Python die csv
herunterlade und anschließend die erste Spalte nach Schlüsselwörtern
durchsuche:
with open('allitems.csv', 'rb') as csvfile:
header = next(csvfile).strip("\n").split(",")
reader = csv.reader(csvfile)
results = filter(lambda row: row[0] == {'Test1', Test2}, list(reader))
Nur was ist, wenn ich in row[0] ganze Sätze habe, und nur nach
Schlüsselwörtern suchen möchte und anschließend diese Zeile komplett
ausgeben möchte?
Alex schrieb:> Nur was ist, wenn ich in row[0] ganze Sätze habe, und nur nach> Schlüsselwörtern suchen möchte und anschließend diese Zeile komplett> ausgeben möchte?
Man holt sich halt erst mal den gesamten Spalteneintrag,
den sucht man dann nach seinen Schlüsselwörtern, dann den nächsten....
Sorry nutze kein Python.
Alex schrieb:> Nur was ist, wenn ich in row[0] ganze Sätze habe, und nur nach> Schlüsselwörtern suchen möchte und anschließend diese Zeile komplett> ausgeben möchte?
Sinngemaess:
gibt es eine moglichkeit, das ganze mit Java oder c++ zu lösen ? also
die Datei herunterladen, CSV Datei bzw Zeilen nach Schlüsselwörtern
durchsuchen und dann die entsprechenden Zeilen zusammenführen und in
eine neue Datei speichern ? das ganze eventuell auf einem server.
Alex schrieb:> gibt es eine moglichkeit, das ganze mit Java oder c++ zu lösen ? also> die Datei herunterladen, CSV Datei bzw Zeilen nach Schlüsselwörtern> durchsuchen und dann die entsprechenden Zeilen zusammenführen und in> eine neue Datei speichern ?
Klar geht das, aber warum? Leichter als mit Python wird es in C++ ganz
sicher nicht. Ganz im Gegenteil...
Alex schrieb:> with open('allitems.csv', 'rb') as csvfile:
Warum willst du eine Textdatei im binaermodus oeffnen? Probleme beim
oeffnen/lesen? Einfach das richtige encoding benutzen.
1
f = open('allitems.csv', 'r', encoding='iso-8859-15')
Klasse wäre, wenn man jetzt eine Möglichkeit hätte, eine Vergleich
zwischen Downloadfile und aktueller tabelle bezüglich neuer Meldungen
anzustellen.
Ich habe alternativ auch eine zweite Lösung mittels Java. Hier der Teil,
der eine komplette Zeile nach Schlüsselwörtern durchsucht.
if(fstring.contains("XnView Classic for Windows"))
23
{
24
System.out.format("%s ",fstring);
25
}
26
}
27
}
28
}
29
}
Problem hierbei ist nur, dass eben komplette Zeilen gelesen werden.
Eleganter wäre es, wenn ich die Elemente durch ";" im CSV trennen
könnte, um beispielsweise nur das erste Array-Element zu durchsuchen.
Alex schrieb:> Aber mit> python bricht der Download bei ca. 22% stets ab:
Bei mir (OS: Linux) laeuft der Download mit deinem Code durch. Daran
liegt es also nicht. Kann es sein, dass der Server die Verbindung
unterbricht? Kommt denn irgendeine Fehlermeldung (abbruch) oder bleibt
das Script einfach haengen?
Alex schrieb:> Klasse wäre, wenn man jetzt eine Möglichkeit hätte, eine Vergleich> zwischen Downloadfile und aktueller tabelle bezüglich neuer Meldungen> anzustellen.
Was meinst du mit 'aktueller Tabelle'? Meinst du das, was du dir schon
rausgesucht hast?
Erstell dir doch eine kleine Datenbank (SQLite) wo du die fuer dich
wichtigen CVE reinschreibst. Wenn du die CSV-Datei erneut runterlaedst
brauchst du nur gucken ob da CVE drin sind die dich interessieren, und
wenn ja, einfach gucken ob die schon in deiner DB steht. Wenn nein, dann
einfuegen in die DB.
Ansonsten mit einem diff-Tool (meld, winmerge, etc.) deiner wahl.
Problem hierbei ist nur, dass immer die komplette CSV geladen wird,
statt einfach die neuen Einträge hinzuzufügen. Zweitens: Wie kann mir
automatisiert bei Google Drive im Excelfile nur die Einträge anzeigen
lassen, die ich anhand von keywords prüfe?
Alex schrieb:> Das Script bleibt einfach hängern.
Wie waere es, wenn du einfach mal versuchst festzustellen, warum und
an welcher Stelle dein Script haengen bleibt, anstatt wild
irgendwelche loesungen (in den unterschiedlichsten Sprachen) zu
kopieren?
Das Problem mit dem Python-Download könnte alles mögliche sein, wenn es
auf dem einen Rechner funktioniert und auf dem anderen nicht.
Das Problem mit Google Drive ist nicht so einfach. Ich möchte eine Datei
in Exycel einlesen, nutze dafür Standardbefehle, erhalte aber nur einen
Teil der Daten.
Alex schrieb:> Das Problem mit dem Python-Download könnte alles mögliche sein, wenn es> auf dem einen Rechner funktioniert und auf dem anderen nicht.
Ja, genau deswegen sollte man da vielleicht mal gucken, weshalb es bei
dir nicht funktioniert, anstatt wild zig Dinge zu probieren.
Hab das ganze jetzt mal an Python3 angepasst
Alex schrieb:> ich habe eine Frage zur Softwareentwicklung und zwar kennt> wahrscheinlich der ein oder andere diese Datenbank:> https://cve.mitre.org/data/downloads/index.html>> Ich würde gerne diese CVE Meldungen automatisieren, also das im Prinzip> die Mailinglisten oder Feeds dort (bin mir nicht sicher was da zur> Verfügung steht) automatisch gescannt und nur die Teile der> Open-Source-Software dann ausgegeben werden.
Dein gesamter Beitrag ist für mich etwas verwirrend; das geht schon in
diesem Absatz los. Warum bist Du Dir nicht sicher, was da zur Verfügung
steht? Das ist doch offensichtlich: es sind Abzüge der CVE-Datenbank in
unterschiedlichen Formaten. Die gibt es als jährliche oder vollständige
Abzüge im XML-basierten CVRF-Format, oder als vollständige Abzüge in den
Formaten XML, HTML, Text und CSV.
Ansonsten ist zu beachten, daß es immer nur entweder vollständige oder,
im XML-basierten CVRF-Format, auch jährliche Abzüge gibt -- aber, und
das ist der springende Punkt, keine Aktualisierungen (Deltas). Damit
kannst Du auf zwei Lösungswegen umgehen: entweder, Du lädst jeden Tag
die ganzen Daten herunter, bildest lokal selbst das Delta, und spielst
es in Deine bereits erzeugte Datei ein. Oder Du Du erzeugst das Dokument
täglich neu, ohne den Zwischenschritt über die Deltas zu gehen. Bei der
hier in Rede stehenden geringen Datenmenge würde ich zur zweiten Methode
neigen.
Außerdem ist mir unklar, wie Du dort die Einträge für
OpenSource-Software herausfiltern willst. In den Daten gibt es keinen
Marker dafür, in welcher Art von Software die im jeweiligen Datensatz
beschriebene Schwachstelle aufgefunden worden ist. Das würde auch
ziemlich schwierig, denn es gibt keine wirklich trennscharfe, eindeutige
Unterscheidung.
> Die Programmiersprache spielt an sich keine Rolle. XML sollte es nicht> sein, da die Syntax sehr gewöhnungsbedürftig ist. Mit C/C++ und ein> bishen Java bin ich vertraut. Theoretisch würde auch ein Tool reichen,> wo einfach die Daten von der Webseite abgerufen und in eine txt-Datei> abgelegt werden.
XML ist keine Programmiersprache, sondern, vereinfacht gesagt, nur ein
Dokumentenformat. Es gibt eine Transformationssprache für XML namens
XSLT, die ebenfalls auf XML basiert und, ja, wie XML selbst nicht
besonders übersichtlich ist.
Schnelle, typsichere Programmiersprachen wie C, C++ oder Java erscheinen
mir etwas überdimensioniert für Dein Problem. Dein Programm wird ohnehin
den größten Teil seiner Zeit damit verbringen, die Daten herunterzuladen
und ggf. zu entpacken, und die unkomprimierten Dateien haben ja
lediglich überschaubare 80 (CSV) bzw. 150 MB (CVRF). Bei der
eigentlichen Suche ist vermutlich primär der Algorithmus das Aufwändige
-- da holst Du auch mit kompilierten Sprachen bei diesen kleinen
Datenmengen nicht viel heraus.
> Das Ablegen in eine Datei ist ja kein Problem, da es dafür genügend> fstream-Funktionen gibt. Aber erst einmal interessiert mich, wie ich die> Daten vom oben angegebenen Link auf meinem Rechner über ein einfaches> Tool bekomme? Natürlich wäre ein google-spreedsheet was feines. Auch> über Exel wäre sowas denkbar, aber für den Anfang wäre ein einfaches> C/C++ oder Java Programm am sinnvollsten. Oder über eine Skriptsprache> entweder lokal oder auf einem Server. Ich hoffe, dass hier einige> Experten sind, die mir helfen können.>> Am Ende sollten die Datei in einem Dokument auf google-Drive auftauchen> und verschiedenen Statusmeldungen haben, aber davon bin ich noch weit> entfernt.
Naja, die Daten auf den Rechner zu bekommen, ist vermutlich noch die
leichteste Übung. Schwieriger wird es vermutlich, zunächst das Chaos
zwischen Deinen Ohren zu beheben... ;-)
Im Prinzip kannst Du das Problem mit jeder Programmiersprache lösen, die
Frage ist nur, wieviel Aufwand Du in die Sache investieren willst. Zudem
stellt sich auch die Frage, wie Du die Daten speichern willst; mit einer
modernen Skriptsprache wie Python oder Ruby kannst Du die komprimiert
auf die Festplatte schreiben und dann direkt den entkomprimierten
Plaintext aus der komprimierten Datei lesen.
Wie auch immer: Du solltest Dich für eine Programmiersprache entscheiden
-- und zwar idealerweise jetzt -- und dann dabei bleiben. Es nutzt Dir
nichts, die einfachen Teile x-mal in verschiedenen Sprachen zu
implementieren und jedesmal, wenn die erste Schwierigkeit auftritt, zu
einer anderen Sprache zu wechseln. Die schwierigeren Teile -- das Parsen
der Datei(en) und die Suche oder Konvertierung in ein anderes Format --
werden in allen Sprachen ähnlich schwierig und aufwändig sein, in
kompilierten Sprachen tendenziell sogar noch etwas schwieriger und
aufwändiger.
Alex schrieb:> Ich habe jetzt eine Lösung, wo ich mithilfe von Python die csv> herunterlade und anschließend die erste Spalte nach Schlüsselwörtern> durchsuche:>>
result = filter(lambda row: row[0] in {'Test1', 'Test2'}, reader)
Nachteil des "list(reader)" ist, daß der Code die Daten vollständig in
den Arbeitsspeicher lädt. Das macht aus zwei Gründen keinen Spaß:
erstens, weil größere Datenmengen dann sehr viel Speicher verbrauchen,
zweitens, weil man am Ende dann einen riesigen Datenbatzen erhält,
welchen man jetzt irgendwie weiter verarbeiten muß.
IMHO wäre es eleganter und wahrscheinlich schneller (das müßte man mal
messen), etwas zu benutzen wie
1
result = [row for row in reader if row[0] in ('Test1', 'Test2')]
> Nur was ist, wenn ich in row[0] ganze Sätze habe, und nur nach> Schlüsselwörtern suchen möchte und anschließend diese Zeile komplett> ausgeben möchte?
Dann suchst Du halt andersherum, bei großen Datenmengen oder sehr vielen
Suchstrings vielleicht sogar multi-threaded. ;-)
Ich habe mich mit dem Thema auch auseinandergsetzt, da ich die Liste
anhand bestimmter Schlüsselwörter filtern möchte. Ich habe das Ganze
jedoch anders als Alex wie folgt gelöst:
# Dokument z.B. für GoogleDrive verkleinern, indem einfach Zeilen von X-Y (also ältere Meldungen) entfernt werden. Fängt bei Zeile 9 an, da Header unberührt bleiben soll
8
df=df.drop(df.index[9:80000])
9
10
# DataFrame erzeugen, um eine klare Trennung zwischen Header und Data-Zeilen zu gewährleisten.
11
df_header=pd.DataFrame(df.iloc[:9])
12
df_rest=pd.DataFrame(df.iloc[9:])
13
14
# Spalte 0 und 2 nach Suchbegriffen durchsuchen wie z.B. CVE-2017
# Wenn Originaldatei neue Meldungen hat, werden Sie in allitemsnew.csv aktualisiert. Problem: Wenn ich in allitemsnew aber irgendwo eine Änderung mache, wird diese immer überschrieben
Das Ganze funktioniert an sich gut. Mein Problem: Ich möchte das Merging
nur anhand der ersten Spalte "CVE-2017" durchführen oder anhand der
Zeilennummern. Denn es kann ja sein, dass ich die neuen Meldungen aus
Datei1 in Datei2 zwar aktualisieren möchte, aber dadurch Kommentare oder
ähnliches in Datei2 nicht überschrieben werden sollen. Durch den obigen
Code wird nämlich stets die gesammte Zeile aktualisiert, sobald in
irgend einer Zelle eine Änderung auftritt. Eventuell hat jemand einen
eleganteren Vorschlag.
Ziel ist es, Datei1 zu filtern, mit der älteren Datei2 zu vergleichen
und neue Zeilen mit CVE-Meldungen aus Datei1 in Datei 2 zu
aktualisieren. Gleichzeitig soll in Datei2 eine neue Spalte hinzugefügt
werden, die aber nicht geupdatet werden soll, um Kommentare oder Notizen
nicht zu überschreiben.