Arrays miteinander vergleichen und "unterschied" ausgeben
- VB.NET
Sie verwenden einen veralteten Browser (%browser%) mit Sicherheitsschwachstellen und können nicht alle Funktionen dieser Webseite nutzen.
Hier erfahren Sie, wie einfach Sie Ihren Browser aktualisieren können.
Hier erfahren Sie, wie einfach Sie Ihren Browser aktualisieren können.
Es gibt 59 Antworten in diesem Thema. Der letzte Beitrag () ist von ThePlexian.
-
-
-
-
- Das kann so nicht funktionieren, Du müsstest erstmal alle Daten herunterladen und in Dateien schreiben oder zumindest ganz laden und dann irgendwie vergleichen, aber nicht jede Zeile in eine ListBox hinzufügen(?)
- Ist FTP sauunsicher.
- Sicherheit: Gefahrenquelle Quellcode - Du gibst mir mit der Routine in Deinem Code nämlich Zugriff auf Deinen Server -> Kann jeden Scheiß damit anstellen. Sehr schlechte Idee, dafür gibt es HTTP(S) und Webspaces. FTP ist dafür gar nicht geeignet.
- Wenn das ein Updater wird, ist die Herangehensweise schon falsch, da dieser Weg richtig Overhead erzeugt und nicht grade performant ist. Stattdessen müsste man entweder ganze Pakete nutzen oder mit Hashdaten arbeiten. Wird das einer? Dann sollte man das nämlich anders angehen. Zusätzlich Aspekt Nr. 3.
Grüße#define for for(int z=0;z<2;++z)for // Have fun!
Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose!
Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da -
Also der Code funktioniert bei mir prächtig, und er tut auch das was er soll
Zu 2. Ich weiß dass FTP unsicher ist, aber ich habe keine andere Lösung gefunden. Zudem ist für dieses Programm ein extra Benutzer im FTP Server eingetragen, sodass eigentlich nur die Programmdateien gelöscht werden können, mehr nicht
Zu 3. Der Rest im Programm läuft komplett über HTTP
Zu 4. Das wird ein Updater für viele Dateien. Für andere Ansatzweisen dass ganze umzusetzen bin ich gerne offen
-
Es muss alles über HTTP(S) laufen. In Deinem Code hast Du schon mindestens zwei Sicherheitslücken, offen liegende Credentials, RCE und FTP kann man ja auch noch als eine sehen.
Mein Tipp: Plage Dich nicht länger herum und nimm eine Fertiglösung, die das Ganze sicher und performant implementiert.
Updater - Warum sollte man eigene Updater vermeiden?
Es bringt Dir nichts einen Code zu schreiben, der viele Security Leaks aufweist und wahnsinnig unperformant ist und im Ansatz anders sein müsste.
Und Faustregel: Auf Deinem Server hat niemand etwas zu suchen, nie und nimmer, selbst mit extra Benutzer o. ä., denn für alle Inhalte haftest Du und eine Fehlkonfiguration beschert dir Probleme.
...nur Programmdateien gelöscht werden können
Und was ist, wenn diese mit Malware ausgetauscht werden? Tjoa, so einfach ist es dann nicht und wenn ich Dir in den Daten, die Dein Programm betreffen, rumfummeln kann, ist was falsch. Das aktuell da ist eine perfekte Vorlage für eine RCE, man braucht fast gar nichts zu machen, also bitte, ändere das!
Grüße#define for for(int z=0;z<2;++z)for // Have fun!
Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose!
Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum daDieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Trade“ ()
-
-
Lade mit einem PHP Script den Inhalt des Online Verzeichniss aus und Übergebe das an dein Programm. Ich habe das gelöst das mein Script den Dateinamen und einen md5 Hash ausgibt. Denn den Hash zu vergleichen ist etwas schneller.
-
-
Sicherheit darf nie vernachlässigt werden. Wenn das Teil aus irgendeinem Grund doch mal in falsche Hände gerät, dann war's das.
Und wie gesagt, habe schon alles geschrieben, wie man sowas ansetzen kann (Pakete oder mit Hashprüfungen) und trotzdem würde ich was fertiges nutzen, wie gesagt, mit dem Teil haste eine perfekte Vorlage für einen gekaperten Webserver.
Mir ist durchaus bewusst, dass die Bekannten vielleicht nichts böses machen, nur, wie gesagt, wenn das Teil jemand anders ungewollt mal in die Finger bekommt ... wäre mir zu riskant. Zudem ist ein MITM-Angriff darüber immer noch möglich. Nicht nur das, bei FTP kann ich Dir sogar die Credentials abgreifen und fertig.
@Andy Zumindest kein FTP, RCE nach einem MITM-Angriff wäre jedoch nicht ausgeschlossen. Zudem müsste man da btw Verzeichnisstrukturen beachten und das Ganze rekursiv lösen.
Aber am Besten sind immer noch ganze Pakete, auch für Validierungen etc. ist bei denen der Aufwand sehr gering.
Grüße#define for for(int z=0;z<2;++z)for // Have fun!
Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose!
Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da -
-
Hier ist mein Code, aber wenn du php nicht kannst, ist es nicht sinvoll Copy und Paste zu nutzen. Code Lizenz CC- BY
PHP-Quellcode
- <?php
- class UpdateInfo
- {
- public function getUpdateFiles($dir)
- {
- $handle = opendir($dir);
- while($file = readdir($handle))
- {
- if($file != "." && $file != ".." && $file != "UpdateInfo.php")
- {
- if(is_file("$dir/$file"))
- {
- echo str_replace($_SERVER["DOCUMENT_ROOT"]."/Start_Dir", "", $dir)."/".$file.";".md5_file($dir."/".$file)."</br>";
- }
- else if(is_dir("$dir/$file"))
- {
- $this->getUpdateFiles($dir."/".$file);
- }
- }
- }
- closedir($handle);
- }
- }
- $update = new UpdateInfo();
- $update->getUpdateFiles($_SERVER["DOCUMENT_ROOT"]."/Start_Dir");
- ?>
-
Zudem ist ein MITM-Angriff darüber immer noch möglich. Nicht nur das, bei FTP kann ich Dir sogar die Credentials abgreifen und fertig.
Und wenn ich auf dem Server selbst nur Leserechte habe, riskant ist es trotzdem, ein Fehlkonfiguration und das war's. Auf den eigenen FTP sollte nie jemand drauf, außer Du! Dafür gibt es HTTP(S)!
Lies Dir den verlinkten Thread nochmal durch, man sieht, dass Du ihn noch nicht verstanden hast.
Ich meine das alles nicht böse, im Gegenteil, mir liegt das nur am Herzen Dich zu warnen. Es liegt bei Dir, aber wenn Du vernünftig bist, dann höre darauf, ich sage das nicht zum Spaß.
Grüße#define for for(int z=0;z<2;++z)for // Have fun!
Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose!
Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da -
@Trade der Code leist Rekursiv aus. Das die Dateien noch Signiert werden müssen stimmt. Kannst du mit php.net/manual/de/function.openssl-sign.php machen.
Eine Fertige Lösung wäre da am angenehmsten, wie Trades updater
-
ich mache hier was sehr einfaches, nämlich mich schlicht an der Verfahrensfrage, die der TE ursprünglich mal hatte, versuchen. Ich frage also insbesondere nicht danach, mit was für konkreten Gegenständen es im Fall dieses Problems zu tun ist (das ist unnötig), ich beschäftige auch nicht mit Implementierungsfragen bzgl. des angebotenen Lösungsversuchs (danach hat der TE nicht gefragt) und ich missioniere den TE auch nicht mit meinen persönlichen Sicherheitsmanien (das hat sich der TE auch nicht erbeten).
zunächst etwas zum aufwärmen:
zwei Arrays, die verschmolzen werden unter Eliminierung von Mehrfachvorkommnissen, (1, 1) wird also zu (1)
Brainfuck-Quellcode
- Public Sub mtawd()
- 'merge two arrays without doubles
- '
- 'arrays ar1 und ar2 zusammenlegen in ar3
- '---------------------------------------
- Dim ar1() As Variant
- ar1 = Array(1, 2, 3) '2
- Dim ar2() As Variant
- ar2 = Array(1, 9, 3, 4, 5)
- Dim ar3() As Variant
- ReDim ar3(UBound(ar1) + UBound(ar2) + 1)
- Dim e0 As Integer
- For e0 = 0 To UBound(ar1)
- ar3(e0) = ar1(e0)
- Next e0
- For e0 = UBound(ar1) + 1 To UBound(ar3)
- ar3(e0) = ar2(e0 - UBound(ar1) - 1)
- Next e0
- '
- 'mehrfachvorkommnisse von elementen in ar3 entfernen während das ergebnis dieses vorgangs sukzessive in ein neuen array newar() geschrieben wird
- '-----------------------------------------------------------------------------------------------------------------------------------------------
- Dim newar() As Variant
- Dim e1 As Integer
- Dim e2 As Integer
- Dim e3 As Integer
- Dim e4 As Integer
- Dim z1 As Integer
- '(z2 = 0) = es wurde innerhalb e2 keine nicht-identität ar3-newar festgestellt und daher nichts neues aus ar3 in newar gespeichert
- '(z2 = 1) = es wurde innerhalb e2 eine nicht-identität festgestellt und daher speicherung des ar3-elements in newar
- Dim z2 As Integer
- Dim z3 As Integer
- Dim l1 As String
- '
- For e1 = 0 To UBound(ar3)
- z2 = 0
- If (Not newar) = -1 Then
- z1 = 0
- ReDim newar(0)
- newar(z1) = ar3(e1)
- '
- ElseIf Not (Not newar) Then
- For e2 = 0 To UBound(newar)
- z3 = 0
- If ar3(e1) = newar(e2) Then
- 'If z2 <> 0 Then
- ' continue e2
- 'Else
- Exit For
- 'End If
- ElseIf ar3(e1) <> newar(e2) Then
- For e3 = 1 To UBound(newar)
- If ar3(e1) = newar(e3) Then
- z3 = z3 + 1
- End If
- Next e3
- If z3 = 0 Then
- If z2 = 0 Then
- z1 = z1 + 1
- ReDim Preserve newar(z1)
- newar(z1) = ar3(e1)
- z2 = z2 + 1
- Exit For
- End If
- Else
- Exit For
- End If
- End If
- Next e2
- End If
- Next e1
- '
- For e4 = 0 To UBound(newar)
- l1 = l1 & newar(e4) & Chr(13)
- Next e4
- MsgBox (l1)
- '
- End Sub
Man kann jetzt noch eine Eingabebox (am besten gleich für das zusammengelegte Array) basteln, um den code wahllos zu testen, oder man arbeitet zwecks Test mit relevanten Modell-Fällen, bastelt also ein Test-Modell, je stärker das Modell, desto allgemeingültiger der vorgestellte code.
Aufpassen muss man mit der phrase (not >arrayname<) bzw (not (not >arrayname<)), es kann sein, dass diese phrase nicht in jeder vb-version funktioniert, ich habe hier excel 2007 benutzt, ansonsten muss man eben zusehen, wie man anders die Initialisierung eines array feststellt
jetzt zum erfragten differenz-Array:
Quellcode
- Public Sub edar()
- 'extract difference-array
- '
- Dim ar1() As Variant
- ar1 = Array(1, 2, 6)
- Dim ar2() As Variant
- ar2 = Array(1, 2, 3, 4, 5)
- 'ar1 und ar2 in ar3 vereinigen
- Dim ar3() As Variant
- ReDim ar3(UBound(ar1) + UBound(ar2) + 1)
- Dim e0 As Integer
- For e0 = 0 To UBound(ar1)
- ar3(e0) = ar1(e0)
- Next e0
- For e0 = UBound(ar1) + 1 To UBound(ar3)
- ar3(e0) = ar2(e0 - UBound(ar1) - 1)
- Next e0
- Erase ar1
- Erase ar2
- '
- 'difference array, control array, laufvariablen, zähler, schalter
- Dim dar() As Variant
- Dim car() As Variant
- Dim e1 As Integer
- Dim e2 As Integer
- Dim e3 As Integer
- 'z1 längenmass car, wird hochgezählt
- Dim z1 As Integer
- 'z2 übereinstimmung gefunden in einem e2-lauf, wird zurückgesetzt
- Dim z2 As Integer
- 'z3 längenmass dar, wird hochgezählt
- Dim z3 As Integer
- 'Treffer in car, wenn Treffer 1 setzen, bleibt sonst 0, muss zurückgesetzt werden
- Dim s1 As Integer
- 'initialisierungsaktion car wird deklariert (wird gerade initialisiert = 1 setzen, 0 = nicht initialisiert ist ausgangszustand), wird nie auf 0 zurückgesetzt
- Dim s2 As Integer
- '
- Dim l1 As String
- Dim e4 As Integer
- '
- s2 = 0
- s1 = 0
- z3 = 0
- '
- For e1 = 0 To (UBound(ar3) - 1)
- z2 = 0
- s1 = 0
- For e2 = (e1 + 1) To UBound(ar3)
- 'wenn Übereinstimmung gefunden wurde, in car speichern
- If ar3(e1) = ar3(e2) Then
- z2 = z2 + 1
- 'car noch nicht initialisiert
- If (Not car) = -1 Then
- z1 = z1 + 1
- ReDim car(z1 - 1)
- car(z1 - 1) = ar3(e1)
- s2 = s2 + 1
- 'car bereits initialisiert
- ElseIf Not (Not car) Then
- z1 = z1 + 1
- ReDim Preserve car(z1 - 1)
- car(z1 - 1) = ar3(e1)
- End If
- End If
- Next e2
- 'wenn für e1 keine weiteren instanzen im e2-lauf gefunden wurden
- If z2 = 0 Then
- 'wenn car initialisiert ist
- If s2 = 1 Then
- For e3 = 0 To UBound(car)
- If ar3(e1) = car(e3) Then
- s1 = s1 + 1
- End If
- Next e3
- End If
- If (s2 = 0) Or ((s2 = 1) And (s1 = 0)) ThenIf z3 = 0 Then
- If e1 < (UBound(ar3) - 1) Then
- ReDim dar(z3)
- dar(z3) = ar3(e1)
- z3 = z3 + 1
- ElseIf e1 = (UBound(ar3) - 1) Then
- 'beides speichern
- z3 = z3 + 2
- ReDim dar(z3 - 1)
- dar(z3 - 2) = ar3(e1)
- dar(z3 - 1) = ar3(UBound(ar3))
- End If
- Else
- If e1 < (UBound(ar3) - 1) Then
- z3 = z3 + 1
- ReDim Preserve dar(z3 - 1)
- dar(z3 - 1) = ar3(e1)
- ElseIf e1 = (UBound(ar3) - 1) Then
- z3 = z3 + 2
- ReDim Preserve dar(z3 - 1)
- dar(z3 - 2) = ar3(e1)
- dar(z3 - 1) = ar3(UBound(ar3))
- End If
- End If
- End If
- End If
- Next e1
- '
- For e4 = 0 To UBound(dar)
- l1 = l1 & dar(e4) & Chr(13)
- Next e4
- MsgBox (l1)
- '
- End Sub
Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „rx13“ ()
-
aber du programmierst vb6, obwohl der TE seinen Thread als vb.net gelabelt hat
Ein anderes Problem wird sein, dass vermutlich verschiedenerlei Arten von Arrays verglichen werden müssen:
Nämlich die Ausgabe eines FTP-File-Listings besteht aus Strings, aber das lokale Dateisystem hält man besser in einem Array von FileInfos.
-
Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch
Ein guter .NET-Snippetkonverter (der ist verfügbar).
Programmierfragen über PN / Konversation werden ignoriert! -
ErfinderDesRades schrieb:
aber du programmierst vb6, obwohl der TE seinen Thread als vb.net gelabelt hat
Ein anderes Problem wird sein, dass vermutlich verschiedenerlei Arten von Arrays verglichen werden müssen:
Nämlich die Ausgabe eines FTP-File-Listings besteht aus Strings, aber das lokale Dateisystem hält man besser in einem Array von FileInfos.
das sind ja wohl alles keine unüberwindlichen Hürden, er sollte die Struktur einer Lösung auf die von ihm verwendeten Mittel übertragen können, das ist eine ziemlich schlichte Aufgabe
und verschiedene Arten von Arrays vergleichen, ist das jetzt ein Einwand? -
rx13 schrieb:
das ist eine ziemlich schlichte Aufgabe
Zumindest diesen Teil deines Codes auf .Net zu übertragen würde ich von abraten.
ja, das mit den verschiedenen Array-Element-Datentypen ist ein Einwand. Aber nur ganz allgemein, weil im Einzelnen verstehe ich deinen Code nicht, und ist mir auch zu aufwändig, mich da nun einzuarbeiten, v.a., wo der Thread schon fast 3 Wochen alt ist - ich nehme an, der TE hat längst seine eigene Lösung, oder ist vlt. auch ganz davon abgekommen. -
Steht hier bestimmt schon, aber nochmal für @rx13 :
»There's no need to "teach" atheism. It's the natural result of education without indoctrination.« — Ricky Gervais
-
Ähnliche Themen
-
12 Benutzer haben hier geschrieben
- Niklas (17)
- ErfinderDesRades (13)
- Trade (8)
- Fortender (8)
- Plexian (3)
- Andy (3)
- Corby (2)
- Gast (2)
- Thunderbolt (1)
- RodFromGermany (1)
- Eierlein (1)
- EaranMaleasi (1)